security - entre - ¿Se debe almacenar JWT en localStorage o cookie?
localstorage vs sessionstorage (2)
Con el fin de asegurar la API REST utilizando JWT, de acuerdo con algunos materiales (como esta guide y esta question ), el JWT puede almacenarse en localStorage o Cookies . Según mi comprensión:
- localStorage está sujeto a XSS y, en 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.
Por lo tanto, 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. 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 alguna preocupación de seguridad? ¿O, en realidad, podemos simplemente escapar usando localStorage en primer lugar?
Me gusta el método XSRF de doble envío de cookies que se menciona en el artículo que @ pkid169 dijo, pero hay una cosa que ese artículo no te dice. Todavía no está protegido contra XSS porque lo que el atacante puede hacer es inyectar un script que lee su cookie CSRF (que no es HttpOnly) y luego realizar una solicitud a uno de sus puntos finales 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 hacer solicitudes en nombre de tus usuarios usando XSS.
Ya sea que almacene su JWT en un localStorage o almacene su token XSRF en una cookie no solo http, ambos pueden ser fácilmente capturados por XSS. Incluso su JWT en la cookie HttpOnly puede ser capturada por un ataque XSS avanzado.
Por lo tanto, además del método de doble envío de cookies, siempre debe seguir las mejores prácticas contra XSS, incluido el escape de contenido. Esto significa eliminar cualquier código ejecutable que pueda hacer que el navegador haga algo que usted no quiere que haga. Por lo general, esto significa eliminar // <! [CDATA [etiquetas y atributos HTML que hacen que se evalúe JavaScript.
Una publicación oportuna de Stormpath ha elaborado 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 he mencionado, o como sugiere el artículo, confíe en el back-end para prevenir CSRF (por ejemplo, usando
xsrfToken
en caso de Angular).