¿Debería almacenarse JWT en localStorage o cookie? [duplicar]


99

Con el fin de asegurar la API REST usando JWT, de acuerdo con algunos materiales (como esta guía y esta pregunta ), el JWT se puede almacenar en localStorage o Cookies . Basado en mi entendimiento:

  • localStorage está sujeto a XSS y, por lo general, no se recomienda almacenar información confidencial en él.
  • Con las Cookies podemos aplicar la bandera "httpOnly" que mitiga el riesgo de XSS. Sin embargo, si vamos a leer el JWT de las cookies en el backend, estamos sujetos a CSRF.

Entonces, según la premisa anterior, será mejor si almacenamos JWT en cookies. En cada solicitud al servidor, el JWT se leerá de las Cookies y se agregará en el encabezado de Autorización utilizando el esquema de Portador. Luego, el servidor puede verificar el JWT en el encabezado de la solicitud (en lugar de leerlo de las cookies).

¿Es correcto mi entendimiento? Si es así, ¿el enfoque anterior tiene algún problema de seguridad? ¿O en realidad podemos salirse con la nuestra usando localStorage en primer lugar?



@ lrn2prgrm que no se debería utilizar (sin estado) JWT y semántica (estado) de sesión juntos.
ozanmuyes

Respuestas:


56

Me gusta el método de cookies de envío doble XSRF que se menciona en el artículo que dice @ pkid169, pero hay una cosa que el artículo no te dice. Todavía no está protegido contra XSS porque lo que puede hacer el atacante es inyectar un script que lee su cookie CSRF (que no es HttpOnly) y luego realizar una solicitud a uno de sus puntos finales de API utilizando este token CSRF con la cookie JWT que se envía automáticamente.

Entonces, en realidad, todavía eres susceptible a XSS, es solo que el atacante no puede robarte el token JWT para usarlo más tarde, pero aún puede realizar solicitudes en nombre de tus usuarios utilizando XSS.

Ya sea que almacene su JWT en un localStorage o almacene su token XSRF en una cookie que no sea solo http, ambos pueden ser capturados fácilmente por XSS. Incluso su cookie JWT en HttpOnly puede ser capturada por un ataque XSS avanzado.

Por lo tanto, además del método de cookies de doble envío, siempre debe seguir las mejores prácticas contra XSS, incluido el contenido de escape. Esto significa eliminar cualquier código ejecutable que haría que el navegador hiciera algo que usted no desea. Normalmente esto significa eliminar // <! [CDATA [etiquetas y atributos HTML que hacen que se evalúe JavaScript.


11
¿Puede aclarar cómo se puede capturar una cookie JWT en HttpOnly? XSRF puede usarlo si el token XSRF se ve comprometido por XSS, pero ¿realmente se puede tomar él mismo?
Jacek Gorgoń

1
Sé que esta es una publicación antigua, pero me gustaría hacer algunas preguntas ... ¿Eso significa que los scripts bien elaborados pueden leer tanto localStorage como cookies? Si es así, ¿es seguro asumir que un JWT puede ser robado sin importar dónde lo almacenemos en un navegador? Entonces, siento que depender únicamente de un JWT es muy arriesgado.
Hiroki

2
"Incluso su JWT en la cookie HttpOnly puede ser capturada por un ataque XSS avanzado". Es falso. Publicación original editada para corregir esto.
java-addict301

"Incluso su cookie JWT en HttpOnly puede ser capturada por un ataque XSS avanzado" Me imagino que alguien toma la cookie enviándola a su propio servidor. Para eso, puede usar fetch con el valor adecuado de la bandera de credenciales. El principal problema aquí es la protección CORS, pero en algunas circunstancias creo que es posible.
bartnikiewi.cz

"inyectar secuencia de comandos que lee su cookie CSRF (que no es HttpOnly)" La implementación predeterminada de Html.AntiForgeryToken()en ASP.NET MVC utiliza una cookie HttpOnly para el token CSRF. Creo que todavía eres susceptible a ciertos XSS, pero pensé que valía la pena mencionarlo.
Lovethenakedgun

21

Una publicación oportuna de Stormpath ha elaborado bastante mis puntos y ha respondido a mi pregunta.

TL; DR

Almacene el JWT en cookies, luego pase el JWT en el encabezado de Autorización en cada solicitud como lo mencioné, o como sugiere el artículo, confíe en el backend para evitar CSRF (por ejemplo, usar xsrfTokenen el caso de Angular).


2
Hola, no estoy seguro de si esto es correcto, pero, ¿existen algunas desventajas particulares en el uso de cookies para almacenar jwt cuando implementa CrossOrigin para sus controladores? Esa es una escena en la que mi aplicación de servidor se encuentra en un lugar diferente y estamos llamando al api en nuestra aplicación cliente que se encuentra, digamos, en otra ciudad? ¿No es por eso que muchos proveedores de servicios web se abstienen de utilizar cookies?
Valik

CrossOrigin no significa ubicaciones físicas. Se refiere a solicitudes provenientes de otros dominios. En .net core cuando decide utilizar CORS, especifica qué dominios va a permitir; qué encabezados permitirás, etc.
Brian Allan West

11
  • No almacene su token en LocalStorage o SessionStorage, porque dicho token se puede leer desde javascript y, por lo tanto, es vulnerable al ataque XSS.
  • No almacene su token en Cookie. Cookie (con el indicador HttpOnly) es una mejor opción: es propensa a XSS, pero es vulnerable al ataque CSRF

En cambio, al iniciar sesión, puede entregar dos tokens: token de acceso y token de actualización. El token de acceso debe almacenarse en la memoria Javascript y el token de actualización debe almacenarse en HttpOnly Cookie. El token de actualización se usa solo y solo para crear nuevos tokens de acceso, nada más.

Cuando el usuario abre una nueva pestaña o se actualiza en el sitio, debe realizar una solicitud para crear un nuevo token de acceso, basado en el token de actualización que se almacena en Cookie.

También recomiendo encarecidamente leer este artículo: https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/


5
¿Por qué la complejidad adicional cuando puede tratar el token de actualización como un token de acceso? ¿Cómo es el enfoque más seguro dado que marcar mi token de acceso como secure, samesite: strict, http-only?
Charming Robot

no es más seguro
Chris Hawkes

2

Para ayudar a prevenir ataques CSRF que aprovechan las cookies existentes, puede configurar su cookie con la SameSitedirectiva. Establecerlo en laxostrict .

Esto todavía es un borrador y, a partir de 2019, no es totalmente compatible con todos los navegadores actuales , pero dependiendo de la sensibilidad de sus datos y / o su control sobre los navegadores que usan sus usuarios, puede ser una opción viable. Establecer la directiva con SameSite=laxpermitirá "navegaciones de nivel superior que utilizan un método HTTP 'seguro'".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.