Erros comuns em JWT que você deve evitar
Guia técnico para validação, gestão de chaves, timing de tokens e práticas seguras no uso de JSON Web Tokens.
1) Falta de validação adequada da assinatura e de claims básicas
JWTs são affidáveis apenas quando a assinatura é verificada com a chave correta e as claims são checadas com rigidez. Erros comuns incluem aceitar tokens sem issuer (iss) ou audience (aud), ou permitir algoritmos inadequados.
- Defina e imponha o algoritmo esperado (ex.: RS256) e evite aceitar o algoritmo ‘none’ ou qualquer configuração não verificada.
- Valide o emissor (iss) e a audiência (aud) para o seu API ou recurso protegido.
- Use a chave pública correta via JWKS e consuma-a com verificação baseada em kid.
- Verifique também o exp, o nbf e o iat apenas quando apropriado para seu fluxo.
Dica prática: prefira bibliotecas que suportem JWKS e validação de claims de forma explícita, evitando validações manuais que podem introduzir falhas.
2) Não tratar expiração, not-before e margem de relógio
Tokens expiram para limitar o tempo de uso. Não validar exp ou ignorar nbf pode abrir brechas. A prática correta envolve uma margem de tolerância (clock skew) para acomodar desajustes entre sistemas.
- Verifique exp no token com o tempo atual do servidor.
- Considere nbf caso tokens sejam emitidos com atraso ou pré-uso.
- Aplicar uma margem de skew (ex.: 60–300 segundos) para evitar falhas por desvio de tempo entre cliente e API.
- Utilize iat como referência apenas se seu fluxo exigir, evitando dependência excessiva.
Observação: tokens de acesso devem ter vida útil curta; combine com refresh tokens para renovação segura.
3) Gestão de chaves, JWKS e rotação
A prática recomendada é manter um JWKS público/constante e rotacionar chaves com frequência, tratando mudanças de kid como sinal de atualização. Evite hardcode de chaves no código.
- Utilize um JWKS endpoint confiável para buscar chaves públicas dinamicamente.
- Cache as chaves com tempo de vida adequado e invalide em caso de rotation através do kid.
- Implemente verificação de emissor/audiência associada à chave correspondente.
// Exemplo de verificação com JWKS usando a biblioteca jose (Node.js, ESM)
import { jwtVerify, createRemoteJWKSet } from 'jose';
const JWKS = createRemoteJWKSet(new URL('https://example.com/.well-known/jwks.json'));
async function verifyToken(token) {
try {
const { payload } = await jwtVerify(token, JWKS, {
issuer: 'https://issuer.example.com',
audience: 'my-api',
algorithms: ['RS256'] // força apenas RS256
});
return payload; // token válido
} catch (err) {
throw new Error('Token inválido');
}
}
Boas práticas: configure cache adequado para JWKS, trate erros de rotação e registre tentativas de token falhas para monitoramento.
4) Armazenamento, cookies seguros e estratégia de revogação
JWTs são frequentemente usados como tokens de acesso; a forma como são armazenados impacta a superfície de ataque. Combine armazenamento seguro, tokenização de curto prazo e fluxo de refresh com revogação controlada.
- Use tokens de acesso com vida útil curta e tokens de refresh para renovação; evite manter tokens de longa duração no cliente.
- Prefira cookies HttpOnly e Secure com SameSite adequado para evitar XSS/CSRF em aplicações web.
- Implemente uma estratégia de revogação ou validação de estado (ex.: listas de revogação, ou checagem de revoca em um datastore) para tokens comprometidos.
- Inclua claims como iss, aud e scope para controle mais granular de permissões.
Observação: JWTs não devem ser usados como único mecanismo de revogação; combine com controles de sessão, rotação de chaves e políticas de segurança de tokens.
Leia também
Explore conteúdos complementares para aprofundar prática e segurança ao trabalhar com JWT e autenticação de APIs.
Sou Apaixonado pela programação e estou trilhando o caminho de ter cada diz mais conhecimento e trazer toda minha experiência vinda do Design para a programação resultando em layouts incríveis e idéias inovadoras! Conecte-se Comigo!