Pourquoi devrais-je mettre un jeton CSRF dans un JWT?

je veux apporter un doute sur les tokens JWT et CSRF du Stormpath post qui expliquent les avantages et les inconvénients de stocker le JWT soit dans un stockage local ou des cookies.

[...] si vous lisez des valeurs à partir d'un cookie en utilisant JS, cela signifie que vous ne peut pas mettre le drapeau Httponly sur le cookie, donc maintenant n'importe quel JS sur votre site peut le lire, ce qui en fait le même niveau de sécurité que le stockage quelque chose dans localStorage.

j'essaie de comprendre pourquoi ils recommandent d'ajouter le xsrfToken à le JWT. Ne stocke pas votre JWT dans le cookie et ne l'extrait pas placer le JWT dans L'en-tête HTTP et authentifier le requête basée sur L'en-tête HTTP accomplir la même chose que Le x-XSRF-TOKEN d'Angular? Aucun autre domaine ne peut faire de requêtes sur un compte de l'utilisateur si vous authentifier basé sur le JWT dans l'en-tête, puisque d'autres domaines ne peuvent pas extraire le JWT à partir du cookie. Je n'ai pas comprendre le but du xsrfToken dans le JWT - peut-être son juste une couche supplémentaire de défense-ce qui signifie que les attaquants devraient avoir un script compromis sur votre site et CSRF un utilisateur à l'époque. Si il faudrait qu'ils te frappent des deux côtés pour pouvoir lancer une attaque.

La poste est liée à cette réponse où, dit:

la dernière chose est d'assurer que vous avez la protection CSRF sur chaque Demande HTTP pour s'assurer que les domaines externes lançant des demandes votre site ne peut pas fonctionner.

[...] Ensuite, sur chaque demande dans votre serveur, assurez-vous que votre propre Le code JavaScript lit la valeur du cookie et la définit dans une commande en-tête, par exemple X-CSRF-Token et vérifier cette valeur sur chaque requête serveur. les clients du domaine externe ne peuvent pas définir des en-têtes personnalisés pour demande à votre domaine à moins que le client externe obtient l'autorisation via une requête D'Options HTTP , donc toute tentative D'attaque CSRF (par exemple dans un IFrame, peu importe) échouera.

même s'ils pouvaient configurer des en-têtes personnalisés, ils ne pouvaient pas accéder au cookie où le token JWT est stocké car seul JavaScript qui fonctionne sur le même domaine peut lire le cookie.

la seule façon qu'ils ont pu est via XSS, mais avoir un xsrfToken dans le JWT est compromis aussi s'il existe des vulnérabilités XSS parce qu'un script malveillant tournant dans le domaine du client de confiance pourrait accéder au JWT dans le cookie et inclure un en-tête dans la requête avec le xsrfToken.

ainsi l'équation devrait être:

  • TLS + JWT stockés dans un cookie sécurisé + JWT dans l'en-tête de la requête + aucune vulnérabilité XSS.

si le client et le serveur fonctionnent dans des domaines différents, le serveur doit envoyer le JWT et le client devrait créer le cookie avec le JWT. Je pense que l'équation est encore valide pour cette situation.

mise à JOUR: MvdD d'accord avec moi :

comme le navigateur n'ajoute pas automatiquement l'en-tête à votre demande, il n'est pas vulnérable à une attaque CSRF

3
demandé sur Community 2016-01-26 15:23:10

2 réponses

je suis l'auteur du billet du Blog Stormpath. Stocker un token XSRF dans le JWT ne signifie pas qu'il est dans le JWT, mais plutôt qu'il est dans un cookie. Le cookie doit être httpOnly, donc vous ne pouvez pas le lire à partir de Javascript.

maintenant, je pense que le point qui a causé un peu de confusion est où je parle de l'angle. Il n'y a que le cookie XSRF (qui n'est pas httpOnly) pour le mettre dans l'en-tête au moment de la requête (qui ne peut être fait que par javascript sur le même domaine.) Ce ne sont pas les mêmes cookies.

si vous envisagez d'implémenter le support XSRF dans votre application, cela a été fait avec le stockage de l'État côté serveur et le point de stockage de XSRF. Le stocker dans le cookie httpOnly, c'est être apatride avec XSRF. Ici, vous validez la signature JWT, retirez la XSRF des claims, et la comparez à l'en-tête.

La réponse à votre question est que vous n'avez pas besoin de stocker l'état sur votre serveur.

8
répondu Tom Abbott 2016-06-21 14:27:36

ma compréhension était celle-ci:

  • Magasin de JWT est un HTTPonly cookie.
  • dans ce JWT, stockez une version hachée d'un jeton XSRF.
  • envoyer au client le jeton XSRF quand ils s'inscrivent afin qu'ils puissent le stocker dans un local de stockage
  • plus tard lorsque le client envoie des requêtes, le JWT est automatiquement envoyé avec chaque requête via des cookies et ensuite vous envoyez également le token XSRF via un en-tête ou une requête variable et Côté Serveur, re-hachage pour comparer à ce qu'il y a dans le JWT sur le serveur

votre JWT est protégé contre le vol dans un XSS et vous êtes protégé de XSRF. XSS peut toujours s'exécuter sur votre navigateur, mais ne peut endommager cette session que dans ce dernier. En fin de compte, vous ne pouviez pas empêcher quelqu'un d'écrire un script vraiment détaillé qui vient de s'exécuter sur votre navigateur, donc les sécurités conventionnelles à protéger de XSS sont toujours nécessaires par le développeur web.

4
répondu Chiedo 2016-06-20 12:34:51