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.