O que é JWT (JSON Web Token)?
JWT (JSON Web Token) é um padrão aberto (RFC 7519) que define uma forma compacta e autocontida para transmitir informações de forma segura como um objeto JSON. Essa informação pode ser verificada e confiável porque é assinada digitalmente. Os JWTs podem ser assinados usando um algoritmo secreto (com o algoritmo HMAC) ou usando um par de chaves pública/privada usando RSA ou ECDSA.
Estrutura de um JWT
Um JWT consiste em três partes separadas por pontos (.
):
- Header: Contém informações sobre o tipo do token (JWT) e o algoritmo de assinatura utilizado (ex: HMAC SHA256 ou RSA).
- Payload: Contém as “claims”, que são declarações sobre a entidade (geralmente o usuário) e dados adicionais. Existem claims registrados (como
iss
– issuer,exp
– expiration time,sub
– subject,aud
– audience), claims públicos (definidos pela IANA JSON Web Token Registry) e claims privados (definidos pelas partes envolvidas). - Signature: Criada pegando o header codificado, o payload codificado, uma chave secreta ou chave privada, o algoritmo especificado no header e assinando-o. A assinatura é usada para verificar se a mensagem não foi alterada durante o trânsito e, no caso de tokens assinados com uma chave privada, também pode verificar se o remetente do JWT é quem ele diz ser.
Cada parte é codificada em Base64Url.
Como o JWT Funciona em Autenticação?
Em autenticação, quando um usuário faz login com sucesso, um JWT é gerado e retornado ao cliente. O cliente armazena esse JWT (geralmente em cookies ou no armazenamento local) e o inclui em cada requisição subsequente ao servidor, geralmente no cabeçalho Authorization
usando o esquema Bearer
. O servidor, então, verifica a assinatura do JWT para garantir sua autenticidade e extrai as informações do payload para identificar o usuário e suas permissões. Esse processo elimina a necessidade de manter sessões no servidor, tornando a autenticação mais escalável e eficiente.
Vantagens do Uso de JWT em Autenticação
- Simplicidade: Fácil de implementar e entender.
- Escalabilidade: Não requer armazenamento de sessão no servidor.
- Portabilidade: Pode ser usado em diferentes domínios e plataformas.
- Segurança: Assinatura digital garante integridade e autenticidade.
- Desempenho: Tamanho reduzido facilita a transmissão.
Considerações de Segurança ao Usar JWT
Embora JWTs ofereçam muitas vantagens, é crucial considerar as seguintes práticas de segurança:
- Chave Secreta Segura: Mantenha a chave secreta (ou chave privada) segura e rotacione-a periodicamente.
- Validação da Assinatura: Sempre valide a assinatura do JWT no servidor.
- Tempo de Expiração (
exp
): Defina um tempo de expiração razoável para o JWT para limitar o período de validade em caso de comprometimento. - Armazenamento Seguro: Armazene o JWT de forma segura no cliente (evite armazenar em localStorage se possível, prefira cookies HttpOnly com SameSite definido).
- Evite Dados Sensíveis no Payload: Não inclua informações confidenciais no payload do JWT, pois ele é facilmente decodificável (embora não seja possível modificar sem invalidar a assinatura).
- Proteção contra Ataques CSRF: Utilize medidas de proteção contra Cross-Site Request Forgery (CSRF), especialmente se estiver usando cookies para armazenar o JWT.
JWT vs. Sessões Tradicionais
Enquanto as sessões tradicionais armazenam informações sobre o usuário no servidor, os JWTs armazenam as informações no próprio token, que é mantido pelo cliente. Isso torna os JWTs mais adequados para arquiteturas distribuídas e microsserviços, onde o servidor não precisa manter um estado de sessão para cada usuário. No entanto, a revogação de um JWT é mais complexa do que invalidar uma sessão tradicional, pois o token permanece válido até expirar. Estratégias como listas de bloqueio de tokens (blacklist) podem ser implementadas para mitigar esse problema, mas adicionam complexidade ao sistema.
Exemplo de Uso de JWT em um Fluxo de Autenticação
- O usuário fornece suas credenciais (nome de usuário e senha).
- O servidor autentica o usuário.
- Se a autenticação for bem-sucedida, o servidor gera um JWT contendo informações sobre o usuário (ex: ID do usuário, permissões).
- O servidor retorna o JWT ao cliente.
- O cliente armazena o JWT.
- Em requisições subsequentes, o cliente inclui o JWT no cabeçalho
Authorization
. - O servidor recebe a requisição com o JWT, verifica a assinatura e extrai as informações do usuário.
- O servidor autoriza o acesso com base nas informações contidas no JWT.