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?
Respuestas:
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.
fuente
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.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
xsrfToken
en el caso de Angular).fuente
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/
fuente
secure
,samesite: strict
,http-only
?Para ayudar a prevenir ataques CSRF que aprovechan las cookies existentes, puede configurar su cookie con la
SameSite
directiva. Establecerlo enlax
ostrict
.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=lax
permitirá "navegaciones de nivel superior que utilizan un método HTTP 'seguro'".fuente