O JWT (JSON Web Token) tornou-se o padrão mais popular para autenticação stateless em APIs modernas e arquiteturas de microsserviços. Por ser compacto, autossuficiente e fácil de transmitir via cabeçalhos HTTP, ele resolveu o desafio de manter sessões de usuários ativas sem a necessidade de consultar bancos de dados a cada requisição.
Contudo, a facilidade de implementação do JWT frequentemente vem acompanhada de falhas graves de segurança. Muitos desenvolvedores tratam o JWT como um token criptografado (secreto) ou esquecem de validar sua integridade de forma correta. Neste artigo, vamos analisar a anatomia de um JWT, entender como funciona sua assinatura digital e ver as melhores práticas de segurança.
1. A Estrutura de um JWT: Três Partes Separadas por Pontos
Um token JWT completo é composto por três blocos de texto codificados em Base64URL, separados por pontos (.): Header, Payload e Signature.
header.payload.signature
Vamos entender o papel de cada uma dessas três seções:
A. Header (Cabeçalho)
Informa os metadados do token, tipicamente o tipo do token (JWT) e o algoritmo de criptografia ou assinatura que foi utilizado para gerá-lo (como HS256 ou RS256).
{
"alg": "HS256",
"typ": "JWT"
}
B. Payload (Carga Útil)
Contém as informações de identificação do usuário e metadados da sessão, conhecidos como Claims (reivindicações). Existem claims reservadas padrão (como sub para o ID do usuário, exp para expiração e iat para data de criação), além de claims personalizadas que você mesmo pode definir.
{
"sub": "1234567890",
"name": "João da Silva",
"role": "admin",
"exp": 1783776000
}
C. Signature (Assinatura)
Esta é a parte mais importante para a segurança. A assinatura é gerada pegando o Header codificado em Base64, juntando com o Payload codificado em Base64, e aplicando a chave secreta da sua aplicação usando o algoritmo especificado no header. Ela garante que os dados do payload não foram adulterados em trânsito.
2. O Maior Erro com JWT: Confundir Codificação com Criptografia
Por isso, siga sempre estas duas regras fundamentais:
- Nunca guarde dados sensíveis no Payload: Informações confidenciais como senhas, chaves de API, saldos financeiros ou dados pessoais críticos de privacidade não devem ser inseridos no JWT.
- Valide sempre a assinatura no backend: Antes de aceitar qualquer informação do token, o seu servidor deve validar se a assinatura coincide, prevenindo que um invasor altere as claims (como mudar seu role de
userparaadmin).
3. Melhores Práticas para Armazenamento e Uso
Decidir onde armazenar o JWT no frontend é crucial para prevenir ataques comuns da web:
| Local de Armazenamento | Vulnerabilidade a XSS | Vulnerabilidade a CSRF | Recomendação |
|---|---|---|---|
| LocalStorage / SessionStorage | Alta (qualquer script injetado lê o token) | Zero (não enviado automaticamente) | Não recomendado para tokens de longa duração. |
| Cookie (HttpOnly, Secure) | Zero (indisponível para scripts JS) | Alta (enviado de forma automática pelo browser) | Recomendado, desde que utilize a flag SameSite=Strict ou tokens anti-CSRF adicionais. |
Conclusão
O JWT é uma ferramenta fantástica quando compreendida e integrada de forma segura. Utilizando o armazenamento correto sob cookies HttpOnly, limitando o tempo de expiração do token e garantindo que chaves seguras sejam mantidas no servidor, você constrói uma arquitetura de login resiliente e rápida.
Precisa debugar um JWT, ler o payload decodificado ou verificar a validade do tempo de expiração da sua sessão local de forma rápida e segura sem enviar os dados da sua empresa para servidores externos? Utilize o JWT Debugger do DevThru para validar e inspecionar seus tokens localmente no navegador.
🛠️ Experimente na prática
Use nossas ferramentas online gratuitas — sem cadastro, direto no navegador.
