Com o avanço das APIs, a superfície de ataque aumentou, exigindo métodos de autenticação mais robustos, e o JWT destaca-se por oferecer segurança e eficiência.
O JSON Web Token permite uma autenticação distribuída, leve e altamente compatível com arquiteturas modernas.
Mais do que simples credenciais, os tokens carregam informações assinadas e verificáveis, reduzindo a necessidade de consultas constantes ao servidor e diminuindo o acoplamento entre serviços.
Neste artigo, exploraremos o que é JWT, como ele funciona e por que se tornou tão adotado na proteção de APIs.
Também abordaremos quais boas práticas são essenciais para evitar vulnerabilidades.
1. O que é autenticação JWT?
JWT (JSON Web Token) é um padrão aberto (RFC 7519) que define um formato compacto e seguro para transmitir informações entre duas partes.
Ele se baseia no uso de claims — declarações sobre o usuário ou a sessão — assinadas digitalmente, garantindo integridade e autenticidade.
Um JWT típico possui três partes codificadas em Base64URL:
- Header → Metadados do token
- Payload → Claims (dados)
- Signature → Assinatura digital
Exemplo:
header.payload.signature
Por ser leve e facilmente serializável, o JWT se tornou a escolha natural para APIs que precisam de velocidade, escalabilidade e autenticação distribuída.
2. Por que APIs precisam da autenticação JWT?
APIs modernas, em sua maioria, são stateless, o que significa que o servidor não mantém o estado da sessão entre as requisições.
Esse modelo oferece vantagens como menor consumo de recursos e maior escalabilidade, mas exige novas formas de identificar e autenticar usuários a cada chamada.
Métodos tradicionais como sessões e cookies têm limitações nesse contexto:
- Difíceis de escalar horizontalmente;
- Dependem do servidor manter estado;
- Não funcionam bem em integrações máquina-a-máquina;
- Complicam arquiteturas distribuídas.
A autenticação JWT surge como solução porque:
- Não exige sessão no servidor;
- Carrega as informações necessárias dentro do próprio token;
- Pode ser verificado em qualquer serviço sem necessidade de centralização;
- É facilmente transportado via HTTP Headers
Essas características tornam o JWT ideal para arquiteturas modernas, incluindo microserviços, gateways, SPAs, aplicações mobile e ambientes em nuvem.
3. Estrutura interna de um JWT e seu papel na segurança
A seguir, analisaremos cada parte e entenderemos como elas contribuem para proteger APIs.
3.1 Header (Cabeçalho)
Contém o tipo do token e o algoritmo de assinatura:
{
"alg": "HS256",
"typ": "JWT"
}
O algoritmo define como a assinatura será criada. Os mais usados:
- HS256 (HMAC + chave secreta)
- RS256 (RSA + chave privada/pública)
- ES256 (ECDSA)
A escolha do algoritmo afeta diretamente o nível de segurança.
3.2 Payload (Claims)
Armazena informações sobre a identidade do usuário e dados da sessão. Há três tipos:
I. Registered Claims (padrão)
Incluem:
- iss – quem emitiu o token
- sub – identificação do usuário
- exp – data de expiração
- iat – data de criação
Esses campos são essenciais para evitar tokens eternos ou reutilização indevida.
II. Public Claims
Podem ser definidas conforme necessidade do sistema:
{
"role": "admin",
"feature_access": ["billing", "analytics"]
}
III. Private Claims
Usadas exclusivamente pela aplicação emissora e consumidora do token.
Importante: os dados do payload não são criptografados, apenas codificados. Ou seja, são legíveis.
3.3 Signature (Assinatura)
A assinatura é o que garante que o token:
- não foi alterado
- vem de uma fonte confiável
Criada da seguinte forma:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
Em algoritmos assinados com RSA/ECDSA, usa-se a chave privada do servidor.
Isso significa que, mesmo se um atacante visualizar o conteúdo do token, ele não poderá gerar outro token válido sem acesso à chave de assinatura.
4. Como funciona a autenticação JWT passo a passo
Abaixo, apresentamos o fluxo básico de funcionamento da autenticação JWT em APIs.
I. Login
O cliente envia credenciais (usuário/senha).
II. Servidor valida e gera o JWT
Se as credenciais forem corretas, o servidor emite um token assinado contendo claims relevantes.
III. Cliente armazena o token
Pode ser guardado em:
- LocalStorage
- SessionStorage
- Cookies (HttpOnly)
- Secure Enclave (mobile)
IV. Cliente envia o token em cada requisição
Usando normalmente o header:
Authorization: Bearer <token>
V. Servidor valida assinatura e expiração
Sem precisar consultar banco de dados — basta verificar:
- Assinatura
- Integridade
- Data de expiração
- Regras de autorização
VI. API responde normalmente
Caso o token seja válido, o acesso é permitido.
5. Como a autenticação JWT protege suas APIs?
A segurança oferecida pelos JWTs não se limita à autenticação.
Confira a seguir as principais formas pelas quais esse modelo de autenticação ajuda a proteger as APIs.
5.1 Integridade garantida pela assinatura digital
Qualquer alteração nos dados invalida o token. Isso impede ataques como:
- Modificação de roles
- Alteração de IDs
- Injeção de permissões
5.2 Expiração controlada e bloqueio de reutilização
Tokens possuem expiração curta, reduzindo o impacto caso sejam comprometidos.
Além disso, o uso dos seguintes mecanismos de revogação de tokens ajuda a mitigar reutilização em caso de roubo:
- jti (ID do token)
- blacklists
- listas de revogação
5.3 Redução da superfície de ataque
Como o servidor não mantém sessões, reduz-se:
- risco de sequestro de sessão
- necessidade de sincronização
- dependência de armazenamento sensível no backend
5.4 Permite autorização granular
Claims permitem transportar:
- perfis de acesso
- escopos (scopes)
- permissões específicas
Isso facilita a implementação de RBAC e ABAC na API.
5.5 Compatibilidade com gateways e microserviços
Tokens podem ser validados localmente por cada serviço, reduzindo latência e eliminando pontos únicos de falha.
6. Riscos e vulnerabilidades comuns ao usar a autenticação JWT
Embora eficiente, a autenticação JWT não é à prova de falhas.
Muitos problemas podem surgir de implementações incorretas.
6.1 Uso incorreto do algoritmo “none”
Assinaturas com "alg": "none" permitem tokens sem assinatura. Nunca habilitar.
6.2 Chaves fracas ou expostas
Usar segredos simples pode permitir que um atacante gere tokens válidos. Exemplos:
secret123
myjwtkey
6.3 Tokens eternos
Falta de expiração é um dos erros mais graves, pois permite uso indefinido mesmo após comprometimento.
6.4 Armazenamento inseguro no cliente
Salvar tokens em LocalStorage facilita:
- cross-site scripting (XSS)
- roubo de tokens
- persistência indevida
Cookies HttpOnly + Secure são preferíveis em muitas aplicações.
6.5 Falhas em logout ou revogação
Como JWT é stateless, revogar acesso exige mecanismos externos, como:
- listas de revogação
- alteração do segredo;
- short-lived tokens + refresh tokens
6.6 Vazamento do token em URLs
Nunca transmitir tokens por URL, por motivos como:
- logs do servidor
- histórico do navegador
- caches intermediários
7. Boas práticas essenciais para uso seguro de autenticação JWT
A seguir, apresentamos um checklist de segurança amplamente adotado.
I. Use tokens de curta duração (exp pequeno): aumenta a segurança em caso de comprometimento.
II. Utilize Refresh Tokens: permitem renovar a sessão sem manter validade longa no access token.
III. Prefira algoritmos assimétricos (RS256/ES256): evita vazamento acidental do segredo compartilhado.
IV. Proteja o token no cliente:
- Cookies HttpOnly
- Secure
- SameSite=Lax/Strict
- Evitar LocalStorage sempre que possível
V. Valide todas as claims, especialmente:
- exp
- iss
- aud
- nbf
VI. Revogação consistente
Usar blacklists, whitelists ou versionamento de tokens.
VII. Não coloque dados sensíveis no payload
Lembrando: JWT não criptografa dados.
8. Considerações finais
A autenticação JWT se tornou um padrão dominante na proteção de APIs porque combina:
- autenticidade garantida por assinatura digital;
- independência de sessões;
- alta performance;
- compatibilidade com qualquer linguagem e plataforma;
- facilidade de integração com microserviços e arquiteturas distribuídas.
Quando bem aplicado, ele fornece um equilíbrio ideal entre segurança, eficiência e simplicidade.
No entanto, é crucial evitar configurações inseguras, validar corretamente as claims e adotar boas práticas de proteção do token.
A segurança das APIs não depende apenas da tecnologia em si, mas da forma como ela é implementada.
E a autenticação JWT, quando usada com atenção, continua sendo um dos recursos mais robustos e versáteis disponíveis para proteger sistemas modernos.