Monitor ultrawide exibindo código JavaScript de autenticação JWT, acompanhado de um cadeado físico e uma ampulheta sobre a mesa
Ilustração técnica exibindo código de autenticação JavaScript em um monitor ultrawide, acompanhado de uma ampulheta e um cadeado físico com o logotipo "JWT" em uma mesa de escritório.

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.

continue lendo

Posts relacionados