Por que JWTs não são ideais para gerenciamento de sessões, e o que usar no lugar
Aprofundamento CEVIU
Aprofundamento
O problema com JWTs em sessões não é só que eles são mal configurados, é que a especificação foi projetada para um cenário diferente: troca de identidade entre serviços, não para manter um usuário logado no navegador por horas ou dias. Tokens com expiração de 5 minutos exigem refresh constante, e tokens longos viram armas contra você se roubados. A revogação segura exige estado mesmo assim: bancos de dados, Redis ou caches confiáveis. Ou seja, você paga o preço da complexidade do JWT sem ganhar o benefício da ausência de estado.
Isso bate de frente com o que já discutimos sobre Passkeys: autenticação forte no login não protege a sessão depois. E o que vimos em MFA também se aplica aqui, a segurança se desloca para o ciclo de vida da sessão, não só para o momento do login. Um token JWT roubado com 24h de validade é tão perigoso quanto uma cookie de sessão roubada sem HttpOnly. Só que a cookie pode ser invalidada imediatamente no servidor; o JWT, não.
O que mudou
A cobertura anterior tratava de riscos *após* a autenticação (MFA, Passkeys, timeouts), mas não questionava o próprio mecanismo de persistência da sessão. Agora, há um posicionamento técnico claro e unificado: o uso de JWTs para sessões não é um erro de implementação, é um erro de arquitetura. O que era debate em fóruns virou consenso operacional em 2026, com frameworks como Express passando a documentar explicitamente o uso de express-session + store robusto como padrão recomendado, não como alternativa.
Por que isso importa
Porque sua aplicação está mais vulnerável do que você imagina, não por causa de um bug, mas por ter adotado um padrão que não resolve o problema que precisa resolver. Se você usa JWTs para sessões, está assumindo riscos estruturais: impossibilidade de logout global, dificuldade de ajuste granular de tempo de inatividade (como exigido por acessibilidade) e exposição prolongada a ataques de XSS quando combinado com localStorage. Isso afeta diretamente DX: desenvolvedores gastam tempo construindo camadas frágeis de blacklist e refresh, em vez de focar em lógica de negócio. E afeta segurança real: um único token comprometido pode valer mais do que mil senhas.
Linha do tempo
CEVIU publica análise sobre impacto de timeouts de sessão na acessibilidade
CEVIU destaca que Passkeys não protegem a sessão da aplicação após o login
CEVIU mostra que MFA perde eficácia após a sessão estar ativa
CEVIU conclui que JWTs não devem ser usados para gerenciamento de sessões, reforçando a necessidade de estado controlado
Perguntas frequentes
Se JWTs são ruins para sessões, posso usá-los em APIs REST ou microsserviços?
Sim, esse é um caso válido. JWTs funcionam bem como tokens de acesso entre serviços confiáveis, desde que tenham curta duração, sejam assinados com chaves fortes e nunca armazenados no navegador. Mas evite usar o mesmo token tanto para API quanto para sessão web.
Qual é a diferença prática entre uma sessão com cookie e uma com JWT armazenado em localStorage?
Cookies com HttpOnly bloqueiam acesso via JavaScript, impedindo roubo por XSS. localStorage é acessível por qualquer script, incluindo um payload malicioso injetado. Além disso, cookies permitem controle centralizado de expiração e revogação; localStorage não.
E se eu precisar de sessões sem backend? Como em SPAs estáticos hospedados em CDN?
Não existe solução segura nesse cenário. Aplicações críticas exigem um serviço de sessão mínimo, mesmo que leve apenas 20 linhas de código com Cloudflare Workers ou Vercel Edge Functions. Tentar contornar isso com JWTs ou tokens no frontend é assumir risco desnecessário.
PASETO realmente substitui JWTs para todos os casos?
Não. PASETO é mais seguro por design, sem algoritmos 'none', sem confusão de assinatura, mas ainda é um token stateless. Ele não resolve o problema central de sessões: revogação imediata. Use-o para troca de credenciais entre serviços, não para manter usuários logados.
Fontes
- gist.github.comfonte original
- Categoria
- CEVIU Web Dev
- Publicado
- 17 de junho de 2026
- Editoria
- CEVIU Web Dev
