JWT (JSON Web Token) é um padrão aberto (RFC 7519) que define uma maneira compacta e autocontida de transmitir informações com segurança entre as partes. Essas informações podem ser verificadas e confiáveis porque são assinadas digitalmente.
JWT consiste em três partes, separadas por pontos (.): Cabeçalho (Header), Carga útil (Payload) e Assinatura (Signature). O cabeçalho especifica o algoritmo de assinatura, a carga útil contém as declarações e a assinatura é usada para verificar se a mensagem não foi alterada.
Cenários comuns de uso do JWT
Autenticação (o cenário mais comum), troca de informações (JWTs podem transmitir informações com segurança, pois podem ser assinados), autorização (contém informações de permissão do usuário) e implementação de login único.
Tipos de algoritmos de assinatura
JWT suporta vários algoritmos de assinatura, principalmente divididos em duas categorias: algoritmos simétricos baseados em HMAC (como HS256) e algoritmos assimétricos baseados em RSA/ECDSA (como RS256, ES256). Algoritmos simétricos usam a mesma chave para assinar e verificar, algoritmos assimétricos usam uma chave privada para assinar e uma chave pública para verificar.
Não armazene informações sensíveis (como senhas) no JWT, pois a parte da carga útil do JWT é apenas codificada em Base64, não criptografada. Para aplicações que requerem alta segurança, recomenda-se usar tempos de expiração curtos e implementar estratégias de rotação de tokens.
O que fazer quando o JWT expira?
Quando um JWT expira, o servidor rejeitará esse token. A maneira recomendada de lidar com isso é implementar um mecanismo de token de atualização (Refresh Token), onde o cliente usa o token de atualização para obter um novo token de acesso, sem exigir que o usuário faça login novamente. Tokens de atualização geralmente têm um prazo de validade mais longo, mas devem ser armazenados com cuidado.
Estritamente falando, JWTs são projetados para serem tokens sem estado e não podem ser verdadeiramente revogados. Mas existem algumas soluções comuns: manter uma lista negra de tokens revogados (o que pode anular a vantagem de não ter estado do JWT), usar tempos de expiração curtos em conjunto com tokens de atualização, ou incorporar um identificador de versão no token, permitindo que o servidor rejeite versões antigas.
Diferença entre JWT e session?
JWT é um token autocontido que contém todas as informações necessárias, adequado para sistemas distribuídos, não requer armazenamento de estado de sessão no servidor. Session é baseado em armazenamento no lado do servidor, requer manutenção do estado da sessão, mais adequado para arquiteturas de servidor único. JWT é mais amigável para expansão, mas a revogação é complexa; Session é fácil de revogar, mas tem menor escalabilidade.