Guia Completo de Segurança JWT: Decodificação, Verificação e Vulnerabilidades Comuns
O Que É JWT?
JWT (JSON Web Token) é um padrão aberto (RFC 7519) para transmitir informações com segurança entre partes. É o esquema de autenticação de API mais popular, amplamente usado por OAuth 2.0 e OpenID Connect.
Estrutura do JWT
Um JWT tem três partes separadas por .:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
│ Header │.│ Payload │.│ Signature │
| Parte | Conteúdo | Codificação |
|---|---|---|
| Header | Algoritmo + tipo | Base64URL |
| Payload | Claims | Base64URL |
| Signature | Assinatura | Algoritmo(Header + Payload, Segredo) |
⚠️ Header e Payload são apenas codificados em Base64URL—não são criptografados. Qualquer pessoa pode decodificá-los e lê-los.
Decodificar JWT com ToolsKu
Passos
- Abra o Decodificador JWT
- Cole a string JWT
- Veja o Header e Payload JSON decodificados
- Verifique expiração, emissor e outros campos
Campos Comuns do Payload
| Campo | Significado | Exemplo |
|---|---|---|
sub |
Sujeito (ID do usuário) | "user_12345" |
iss |
Emissor | "https://auth.example.com" |
aud |
Audiência | "api.example.com" |
exp |
Expiração (segundos Unix) | 1717200000 |
iat |
Emitido em | 1717196400 |
nbf |
Não antes de | 1717196400 |
jti |
ID do JWT (identificador único) | "a1b2c3d4" |
Algoritmos de Assinatura JWT
| Algoritmo | Tipo | Segurança | Caso de Uso |
|---|---|---|---|
| HS256 | Simétrico | Média | Serviço único, APIs internas |
| HS384/HS512 | Simétrico | Média–alta | Requisitos de segurança mais altos |
| RS256 | Assimétrico | Alta | Multi-serviço, OAuth |
| ES256 | Assimétrico | Alta | Mobile, IoT |
| none | Sem assinatura | ❌ Perigoso | Nunca use |
Simétrico vs Assimétrico
HS256 (simétrico):
Assinar: HMAC-SHA256(header.payload, shared_secret)
Verificar: Mesmo shared_secret
Problema: Todos os serviços compartilham um segredo—um vazamento afeta tudo
RS256 (assimétrico):
Assinar: RSA-SHA256(header.payload, private_key)
Verificar: RSA-SHA256(header.payload, public_key)
Vantagem: A chave pública pode ser distribuída; a chave privada fica com o emissor
Vulnerabilidades de Segurança Comuns
1. Ataque alg: none
Um atacante muda o alg do Header para none e remove a Assinatura:
// Header Original
{"alg": "HS256", "typ": "JWT"}
// Modificação do atacante
{"alg": "none", "typ": "JWT"}
Defesa: O servidor deve ter uma lista de permissão de algoritmos permitidos e rejeitar none.
2. Ataque de Confusão de Chaves
Trocar RS256 por HS256 e usar a chave pública como segredo HMAC:
Atacante obtém chave pública → muda alg para HS256 → assina com chave pública → servidor verifica HMAC com chave pública → passa
Defesa: Validar estritamente que o alg do Header corresponde ao esperado.
3. Vazamento de Dados Sensíveis
Como o Payload é apenas codificado em Base64, nunca armazene em JWT:
- ❌ Senhas, números de cartão de crédito
- ❌ Informações pessoais privadas
- ✅ ID do usuário, funções, permissões
4. Expiração Inadequada
// ❌ Sem expiração — token válido para sempre
{"sub": "user_123"}
// ❌ Expiração muito longa — token vazado permanece válido
{"sub": "user_123", "exp": 1893456000} // ano 2030
// ✅ Expiração razoável + fluxo de refresh
{"sub": "user_123", "exp": 1717200000} // 15–60 minutos
Melhores Práticas JWT
1. Access Token de Curta Duração + Refresh Token
Access Token: Expiração de 15–60 minutos, usado para chamadas API
Refresh Token: Expiração de 7–30 dias, usado para obter novos access tokens
2. Local de Armazenamento
| Armazenamento | Risco XSS | Risco CSRF | Recomendado |
|---|---|---|---|
| localStorage | Alto | Baixo | ❌ |
| sessionStorage | Alto | Baixo | ❌ |
| HttpOnly Cookie | Baixo | Alto | ⚠️ Precisa de proteção CSRF |
| Variável em memória | Baixo | Baixo | ✅ Recomendado para SPAs |
3. Lista de Verificação
Ao validar JWT no servidor, sempre verifique:
- A assinatura é válida
-
expnão expirou -
nbfestá em vigor -
issé o emissor esperado -
audinclui o serviço atual -
algestá na lista de permissão
Depuração de Problemas JWT
- Decodificar JWT: Use o Decodificador JWT para inspecionar Header e Payload
- Verificar exp: O token expirou?
- Verificar alg: O algoritmo de assinatura corresponde ao esperado?
- Verificar iss/aud: O emissor e a audiência estão corretos?
- Verificar assinatura: Use o Gerador JWT para reassinar com o mesmo segredo e comparar
- Verificar transporte: O header Authorization é
Bearer <token>?
Ferramentas Relacionadas
- Decodificador JWT — Analisar Header e Payload
- Gerador JWT — Criar JWTs personalizados para testes
- Calculadora HMAC — Entender a assinatura HMAC
- Codificação/Decodificação Base64 — Codificação usada pelo JWT
Resumo
JWT é uma pedra angular da autenticação API moderna, mas a codificação Base64 (não criptografia) cria desafios de segurança únicos. Compreender a estrutura, assinatura e vulnerabilidades comuns é essencial para desenvolvedores full-stack. O decodificador JWT do ToolsKu ajuda você a depurar autenticação rapidamente—mas lembre-se: decodificar não é verificar; sempre valide assinaturas no servidor em produção.