Deja de usar JWTs
Alcance del debate
- La mayoría de los participantes distingue dos casos de uso principales:
- Sesiones de usuario basadas en navegador.
- Tokens de servicio a servicio / backend.
- Consenso suave general: los JWTs suelen ser una mala opción para sesiones de navegador, pero pueden estar bien o incluso ser ideales para escenarios de backend y federación.
JWTs para sesiones basadas en navegador
- Los críticos dicen que los JWTs añaden complejidad frente a simples IDs de sesión opacos en cookies HttpOnly, sin un beneficio real si el mismo servidor los emite y valida.
- Principales problemas señalados:
- Revocación y cierre de sesión difíciles o incómodos, especialmente el cierre de sesión por dispositivo.
- Posibilidad de repetición y tokens de larga duración.
- Tendencia a meter datos sensibles o mutables en los tokens, creando problemas de invalidación de caché y de seguridad.
- Varios sostienen: si ya necesitas un datastore (para usuarios, permisos), simplemente guarda el estado de la sesión allí y evita la criptografía para las sesiones.
Propiedades de seguridad y trampas de implementación
- Problemas históricos:
alg=none, degradación/confusión de algoritmos, bibliotecas que aceptan claves públicas como secretos HMAC, malos valores por defecto. - Algunos dicen que estos fueron errores de las bibliotecas y en su mayoría ya están corregidos; otros sostienen que provienen de una especificación que fomenta trampas y complejidad.
- Desacuerdo sobre cuán “inseguro” es JWT hoy:
- Un bando: “JWT está bien si restringes los algoritmos y usas buenas bibliotecas.”
- Otro bando: “La especificación fomenta usos incorrectos; siguen apareciendo CVEs; existen diseños más seguros.”
Revocación, autenticación “sin estado” y cierre de sesión
- Tensión central: los JWTs se comercializan como “sin estado”, pero el cierre de sesión seguro y el manejo de compromisos requieren estado:
- Listas de revocación / denylists.
- Marcas de tiempo por usuario de “no válido antes de”.
- Esquemas de rotación de claves.
- Algunos argumentan que una vez añades ese estado, has perdido la principal ventaja frente a las sesiones clásicas.
- Otros responden que las listas de revocación son mucho más pequeñas que los almacenes completos de sesiones y más fáciles de replicar globalmente.
Cookies, almacenamiento y XSS/CSRF
- Fuerte apoyo a cookies HttpOnly, Secure, SameSite para sesiones de navegador.
- Muchos advierten contra almacenar JWTs en localStorage debido a la exfiltración por XSS; algunos restan importancia a esto si “no permites JS no confiable”, otros dicen que eso no es realista.
- Se señala que HttpOnly evita el robo del token pero no el uso malicioso impulsado por XSS.
Alternativas y ecosistema más amplio
- Alternativas mencionadas: tokens opacos aleatorios, cookies firmadas, PASETO, macaroons, patrones SAML/OIDC, esquemas personalizados.
- Algunos elogian los diseños de PASETO/macaroons como más resistentes a usos incorrectos, pero señalan un ecosistema y una adopción limitados.
- Varios consideran que el planteamiento “deja de usar JWTs” es exagerado o sensacionalista; prefieren “usa JWTs de forma limitada y cuidadosa.”