Segurança · 3 min de leitura ·

O que tem dentro de um JWT, e por que decodificar não é verificar

Um JSON Web Token parece uma sequência aleatória, mas qualquer pessoa consegue lê-lo. O que há nas três partes e o erro que abre brechas de segurança.

Um JWT (JSON Web Token) é a string longa que mantém você conectado em muitos apps web e APIs. Ele parece criptografado, mas na maioria dos casos não é: quem tem o token consegue ler o que está dentro.

Três partes separadas por pontos

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0MiJ9.3q2-7w…
└ header ──────────┘ └ payload ───────┘ └ signature

O header diz como o token é assinado, por exemplo HS256 ou RS256. O payload guarda as claims: quem é o usuário (sub), quando o token foi emitido (iat) e quando expira (exp), além do que o app acrescentar, como perfis de acesso. Os dois são JSON codificado em base64url, que é uma codificação, não criptografia.

O que importa é a assinatura

A terceira parte é uma assinatura sobre as duas primeiras, feita com um segredo ou uma chave privada. Só um servidor com a chave certa consegue conferi-la. Se alguém muda um único caractere do payload, por exemplo o perfil de user para admin, a assinatura deixa de bater.

Decodificar não é verificar

Um token que decodifica sem erro diz o que afirma, não se é verdade. O seu backend precisa verificar a assinatura com a chave, rejeitar tokens cujo exp já passou e aceitar só os algoritmos esperados, nunca “none”. As bibliotecas de JWT fazem isso por você; pular essa etapa é uma vulnerabilidade clássica.

Regras práticas

Não coloque segredos como senhas no payload, porque ele é legível. Use prazos de expiração curtos. Trate o token como uma senha enquanto ele for válido: quem copiá-lo pode usá-lo até expirar.

Onde guardar um token no navegador

Qualquer script da página consegue ler o que está no localStorage, então uma única falha de cross-site scripting (XSS) pode vazar o token. Um cookie HttpOnly não pode ser lido pelo JavaScript, o que elimina esse risco; combine-o com os atributos Secure e SameSite e com proteção contra falsificação de solicitações entre sites (CSRF). Não existe opção perfeita, mas para tokens de sessão os cookies HttpOnly são o padrão mais seguro.

Expiração e tokens de atualização

Um JWT não pode ser "deslogado" sozinho: ele continua válido até o exp, a menos que o servidor mantenha uma lista de revogação. Por isso os tokens de acesso costumam durar minutos, não dias. Um token de atualização de vida mais longa, guardado com mais cuidado e verificado no servidor, é usado para obter um novo token de acesso quando o antigo expira.

Os claims mais comuns num relance

iss  emissor        quem criou o token
sub  sujeito        o usuário ou cliente a que se refere
aud  público        qual serviço deve aceitá-lo
exp  expiração      horário Unix a partir do qual é inválido
nbf  não antes de   horário Unix antes do qual é inválido
iat  emitido em     horário Unix em que foi criado

Os claims de tempo são timestamps Unix em segundos. O servidor deve verificar aud além de exp: um token válido emitido para um serviço não deve ser aceito por outro.

Lendo um token

O decodificador de JWT da 4Dev separa o token em partes e mostra o header e o payload como JSON legível. Ele só decodifica e não confere a assinatura. O token é enviado ao servidor da 4Dev para ser decodificado e não é registrado nem guardado, mas evite colar tokens reais de produção e revogue qualquer token que você ache que vazou.

Abrir o decodificador de JWT

LinkedInXFacebook