Software · Segurança & Identidade
JSON Web Tokens (JWT) em Produção: Assinatura, Rotação e Revogação Segura
Como utilizar tokens JWT em arquiteturas distribuídas sem comprometer a segurança: algoritmos assimétricos, proteção de segredos e estratégias reais de revogação.
Neste artigo
Com a ascensão das arquiteturas de microsserviços, das aplicações de página única (SPAs) e dos aplicativos móveis, os modelos tradicionais de autenticação baseados em sessões com estado mantidas em memória no servidor (stateful sessions com cookies acoplados a instâncias específicas) tornaram-se um entrave para a escalabilidade horizontal. Para permitir que dezenas de instâncias de serviços validassem requisições de forma independente sem consultar um banco de dados central a cada milissegundo, a indústria adotou massivamente o padrão aberto JSON Web Token (JWT - RFC 7519).
No entanto, a aparente simplicidade de emitir e ler um token JWT esconde armadilhas severas de segurança cibernética. Implementações ingênuas expõem sistemas a falsificação de tokens, vazamento de credenciais e a incapacidade estrutural de invalidar sessões comprometidas em tempo hábil.
A Anatomia do Token JWT: Três Peças Fundamentais
Um JWT é uma cadeia de caracteres compacta e segura para URLs dividida em três seções delimitadas por pontos:
| Componente | Conteúdo & Função | Codificação / Proteção |
|---|---|---|
| Cabeçalho (Header) | Algoritmo de assinatura ("alg": "RS256") e tipo do token ("typ": "JWT"). |
Base64Url |
| Carga Útil (Payload) | Afirmações ou claims sobre o usuário e contexto (sub, iss, aud, roles, exp). |
Base64Url (não criptografado) |
| Assinatura (Signature) | Hash criptográfico gerado a partir de [Header + Payload] assinado com chave. |
Hash criptográfico assinado |
O Maior Equívoco: Base64Url Não é Criptografia
Um erro alarmante e recorrente é desenvolvedores acreditarem que os dados contidos no Payload de um JWT estão protegidos contra leitura. O Base64Url é apenas um formato de codificação de texto, e qualquer pessoa ou ferramenta pode decodificar e ler o payload instantaneamente. Nunca armazene senhas, números de cartão de crédito ou dados pessoais confidenciais (PII) sensíveis no corpo de um token JWT.
Algoritmos de Assinatura: Simétricos (HS256) vs Assimétricos (RS256)
A integridade do token repousa inteiramente na robustez do algoritmo utilizado para assinar o cabeçalho e o payload:
flowchart TD
subgraph Simetrico["Modelo Simétrico (HMAC-SHA256 - HS256)"]
direction LR
Auth1["Auth Server<br/>(Chave Secreta)"]
SvcA["Microsserviço A<br/>(Chave Compartilhada)"]
SvcB["Microsserviço B<br/>(Risco: Se comprometido, pode forjar tokens)"]
Auth1 -->|"Chave Secreta"| SvcA
Auth1 -->|"Chave Secreta"| SvcB
end
subgraph Assimetrico["Modelo Assimétrico (RSA/ECDSA - RS256/ES256)"]
direction LR
Auth2["Auth Server<br/>(Chave Privada Segura)"]
JWKS["Endpoint JWKS<br/>(Distribui Chave Pública)"]
SvcC["Microsserviço A<br/>(Apenas Valida)"]
SvcD["Microsserviço B<br/>(Apenas Valida)"]
Auth2 --> JWKS
JWKS -->|"Chave Pública"| SvcC
JWKS -->|"Chave Pública"| SvcD
end
- HMAC com SHA-256 (HS256 - Simétrico): Utiliza um segredo compartilhado único tanto para assinar quanto para verificar o token. É adequado apenas para aplicações monolíticas simples onde o mesmo processo que gera o token é o único responsável por validá-lo. Em uma malha de microsserviços, compartilhar a chave secreta com dezenas de equipes e servidores é um risco inaceitável: o comprometimento de um único microsserviço dá ao invasor a capacidade de emitir tokens falsos com privilégios de administrador em todo o ecossistema.
- RSA / ECDSA (RS256 / ES256 - Assimétrico): O servidor de identidade central assina o token com uma Chave Privada ultraprotegida (armazenada em um Key Vault ou HSM). Todos os microsserviços e gateways consumidores recebem apenas a Chave Pública correspondente, exposta comumente via um endpoint padronizado de JSON Web Key Sets (JWKS) (
/.well-known/jwks.json). Os microsserviços conseguem atestar matematicamente a autenticidade do token sem jamais terem acesso à capacidade de emitir novos tokens.
O Dilema da Revogação em Arquiteturas Stateless
A grande vantagem teórica do JWT é ser autônomo (stateless): uma vez emitido, qualquer serviço pode aceitá-lo sem consultar uma base de dados central. No entanto, essa virtude cria um pesadelo operacional: como revogar um token válido se o usuário alterar a senha, for demitido da empresa ou tiver seu dispositivo roubado?
Em arquiteturas de segurança corporativa, esse paradoxo é resolvido através da Estratégia de Token Duplo:
sequenceDiagram
autonumber
actor Cliente as Cliente (SPA / Mobile)
participant APIs as Microsserviços / APIs
participant Auth as Auth Server (Identidade)
Cliente->>APIs: 1. Requisição com Access Token (Expiração: 5 a 15 min)
Note over APIs: Validação de assinatura em memória (stateless)
APIs-->>Cliente: Resposta com dados protegidos
Note over Cliente: Access Token expira
Cliente->>Auth: 2. Requisição de renovação com Refresh Token (Vida longa)
Note over Auth: Valida sessão no Redis/Banco e aplica rotação
Auth-->>Cliente: 3. Novo par emitido (Access Token + Refresh Token rotacionado)
- Access Token de Vida Curta: Possui validade efêmera (geralmente entre 5 e 15 minutos). Ele viaja nos cabeçalhos
Authorization: Bearer <token>de todas as requisições de API e é verificado de forma stateless em memória pelos microsserviços. Se um token for capturado, a janela de exposição é mínima. - Refresh Token Seguro: Mantido em armazenamento protegido (como um cookie seguro
HttpOnly,Secure,SameSite=Strictno navegador) e registrado em uma base central rápida (como Redis ou PostgreSQL). Quando o Access Token expira, o cliente envia o Refresh Token para o servidor de identidade. O servidor valida se a sessão do usuário ainda é legítima, revoga o Refresh Token antigo e emite um novo par de tokens (Refresh Token Rotation). - Detecção de Reuso de Refresh Token: Se um Refresh Token que já foi utilizado tentar ser apresentado novamente, o servidor assume imediatamente que houve roubo de credenciais e revoga sumariamente todas as sessões e tokens emitidos para aquela identidade.
- Lista Negra de Emergência (JTI Blacklisting): Para cancelamentos imediatos antes do término dos 15 minutos do Access Token (como encerramento forçado de sessão por suspeita de fraude), o identificador único do token (
jticlaim) é publicado em um cache distribuído em memória com TTL sincronizado ao tempo restante de vida do token.
Boas Práticas para Governança e Segurança de Tokens JWT
Em arquiteturas corporativas, a engenharia de segurança adota diretrizes estritas para emissão e validação de tokens JWT:
- Obrigação de Assinatura Assimétrica (RS256/ES256): Todos os nossos serviços de autenticação operam exclusivamente com pares de chaves assimétricas, expondo chaves públicas através de rotação periódica e automatizada de JWKS.
- Validação Rigorosa de Claims: Bloqueamos tokens que omitam as claims fundamentais: emissor esperado (
iss), audiência alvo (aud) e data estrita de expiração (expcom tolerância de clock skew de no máximo 30 segundos). A diretiva"alg": "none"é sumariamente rejeitada pelos nossos validadores. - Privilégio Mínimo nas Claims: O payload carrega apenas o identificador da identidade (
sub), escopos de permissão necessários e o identificador do tenant, evitando o acúmulo de dados volumosos que degradam a largura de banda da rede.