En el contexto de los JWT , Stormpath ha escrito un artículo bastante útil que describe posibles formas de almacenarlos y las (des) ventajas relacionadas con cada método.
También tiene una breve descripción de los ataques XSS y CSRF, y cómo puedes combatirlos.
He adjuntado algunos fragmentos breves del artículo a continuación, en caso de que su artículo se desconecte / su sitio se caiga.
Almacenamiento local
Problemas:
Se puede acceder al almacenamiento web (localStorage / sessionStorage) a través de JavaScript en el mismo dominio. Esto significa que cualquier JavaScript que se ejecute en su sitio tendrá acceso al almacenamiento web, y debido a esto puede ser vulnerable a los ataques de scripting entre sitios (XSS). En pocas palabras, XSS es un tipo de vulnerabilidad en la que un atacante puede inyectar JavaScript que se ejecutará en su página. Los ataques básicos de XSS intentan inyectar JavaScript a través de entradas de formulario, donde el atacante pone alerta ('Estás pirateado'); en un formulario para ver si lo ejecuta el navegador y si otros usuarios pueden verlo.
Prevención:
Para evitar XSS, la respuesta común es escapar y codificar todos los datos no confiables. Pero esto está lejos de ser la historia completa. En 2015, las aplicaciones web modernas usan JavaScript alojado en CDN o infraestructura externa. Las aplicaciones web modernas incluyen bibliotecas JavaScript de terceros para pruebas A / B, embudo / análisis de mercado y anuncios. Utilizamos administradores de paquetes como Bower para importar el código de otras personas en nuestras aplicaciones.
¿Qué sucede si solo uno de los scripts que usa está comprometido? JavaScript malicioso se puede incrustar en la página y el almacenamiento web se ve comprometido. Estos tipos de ataques XSS pueden obtener el almacenamiento web de todos los que visitan su sitio, sin su conocimiento. Esta es probablemente la razón por la cual un grupo de organizaciones aconseja no almacenar nada de valor ni confiar en ninguna información en el almacenamiento web. Esto incluye identificadores de sesión y tokens.
Como mecanismo de almacenamiento, Web Storage no aplica ningún estándar seguro durante la transferencia. Quien lea el almacenamiento web y lo use debe hacer su debida diligencia para asegurarse de que siempre envíen el JWT a través de HTTPS y nunca HTTP.
Galletas
Problemas:
Las cookies, cuando se usan con el indicador de cookies HttpOnly, no son accesibles a través de JavaScript y son inmunes a XSS. También puede configurar el indicador de cookie segura para garantizar que la cookie solo se envíe a través de HTTPS. Esta es una de las principales razones por las que las cookies se han aprovechado en el pasado para almacenar tokens o datos de sesión. Los desarrolladores modernos dudan en usar cookies porque tradicionalmente requerían que el estado se almacenara en el servidor, rompiendo así las mejores prácticas RESTful. Las cookies como mecanismo de almacenamiento no requieren que el estado se almacene en el servidor si está almacenando un JWT en la cookie. Esto se debe a que JWT encapsula todo lo que el servidor necesita para atender la solicitud.
Sin embargo, las cookies son vulnerables a un tipo diferente de ataque: falsificación de solicitudes entre sitios (CSRF). Un ataque CSRF es un tipo de ataque que ocurre cuando un sitio web malicioso, correo electrónico o blog hace que el navegador web de un usuario realice una acción no deseada en un sitio confiable en el que el usuario está autenticado actualmente. Esta es una explotación de cómo el navegador maneja las cookies. Una cookie solo se puede enviar a los dominios en los que está permitida. Por defecto, este es el dominio que originalmente configuró la cookie. La cookie se enviará para una solicitud, independientemente de si está en galaxies.com o hahagonnahackyou.com.
Prevención:
Los navegadores modernos admiten la SameSite
bandera , además de HttpOnly
ySecure
. El propósito de este indicador es evitar que la cookie se transmita en solicitudes entre sitios, evitando muchos tipos de ataques CSRF.
Para los navegadores que no son compatibles SameSite
, CSRF se puede evitar mediante el uso de patrones de token sincronizados. Esto suena complicado, pero todos los marcos web modernos tienen soporte para esto.
Por ejemplo, AngularJS tiene una solución para validar que solo su dominio pueda acceder a la cookie. Directamente desde documentos de AngularJS:
Al realizar solicitudes XHR, el servicio $ http lee un token de una cookie (de forma predeterminada, XSRF-TOKEN) y lo establece como un encabezado HTTP (X-XSRF-TOKEN). Dado que solo JavaScript que se ejecuta en su dominio puede leer la cookie, su servidor puede estar seguro de que el XHR proviene de JavaScript que se ejecuta en su dominio. Puede hacer que esta protección CSRF sea apátrida al incluir un xsrfToken
reclamo JWT:
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
Aprovechar la protección CSRF de su marco de aplicaciones web hace que las cookies sean sólidas para almacenar un JWT. CSRF también puede prevenirse parcialmente verificando el encabezado HTTP Referer y Origin desde su API. Los ataques CSRF tendrán encabezados Referer y Origin que no están relacionados con su aplicación.
El artículo completo se puede encontrar aquí:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
También tienen un artículo útil sobre cómo diseñar e implementar mejor los JWT, con respecto a la estructura del token:
https://stormpath.com/blog/jwt-the-right-way/