Tokens JWT: O Que Tem Dentro?
Você já viu eles — aquelas strings longas começando com eyJ que aparecem em headers Authorization, cookies e local storage. JWTs (JSON Web Tokens) estão em todo lugar na autenticação moderna, e entender sua estrutura é essencial para debugar problemas de auth.
Anatomia de um JWT
Um JWT tem três partes separadas por pontos:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
|___________ header ___________|.|_____________ payload ______________|.|_________ signature __________|Cada parte é JSON codificado em Base64url (não criptografado — qualquer pessoa pode ler).
O Header
{
"alg": "HS256",
"typ": "JWT"
}Diz qual algoritmo de assinatura. Valores comuns:
HS256— HMAC com SHA-256 (simétrico, usa um segredo compartilhado)RS256— RSA com SHA-256 (assimétrico, usa par de chaves pública/privada)ES256— ECDSA com curva P-256 (assimétrico, chaves menores)none— PERIGO: sem assinatura. Nunca aceite isso em produção.
O Payload (Claims)
{
"sub": "user-123",
"name": "Alice",
"email": "alice@example.com",
"role": "admin",
"iat": 1716239022,
"exp": 1716242622,
"iss": "auth.myapp.com"
}Claims padrão:
| Claim | Significado |
|---|---|
sub | Subject (ID do usuário) |
iat | Issued At (timestamp Unix) |
exp | Expiration (timestamp Unix) |
iss | Issuer (quem criou o token) |
aud | Audience (destinatário pretendido) |
nbf | Not Before (válido após este momento) |
Você pode adicionar qualquer claim customizado — só não coloque dados sensíveis, porque o payload é legível por qualquer pessoa que tenha o token.
A Assinatura
Isso é o que torna JWTs à prova de adulteração:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)Se alguém modificar o header ou payload, a assinatura não vai bater. O servidor rejeita o token. Mas a assinatura só prova integridade — não esconde o conteúdo.
Cenários Comuns de Debug
"Token expired": Decodifique o token, verifique o claim exp. Converta o timestamp Unix para data. O relógio do servidor está errado? O tempo de vida do token é muito curto?
"Invalid signature": O token foi assinado com um segredo/chave diferente do que seu servidor espera. Comum em setups multi-ambiente onde staging e produção usam segredos diferentes.
"Token malformed": O token não tem três partes separadas por ponto, ou a decodificação Base64 falha. Frequentemente causado por truncamento ao copiar tokens.
Considerações de Segurança
- Não armazene dados sensíveis no payload. É codificado em Base64, não criptografado. Qualquer pessoa com o token pode ler os claims.
- Sempre verifique a assinatura no servidor. Nunca confie em um JWT sem verificação.
- Defina tempos de expiração razoáveis. Access tokens de curta duração (15-60 min) + refresh tokens de longa duração é o padrão.
- Use HTTPS. JWTs em trânsito podem ser interceptados em conexões não criptografadas.
JWT em Código
// Node.js — verificar um token
import jwt from 'jsonwebtoken';
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
console.log(decoded.sub); // ID do usuário
} catch (err) {
if (err.name === 'TokenExpiredError') {
// tratar refresh
}
}# Python
import jwt
try:
payload = jwt.decode(token, SECRET, algorithms=['HS256'])
print(payload['sub'])
except jwt.ExpiredSignatureError:
# tratar refresh
passDecodifique seu token agora: Decodificador JWT — cole qualquer JWT, veja o header, payload e expiração instantaneamente. Nenhum dado é enviado para servidores.