JWT (JSON Web Token) e o padrao mais usado para autenticacao em APIs modernas. Se voce trabalha com desenvolvimento web, mobile ou APIs, vai encontrar JWT em algum momento. Saber decodificar e entender o token e essencial para debugar e depurar problemas.
O que e JWT?
JWT e um token compacto e seguro que transmite informacoes entre partes como JSON. Ele e usado para:
- autenticacao (login);
- autorizacao (permissoes);
- troca de informacoes entre servicos.
Estrutura de um JWT:
header.payload.signature
Cada parte e codificada em Base64url, separada por pontos.
Header
O header indica o algoritmo e o tipo de token:
{
"alg": "HS256",
"typ": "JWT"
}
Algoritmos comuns: HS256 (HMAC), RS256 (RSA), ES256 (ECDSA).
Payload
O payload contem as "claims" (afirmacoes sobre o usuario):
{
"sub": "1234567890",
"name": "Joao Silva",
"iat": 1719340800,
"exp": 1719344400,
"role": "admin"
}
Claims comuns:
| Claim | Significado |
|---|---|
sub | Sujeito (ID do usuario) |
iss | Emissor (quem gerou) |
aud | Audiencia (para quem e) |
exp | Expiracao (timestamp) |
iat | Emitido em (timestamp) |
nbf | Nao valido antes de |
jti | ID unico do token |
Claims customizadas podem ter qualquer nome: role, email, permissions, etc.
Signature
A assinatura garante que o token nao foi adulterado. Calculada assim:
HMACSHA256(base64(header) + "." + base64(payload), secret)
Se alguem alterar o header ou payload, a assinatura nao bate e o token e rejeitado.
Como decodificar JWT online
- Acesse o JWT Decoder;
- Cole o token JWT;
- Veja o header, payload e assinatura decodificados;
- Confira as claims e a data de expiracao.
O decodificador mostra o conteudo legivel, mas nao valida a assinatura sem a chave secreta.
Validacao da assinatura
Decodificar e diferente de validar:
- Decodificar: mostra o conteudo (qualquer um pode fazer);
- Validar: verifica se a assinatura e legitima (precisa da chave secreta ou chave publica).
Para validar em producao, use bibliotecas proprias:
JavaScript (jsonwebtoken)
const jwt = require('jsonwebtoken');
const decoded = jwt.verify(token, 'secret-key');
Python (PyJWT)
import jwt
decoded = jwt.decode(token, 'secret-key', algorithms=['HS256'])
Java (jjwt)
Jwts.parser().setSigningKey(key).parseClaimsJws(token);
JWT no Authorization header
O padrao e enviar o token no header HTTP:
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
O servidor extrai o token, valida e concede acesso.
Seguranca: boas praticas
Nunca coloque dados sensiveis no payload
O payload e codificado, nao criptografado. Qualquer um pode decodificar. Nunca coloque senha, CPF ou dados bancarios.
Use HTTPS
Sem HTTPS, o token pode ser interceptado (man-in-the-middle).
Defina expiracao curta
Tokens sem expiracao sao perigosos. Use exp com tempo curto (15-60 minutos) e refresh tokens para renovar.
Valide todas as claims
exp: verifique se nao expirou;iss: verifique se o emissor e confiavel;aud: verifique se o token e para sua aplicacao.
Use algoritmos seguros
Evite none (sem assinatura). Use RS256 ou ES256 para producao.
JWT vs session cookie
| Aspecto | JWT | Session Cookie |
|---|---|---|
| Armazenamento | Cliente (localStorage, cookie) | Servidor (banco, Redis) |
| Escalabilidade | Stateless (nao precisa de servidor) | Stateful (precisa de store) |
| Revocacao | Dificil (precisa de blacklist) | Facil (deleta sessao) |
| Tamanho | Maior | Menor |
| Uso | APIs, mobile, SPA | Web tradicional |
Erros comuns com JWT
- Token expirado: verifique
expantes de usar; - Assinatura invalida: chave secreta errada ou token adulterado;
- Algoritmo errado: header diz HS256, mas servidor espera RS256;
- Token muito grande: payload com muitas claims causa problemas em cookies;
- Refresh token nao implementado: usuario fica deslogando.
Refresh tokens
JWT de curta duracao (15 min) + refresh token de longa duracao (7 dias):
- Usuario faz login, recebe access token + refresh token;
- Access token expira apos 15 minutos;
- Cliente usa refresh token para obter novo access token;
- Se refresh token expirar, usuario precisa fazer login novamente.
Perguntas frequentes
JWT e seguro? Sim, se usado corretamente (HTTPS, expiracao, validacao). O payload nao e criptografado, entao nao coloque dados sensiveis.
Qual o tamanho maximo de um JWT? Nao ha limite teorico, mas browsers limitam cookies em ~4KB. Para tokens maiores, use localStorage.
Posso revogar um JWT? Dificil. A abordagem comum e usar blacklist ou tokens de curta duracao com refresh.
JWT armazena no cookie ou localStorage? Cookie httpOnly e mais seguro contra XSS. localStorage e mais facil de usar, mas mais vulneravel.
O que acontece se eu alterar o payload? A assinatura fica invalida e o servidor rejeita o token.
Decodifique seus tokens agora no JWT Decoder e entenda o que esta dentro de cada JWT.