Um JWT (JSON Web Token) aparece em quase todas as APIs modernas: no cabeçalho Authorization: Bearer ..., em cookies de sessão ou em tokens de terceiros (OAuth, SSO). E, ainda assim, muita gente nunca olhou para o que está lá dentro.
As três partes
Um JWT são três blocos em Base64URL separados por pontos: header.payload.signature.
- Header — o algoritmo de assinatura (
HS256,RS256...) e o tipo de token. - Payload — os claims: dados como
sub(sujeito),exp(expiração),iat(emitido em) e qualquer campo personalizado que o backend adicione. - Signature — o hash que garante que o header e o payload não foram alterados desde a assinatura.
Cola-o no descodificador de JWT e verás o header e o payload já convertidos em JSON legível, com a data de expiração transformada em algo humano em vez de um timestamp Unix em bruto.
Descodificar não é verificar
É isto que mais confunde: qualquer pessoa pode descodificar um JWT, porque o header e o payload estão apenas codificados em Base64URL, não cifrados. Abri-los não exige a chave secreta.
O que exige a chave (ou a chave pública, em RS256) é verificar a assinatura — confirmar que o token não foi alterado e que foi mesmo emitido por quem diz tê-lo emitido. Um descodificador online mostra-te o conteúdo, mas nunca deves confiar num JWT alheio sem que o teu backend verifique primeiro a assinatura.
Porque expira
O claim exp é uma data de expiração em segundos desde a epoch Unix. Se a tua sessão "termina sozinha" de vez em quando, é quase sempre por isto: o token expirou e o cliente não o renovou a tempo. Compara com o conversor de timestamp Unix se precisares de fazer as contas à mão.
Quando desconfiar de um token
- Se o
algdo header fornone— significa que o emissor não está a assinar nada, uma vulnerabilidade clássica se o backend não a rejeitar explicitamente. - Se não houver
exp— o token nunca expira, o que raramente é intencional. - Se o payload contiver dados sensíveis em texto simples (palavras-passe, cartões) — um JWT não é um contentor cifrado, não deve levar nada que não possa ser visto.
Em resumo: usa o descodificador para depurar e entender, mas a validação real de um JWT passa sempre pelo teu servidor.

