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.

Diagrama de segurança de JSON Web Token ilustrando assinatura criptográfica chaves assimétricas JWKS e fluxo de rotação de refresh token
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
  1. 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.
  2. 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)
  1. 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.
  2. Refresh Token Seguro: Mantido em armazenamento protegido (como um cookie seguro HttpOnly, Secure, SameSite=Strict no 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).
  3. 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.
  4. 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 (jti claim) é 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:

  1. 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.
  2. 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 (exp com tolerância de clock skew de no máximo 30 segundos). A diretiva "alg": "none" é sumariamente rejeitada pelos nossos validadores.
  3. 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.
Explorar este tema no Grafo de Conhecimento