web-dev-qa-db-fra.com

JWT doit-il être stocké dans un stockage local ou un cookie?

Dans le but de sécuriser REST API utilisant JWT, selon certains matériaux (comme this guide et this question ), JWT peut être stocké dans localStorage ou Cookies . D'après ce que j'ai compris:

  • localStorage est soumis à XSS et il n'est généralement pas recommandé d'y stocker des informations sensibles.
  • Avec Cookies , nous pouvons appliquer le drapeau "httpOnly" qui atténue le risque de XSS. Cependant, si nous lisons le JWT à partir de cookies sur le backend, nous sommes alors soumis au CSRF.

Donc, sur la base du principe ci-dessus - ce sera mieux si nous stockons JWT dans des cookies. À chaque demande adressée au serveur, le JWT sera lu à partir de cookies et ajouté dans l'en-tête d'autorisation à l'aide du schéma de support. Le serveur peut alors vérifier le JWT dans l'en-tête de la demande (au lieu de le lire à partir des cookies).

Ma compréhension est-elle correcte? Si tel est le cas, l'approche ci-dessus présente-t-elle un problème de sécurité? Ou, en fait, pouvons-nous nous contenter d’utiliser localStorage?

57
pkid169

J'aime la méthode XSRF Double Submit Cookies mentionnée dans l'article que @ pkid169 a dit, mais il y a une chose que cet article ne vous dit pas. Vous n'êtes toujours pas protégé contre XSS car l'attaquant peut injecter un script qui lit votre cookie CSRF (qui n'est pas HttpOnly), puis envoyer une requête à l'un de vos points de terminaison API à l'aide de ce jeton CSRF avec le cookie JWT envoyé automatiquement.

Donc, en réalité, vous êtes toujours sensible au XSS, c'est simplement qu'un attaquant ne peut pas vous voler votre jeton JWT pour une utilisation ultérieure, mais il peut toujours faire des requêtes au nom de vos utilisateurs en utilisant XSS.

Que vous stockiez votre JWT dans un stockage local ou votre jeton XSRF dans un cookie non http, les deux peuvent être facilement capturés par XSS. Même votre cookie JWT dans HttpOnly peut être capturé par une attaque XSS avancée.

Donc, en plus de la méthode des cookies à double soumission, vous devez toujours suivre les meilleures pratiques contre XSS, y compris le contenu échappé. Cela signifie la suppression de tout code exécutable qui obligerait le navigateur à faire quelque chose que vous ne voudriez pas. Cela signifie généralement que vous devez supprimer // <! [CDATA [balises et attributs HTML entraînant l'évaluation de JavaScript.

33
Iman Sedighi

Un moment opportun message de Stormpath a bien précisé mes points et répondu à ma question.

TL; DR

Stockez le JWT dans des cookies, puis transmettez-le dans l'en-tête Authorization à chaque requête, comme indiqué dans l'article, ou reposez-vous sur le backend pour empêcher CSRF (par exemple, utilisez xsrfToken en cas d'angulaire. ).

14
pkid169