La mayoría de las publicaciones de blog que he leído sugieren usar cookies httpOnly para almacenar de forma segura el token jwt en el lado del cliente (aplicaciones javascript). Tengo algunas preguntas con respecto a esto (que no pude encontrar en esas publicaciones de blog).
La sugerencia de usar httpOnly es evitar código malicioso (por ejemplo, XSS, inyección de secuencias de comandos) para poder leer el JWT. Eso es bajo el supuesto de que la autenticación se realiza únicamente en el lado del back-end y si el código Javascript necesita extraer alguna información de JWT, httpOnly no funciona.
No creo que tenga que ver nada con la apatridia del REST.
El uso de localStorage tiene este riesgo, pero si es necesario, sí, debe tener cuidado.
Si el token jwt se almacena en la cookie httpOnly, la aplicación JavaScript no puede acceder al token y no puede conocer el estado de autenticación del usuario actual. Como manejamos esto ?
El token puede estar oculto para el cliente, pero eso no significa que el cliente no pueda tener ninguna información. Cuando el cliente realiza una solicitud exitosa al servidor y el servidor autentica al cliente, la respuesta puede incluir el JWT en una cookie HttpOnly, y el cliente, al ver que tuvo éxito, establece una marca en, digamos, almacenamiento local, indicando que existe una cookie (aunque JS no pueda acceder a ella), o indicando la fecha de caducidad de la cookie.
El cliente podría usar este valor en el almacenamiento en futuras cargas de página para ver si la solicitud al servidor probablemente tendrá éxito (es decir, que existe una cookie HttpOnly y que contiene un JWT válido). Si el valor existe, el cliente puede realizar una solicitud, el servidor puede validar la cookie y devolver información al cliente, sin que el cliente tenga acceso JavaScript directo al JWT.
Dicho esto, este enfoque es un poco engorroso y solo es realmente adecuado cuando puede haber otro código no necesariamente confiable ejecutándose en la página. Este es el enfoque que utilizo cuando una de mis aplicaciones se ejecuta en una página en un dominio externo que no controlo, con otros scripts sobre los que no sé lo suficiente: el uso de una cookie HttpOnly significa que mi servidor puede almacenar de forma segura la información del cliente allí. sin tener que preocuparse tanto por lo que podrían estar haciendo otros scripts en la página.
Si la página en la que se ejecuta la aplicación es la suya, puede optar por almacenar el JWT en una cookie simple (no HttpOnly) o en el almacenamiento local, y acceder a él a través de JavaScript.
¿Está bien "usar localStorage para token jwt"? ¿Solo tenemos que tener cuidado con XSS?
Si está en su propia página, sí, en su mayor parte. Si se puede acceder al JWT con JavaScript, JavaScript malicioso puede rasparlo, esa es la única preocupación.