Pare de Usar JWTs

Escopo do debate

  • A maioria dos participantes distingue dois casos de uso principais:
    • Sessões de usuário baseadas no navegador.
    • Tokens de serviço para serviço / backend.
  • Consenso suave geral: JWTs muitas vezes são uma escolha ruim para sessões de navegador, mas podem ser bons ou até ideais para cenários de backend e federação.

JWTs para sessões baseadas no navegador

  • Críticos dizem que JWTs adicionam complexidade em relação a IDs de sessão opacos simples em cookies HttpOnly, sem benefício real se o mesmo servidor emite e valida os tokens.
  • Principais pontos problemáticos levantados:
    • Revogação e logout difíceis/complicados, especialmente logout por dispositivo.
    • Repetibilidade e tokens de longa duração.
    • Tendência de colocar dados sensíveis ou mutáveis dentro dos tokens, criando problemas de invalidação de cache e de segurança.
  • Vários argumentam: se você já precisa de um datastore (para usuários, permissões), basta armazenar o estado da sessão ali e evitar criptografia para sessões.

Propriedades de segurança e armadilhas de implementação

  • Problemas históricos: alg=none, downgrade/confusão de algoritmo, bibliotecas aceitando chaves públicas como segredos HMAC, defaults ruins.
  • Alguns argumentam que esses eram bugs de biblioteca e em grande parte já foram corrigidos; outros dizem que eles vêm de uma especificação que incentiva armadilhas e complexidade.
  • Discordância sobre o quão “inseguro” o JWT é hoje:
    • Um lado: “JWT é bom se você restringir algoritmos e usar boas libs.”
    • Outro lado: “A especificação incentiva uso incorreto; CVEs continuam aparecendo; existem designs mais seguros.”

Revogação, autenticação “stateless” e logout

  • Tensão central: JWTs são vendidos como “stateless”, mas logout seguro e tratamento de comprometimento exigem estado:
    • Listas de revogação / denylists.
    • Carimbos de tempo por usuário de “não válido antes de”.
    • Esquemas de rotação de chaves.
  • Alguns argumentam que, uma vez que você adiciona esse estado, perdeu a principal vantagem em relação às sessões clássicas.
  • Outros respondem que listas de revogação são muito menores do que stores completos de sessão e mais fáceis de replicar globalmente.

Cookies, armazenamento e XSS/CSRF

  • Forte apoio a cookies HttpOnly, Secure, SameSite para sessões de navegador.
  • Muitos alertam contra armazenar JWTs em localStorage devido à exfiltração por XSS; alguns minimizam isso se você “não permite JS não confiável”, outros dizem que isso é irrealista.
  • Observação de que HttpOnly impede o roubo do token, mas não o uso indevido impulsionado por XSS.

Alternativas e ecossistema mais amplo

  • Alternativas mencionadas: tokens opacos aleatórios, cookies assinados, PASETO, macaroons, padrões SAML/OIDC, esquemas customizados.
  • Alguns elogiam os designs de PASETO/macaroon por serem mais resistentes a uso incorreto, mas observam ecossistema e adoção limitados.
  • Vários veem o enquadramento “pare de usar JWTs” como exagerado ou caça-cliques; preferem “use JWTs de forma restrita e cuidadosa.”