JWT explicado: como funcionam os tokens da Web JSON
JSON Web Tokens (JWTs) estão em toda parte na autenticação web moderna — faça login em praticamente qualquer aplicativo e provavelmente um JWT estará envolvido. No entanto, eles são amplamente mal compreendidos e esse mal-entendido leva a erros reais de segurança. Veja como eles realmente funcionam, em termos simples.
O que é um JWT
Um JWT é um token compacto e independente que carrega informações ("declarações") sobre um usuário ou sessão. Depois de fazer login, um servidor emite um JWT; você o envia de volta com cada solicitação e o servidor confia nele porque está assinado criptograficamente. É uma forma de provar que "estou autenticado" sem que o servidor armazene o estado da sessão.
As três partes
Um JWT consiste em três seções codificadas em Base64URL separadas por pontos: header.payload.signature.
- Cabeçalho — o tipo de token e algoritmo de assinatura.
- Carga útil — as declarações: ID do usuário, funções, prazo de validade e assim por diante.
- Assinatura — um selo criptográfico que prova que o token não foi adulterado.
Cole qualquer token em nosso decodificador JWT para ver essas partes dispostas. O padrão é definido em RFC 7519.
A advertência crucial de segurança
Este é o erro que as pessoas cometem: o cabeçalho e a carga útil são apenas codificados em Base64, não criptografados. Qualquer pessoa que intercepte um JWT pode decodificar e ler a carga instantaneamente. Portanto, nunca coloque segredos – senhas, dados pessoais confidenciais – em uma carga JWT. A assinatura evita adulteração, e não leitura. (Consulte nosso guia sobre por que Base64 não é segurança.)
Como a assinatura protege você
O servidor assina o token com uma chave secreta. Se alguém alterar a carga útil, a assinatura não corresponderá mais e o servidor a rejeitará. É isso que permite ao servidor confiar em um token que não armazenou – ele pode verificar a autenticidade matematicamente.
A expiração é importante
Como os JWTs são independentes, você não pode "revogar" facilmente um antes que ele expire. É por isso que tokens bem projetados incluem uma expiração curta (a declaração exp) e os aplicativos usam tokens de atualização para emitir novos. JWTs de longa duração são um risco à segurança.
Algoritmos de assinatura: HMAC vs RSA
O cabeçalho indica como um token é assinado e há duas famílias comuns. HMAC (por exemplo, HS256) usa um único segredo compartilhado para assinar e verificar – simples, mas cada parte que verifica deve manter o segredo. RSA/ECDSA (por exemplo, RS256) usa uma chave privada para assinar e uma chave pública separada para verificar, para que você possa permitir que muitos serviços verifiquem tokens sem nunca compartilhar o segredo de assinatura. Para sistemas distribuídos, a assinatura assimétrica é geralmente a escolha mais segura; para um único back-end, HMAC é adequado.
Onde armazenar um JWT no navegador
Uma questão prática de segurança: onde fica o token no lado do cliente? localStorage é conveniente, mas legível por qualquer JavaScript, o que o torna vulnerável a ataques XSS que roubam o token. Um cookie HttpOnly não pode ser lido por JavaScript, atenuando o XSS, mas precisa de proteção CSRF. Não há uma resposta perfeita – é uma troca – mas armazenar tokens confidenciais em localStorage simples em um site com qualquer risco de XSS é uma arma conhecida que vale a pena evitar.
A vulnerabilidade "alg: none"
Uma armadilha famosa do JWT: algumas bibliotecas historicamente aceitavam tokens com o algoritmo definido como "none", o que significa nenhuma assinatura — permitindo que invasores falsificassem qualquer carga que quisessem. A lição é sempre verificar a assinatura com um algoritmo explícito e esperado e nunca confiar no algoritmo que o próprio token declara. Use uma biblioteca bem mantida, fixe o algoritmo e um JWT permanecerá uma credencial robusta e à prova de falsificação.
Resultado
Um JWT é um token independente e assinado de três partes Base64URL: cabeçalho, carga útil e assinatura. A assinatura garante a integridade, mas a carga útil pode ser lida por qualquer pessoa. Portanto, mantenha segredos dela, defina prazos curtos e decodifique os tokens com uma ferramenta quando precisar inspecioná-los.