JWT (JSON Web Token) se tornou o padrão mais popular para autenticação em APIs modernas, principalmente por eliminar a necessidade de manter estado de sessão no servidor. Mas essa mesma característica que o torna popular — ser um token autocontido e verificável sem consulta ao banco — também é a origem da maioria dos erros de segurança que vemos em projetos reais. Neste artigo, explicamos como o JWT funciona e quais práticas realmente importam para manter sua API segura.
Como o JWT funciona, na prática
Um JWT é composto por três partes: header (algoritmo usado), payload (dados do usuário, como ID e permissões) e assinatura (garante que o token não foi alterado). Quando o usuário faz login, o servidor gera o token assinado e o envia ao cliente, que passa a incluí-lo em cada requisição subsequente, geralmente no header Authorization: Bearer. O servidor então valida a assinatura sem precisar consultar o banco de dados para confirmar a sessão — o que torna o processo rápido, mas exige cuidado redobrado, já que qualquer token válido é aceito até sua expiração.
1. Defina tempos de expiração curtos
Um erro comum é configurar tokens com validade de dias ou semanas "por comodidade". Como o JWT não pode ser invalidado individualmente sem infraestrutura adicional, um token roubado continua válido até expirar. A prática recomendada é usar access tokens de curta duração (minutos a poucas horas) combinados com refresh tokens de validade maior, armazenados de forma mais protegida, usados apenas para gerar novos access tokens.
// Exemplo de geração de token com expiração curta (Node.js)
const token = jwt.sign(
{ userId: user.id, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: '15m' }
);
2. Nunca armazene dados sensíveis no payload
O payload de um JWT é apenas codificado em Base64, não criptografado — qualquer pessoa pode decodificá-lo e ler seu conteúdo, mesmo sem a chave secreta. Senhas, dados de cartão de crédito ou qualquer informação sensível jamais devem estar no payload. O token deve conter apenas o mínimo necessário para identificação e autorização, como ID do usuário e papel/permissões.
Um JWT não é um cofre — é um envelope lacrado que qualquer um pode abrir e ler, mas não pode adulterar sem invalidar o lacre.
3. Armazenamento seguro no cliente
Guardar o token em localStorage é uma prática comum, mas expõe o token a ataques de XSS (Cross-Site Scripting), já que qualquer script malicioso injetado na página pode acessá-lo. Uma alternativa mais segura é armazenar o token em cookies com as flags HttpOnly, Secure e SameSite, o que impede acesso via JavaScript e reduz a superfície de ataque, embora exija cuidados adicionais contra CSRF.
4. Sempre valide o algoritmo de assinatura
Um ataque conhecido explora APIs que aceitam qualquer algoritmo informado no header do token, incluindo none (sem assinatura). A validação no backend deve especificar explicitamente qual algoritmo é aceito (ex: HS256 ou RS256) e rejeitar qualquer token que tente usar um algoritmo diferente do configurado.
5. Tenha uma estratégia de revogação
Como o JWT é autocontido, revogar um token antes da expiração natural exige planejamento — seja mantendo uma lista de tokens invalidados (blacklist) em cache, seja versionando os tokens por usuário de forma que uma mudança de senha invalide automaticamente tokens antigos. Sem essa estratégia, cenários como "usuário demitido" ou "conta comprometida" ficam sem resposta imediata possível.
6. Use HTTPS sempre, sem exceção
Por mais robusta que seja a implementação do JWT, transmitir tokens sobre HTTP sem criptografia expõe tudo a interceptação por qualquer pessoa na mesma rede. HTTPS não é opcional em nenhuma aplicação que lida com autenticação — é o requisito mínimo para que qualquer outra medida de segurança faça sentido.
Considerações finais
JWT é uma ferramenta poderosa quando usada com as práticas corretas: expiração curta, refresh tokens, armazenamento seguro, validação estrita de algoritmo e uma estratégia clara de revogação. Negligenciar qualquer um desses pontos transforma uma solução moderna de autenticação em uma porta aberta para incidentes de segurança. Se sua aplicação precisa de uma revisão de segurança na camada de autenticação, a equipe da ASL Software Engineering pode ajudar a identificar e corrigir vulnerabilidades. Fale com a gente.