Seguridad digital
JWT en Cookies: seguridad de sesiones en aplicaciones escalables
En el desarrollo de aplicaciones web modernas, la gestión segura de la sesión del usuario no es un detalle menor, sino un pilar fundamental de la arquitectura de seguridad. El uso de JSON Web Tokens (JWT) se ha estandarizado como el mecanismo ideal para implementar autenticación sin estado. Sin embargo, a nivel técnico, surge una pregunta crítica que afecta directamente la postura de seguridad de cualquier plataforma en crecimiento: ¿dónde almacenás ese JWT en el cliente de forma segura?
Las dos alternativas más comunes que se debaten son LocalStorage y Cookies. En este análisis, vamos a profundizar en las vulnerabilidades de cada opción frente a amenazas comunes (XSS y CSRF) y justificaremos por qué la implementación de cookies con atributos de seguridad específicos es la estrategia de seguridad por defecto para sistemas robustos.
LocalStorage vs. Cookies.Mecanismos de almacenamiento: Conveniencia vs. Robustez
Para tomar una decisión informada, es crucial entender cómo funciona cada mecanismo y los atributos que marcan la diferencia en términos de seguridad.
LocalStorage
LocalStorage es una API simple que permite almacenar pares clave-valor en el navegador.
Cookies
Las cookies son pequeños ficheros de datos que se reenvían automáticamente al servidor en futuras peticiones. A diferencia de LocalStorage, las cookies se pueden fortificar drásticamente con atributos específicos para la seguridad.
| Atributo | Objetivo principal | Defensa clave |
|---|---|---|
| HttpOnly | Impide que el valor de la cookie sea accesible desde la API de JavaScript (Document.cookie). | Mitiga el robo de sesiones a través de ataques XSS |
| Secure | Asegura que la cookie solo se envíe a través de una conexión cifrada (HTTPS). | Protege la información de la cookie contra ataques de Man-in-the-Middle (MitM). |
| SameSite | Es la defensa más moderna y eficaz contra CSRF. Controla si la cookie se envía en solicitudes que se originan en sitios diferentes. | Bloquea la mayoría de las peticiones de origen cruzado, neutralizando los ataques CSRF. |
La fortaleza de HttpOnly contra XSS
Una cookie marcada como HttpOnly es inaccesible para JavaScript. Incluso si un atacante logra inyectar un script, no puede robar el token. El navegador la gestiona y la envía, neutralizando el principal vector de ataque del XSS: el robo de la credencial para uso externo.
La solución moderna para CSRF: SameSite
Históricamente, el gran argumento en contra de las cookies era su vulnerabilidad intrínseca a CSRF, ya que se envían automáticamente con cada petición. Sin embargo, el atributo SameSite ha resuelto este problema en gran medida.
Al configurarlo como Lax (un buen equilibrio entre seguridad y usabilidad) o Strict, se le indica al navegador que bloquee el envío de la cookie en la mayoría de las solicitudes que se originan desde otros dominios
Análisis comparativo de amenazas
La elección no se trata de cuál es más “moderno”, sino de cuál ofrece un mejor modelo de seguridad frente a las amenazas más comunes y peligrosas.
| Características | LocalStorage | Cookie HttpOnly | Cookie HttpOnly + SameSite |
|---|---|---|---|
| Protección XSS | ❌ Vulnerable (Robo total) | ✅ Protegido (Robo mitigado) | ✅ Protegido (Robo mitigado) |
| Protección CSRF | ✅ Protegido | ❌ Vulnerable | ✅ Protegido |
| Recomendación | No recomendado | Parcialmente seguro | Recomendado |
La estrategia que proporciona protección completa contra ambos vectores de ataque principales es el uso de Cookies con HttpOnly y SameSite. Estás construyendo una defensa por capas, aprovechando el navegador para hacer cumplir la seguridad por vos.
