Almacenamiento seguro de tokens JWT: Session Storage y cookies HTTP Only
Clase 9 de 13 • Curso de Next.js: Seguridad Web con OWASP
Resumen
¿Cómo almacenar de manera segura un token JWT?
Muchas personas, al abordar el almacenamiento de tokens JWT, optan por local storage
dado su uso extendido en internet y en numerosos tutoriales. Pero, ¿es realmente seguro? En realidad, no existe un método de almacenamiento completamente seguro en la web. Al hablar de seguridad, generalmente nos enfrentamos a vulnerabilidades de Cross-Site Request Forgery (CSRF) y Cross-Site Scripting (XSS). Dependiendo de nuestra elección, estaremos más expuestos a uno u otro tipo de ataque. Reconocer las vulnerabilidades nos permite tomar medidas para incrementar la seguridad. Veamos cómo.
Vulnerabilidades comunes al almacenar tokens
Cookies seguras: Las cookies, cuando son HTTP Only
y SameSite
, son una gran opción por defecto. Están protegidas contra XSS, pero son vulnerables a CSRF, ya que siempre se envían al servidor. Se requiere una protección adicional para verificar su autenticidad.
Session Storage o Local Storage: Están a salvo de CSRF porque no se envían automáticamente al servidor, pero son vulnerables a XSS. Un atacante podría, mediante código inyectado, leer valores almacenados, especialmente si estamos expuestos a librerías externas de procedencia dudosa.
¿Qué nos sugiere OWASP sobre el almacenamiento seguro?
OWASP recomienda almacenar tokens en Session Storage
. A pesar de ser volátil y estar protegido contra CSRF, debemos abordar la protección contra XSS. Una estrategia eficaz es implementar un fingerprint, un identificador único en una cookie que el servidor genera y valida. El servidor espera tanto el valor del token almacenado como el del fingerprint para operar.
En el caso de optar por cookies:
- Asegúrate de que tu sitio sea HTTPS.
- Las cookies deben ser HTTP Only para evitar manipulaciones en el frontend.
- Implementa medidas adicionales de protección CSRF, como el uso de tokens de verificación.
NextAuth: Una opción segura para la gestión de sesiones JWT
NextAuth ofrece un enfoque robusto para el manejo de sesiones y almacenamiento de tokens JWT. Realiza la autenticación en el navegador, mientras el token se crea en el servidor Node.js
de Next.js
. Utiliza cookies seguras y HTTP Only
, lo que significa que el frontend no puede acceder a los secretos.
El cliente nunca tiene acceso al token, y todas las operaciones se realizan a través del servidor, que manejan de manera segura la información. Además, NextAuth proporciona protección CSRF de manera integrada, utilizando principalmente las rutas de inicio y cierre de sesión.
Estrategias avanzadas para aplicaciones sin servidores
El enfoque cambia drásticamente cuando no existe un servidor que gestione las operaciones de almacenamiento y seguridad. En tales escenarios, se recomendaba el uso de estrategias avanzadas. Aunque no se detallan en este texto, comprender a fondo las vulnerabilidades y sus posibles mitigaciones es esencial para las aplicaciones modernas.
Al considerar las mejores prácticas y herramientas disponibles, podemos mejorar la seguridad de nuestras aplicaciones web contra ataques comunes y proteger mejor nuestros tokens JWT y la información confidencial del usuario.