Autenticação (Sessão vs JWT)

Autenticação (Sessão vs JWT)

Explicado da forma mais simples possível… mas não mais simples.

Stephane Moreau | Substack)

Autenticação vs Autorização

Autenticação e Autorização resolvem duas questões fundamentais de segurança em qualquer sistema:

  • Autenticação: “Quem você é?” – Provar e verificar a identidade do usuário
  • Autorização: “O que você tem permissão para fazer?” – Determinar permissões e direitos de acesso

Depois que um usuário faz login uma vez, o sistema precisa de uma forma de “lembrar” dele em múltiplas requisições sem pedir as credenciais repetidamente. Existem duas abordagens fundamentalmente diferentes para manter o estado de login:

  • Autenticação baseada em sessão
  • Autenticação baseada em JWT

Autenticação Baseada em Sessão

550x278.7671232876712

Característica principal: O servidor armazena o estado da sessão, tornando-a stateful (com estado). O ID da sessão é apenas uma chave de referência.

Componentes:

  • Cookie: Contém o ID da sessão (string pequena e opaca)
  • Armazenamento de Sessão: Armazenamento centralizado (Redis, banco de dados, Memcached)
  • Dados da Sessão: ID do usuário, expiração, metadados armazenados do lado do servidor

Autenticação Baseada em JWT

550x390.7894736842105

Característica principal: Sem armazenamento do lado do servidor, tornando-a stateless (sem estado). Todos os dados estão no próprio token.

Estrutura do JWT (três partes separadas por pontos):

header.payload.signature

Exemplo:
eyJhbGc...  .  eyJ1c2Vy...  .  SflKxwRJ...
[algoritmo]    [dados do usuário]     [assinatura]

Algoritmos de Assinatura:

  • HMAC (HS256): Simétrico – mesma chave para assinar e verificar (mais simples, mais rápido)
  • RSA/ECDSA: Assimétrico – chave privada assina, chave pública verifica (mais seguro em sistemas distribuídos)

Padrão de Atualização de Token (Melhor prática para JWT)

Token de Acesso (curto prazo: 15 min) ────┐
                                       ├──▶ Requisições regulares à API
Token de Atualização (longo prazo: 7 dias) ────┘
         │
         └──▶ Enviado apenas ao endpoint /refresh quando o token de acesso expira

Trade-offs

550x176.40796703296704