web-dev-qa-db-fra.com

Où stocker JWT dans le navigateur? Comment se protéger contre le CSRF?

Je connais l'authentification basée sur les cookies. Les indicateurs SSL et HttpOnly peuvent être appliqués pour protéger l’authentification basée sur les cookies de MITM et XSS. Cependant, d'autres mesures spéciales seront nécessaires pour le protéger des CSRF. Ils sont juste un peu compliqués. ( référence )

Récemment, je découvre que JSON Web Token (JWT) est une solution assez populaire pour l’authentification. Je connais bien le codage, le décodage et la vérification de JWT. Cependant, je ne comprends pas pourquoi certains sites Web/tutoriels ne disent pas avoir besoin de la protection CSRF si JWT est utilisé. J'ai beaucoup lu et j'essaie de résumer les problèmes ci-dessous. Je veux simplement que quelqu'un puisse brosser un tableau complet de JWT et clarifier les concepts que j'ai mal compris à propos de JWT.

  1. Si le fichier JWT est stocké dans un cookie, j’estime qu’il est identique à l’authentification basée sur le cookie, à la différence que le serveur n’a pas besoin de sessions pour vérifier le cookie/le jeton. Le CSRF comporte toujours un risque si aucune mesure spéciale n'est mise en œuvre. JWT n'est-il pas stocké dans un cookie?

  2. Si le fichier JWT est stocké dans localStorage/sessionStorage, aucun cookie ne doit donc être protégé contre le CRSF. La question est de savoir comment envoyer le JWT au serveur. J'ai trouvé ici suggère d'utiliser jQuery pour envoyer le JWT par en-tête HTTP des requêtes ajax. Donc, seules les requêtes ajax peuvent faire l’authentification?

  3. En outre, j'ai trouvé un plus blog montre à utiliser "en-tête d'autorisation" et "porteur" pour envoyer le JWT. Je ne comprends pas la méthode dont parle le blog. Quelqu'un pourrait-il s'il vous plaît expliquer plus sur "En-tête d'autorisation" et "Au porteur"? Cela rend-il le JWT transmis par l'en-tête HTTP de TOUTES les demandes? Si oui, qu'en est-il de la CSRF?

128
Timespace7

Les jetons JWT sont populaires car ils sont utilisés comme format de jeton par défaut dans les nouveaux protocoles d'autorisation et d'authentification tels que OAuth 2. et OpenID Connect .

Lorsque le jeton est stocké dans un cookie, le navigateur l'envoie automatiquement avec chaque demande au même domaine, ce qui le rend vulnérable aux attaques CSRF.

L’authentification au porteur est l’un des schémas d’authentification définis dans HTTP. Cela signifie fondamentalement que YOU colle le jeton (JWT) dans l'en-tête HTTP d'autorisation d'une demande. Le navigateur NOT le fera automatiquement pour vous, il ne convient donc pas pour protéger votre site Web. Comme le navigateur n'ajoute pas automatiquement l'en-tête à votre demande, il n'est pas vulnérable aux attaques CSRF, car vos informations d'authentification sont automatiquement envoyées au domaine d'origine.

Le schéma de support est souvent utilisé pour protéger les API Web (services REST) ​​consommées via des appels AJAX ou à partir de clients mobiles.

59
MvdD

Nous devons stocker le fichier JWT sur l'ordinateur client. Si nous le stockons dans un LocalStorage/SessionStorage, il peut être facilement saisi par une attaque XSS. Si nous les stockons dans des cookies, un pirate informatique peut les utiliser (sans le lire) dans une attaque CSRF, usurper l'identité de l'utilisateur, contacter notre API et envoyer des demandes d'exécution d'actions ou obtenir des informations pour le compte d'un utilisateur.

Cependant, il existe plusieurs façons de sécuriser JWT dans les cookies pour ne pas être volé facilement (mais il existe encore des techniques avancées pour les voler). Mais si vous voulez utiliser LocalStorage/SessionStorage, vous pouvez y accéder par une simple attaque XSS.

Donc, pour résoudre le problème de CSRF, j'utilise des cookies à double soumission dans mon application.

Méthode de double soumission de cookies

  1. Stockez JWT dans un cookie HttpOnly et utilisez-le en mode sécurisé pour transférer via HTTPS.

  2. La plupart des attaques CSRF ont un en-tête d'origine ou de référent différent avec l'hôte d'origine dans leurs demandes. Vérifiez donc si vous en avez dans l’en-tête, proviennent-ils ou non de votre domaine! Si ce n'est pas les rejeter. Si Origin et le référent ne sont pas disponibles dans la demande, aucun souci. Vous pouvez compter sur le résultat des résultats de validation de l'en-tête X-XSRF-TOKEN, que j'explique à l'étape suivante.

  3. Bien que le navigateur fournisse automatiquement vos cookies pour le domaine de la demande, il existe une limite utile: le code JavaScript exécuté sur un site Web ne peut pas lire les cookies d'autres sites Web. Nous pouvons en tirer parti pour créer notre solution CSRF. Pour empêcher les attaques CSRF, nous devons créer un cookie lisible en plus, appelé: XSRF-TOKEN. Ce cookie doit être créé lors de la connexion de l'utilisateur et doit contenir une chaîne aléatoire indéterminée. Nous enregistrons également ce numéro dans le JWT lui-même en tant que revendication privée. Chaque fois que l'application JavaScript souhaite effectuer une demande, elle doit lire ce jeton et l'envoyer dans un en-tête HTTP personnalisé. Étant donné que ces opérations (lecture du cookie, définition de l'en-tête) ne peuvent être effectuées que sur le même domaine de l'application JavaScript, nous pouvons savoir que cette opération est effectuée par un utilisateur réel qui utilise notre application JavaScript.

Angular JS vous rend la vie facile

Heureusement, j’utilise Angular JS sur notre plate-forme et Angular empaquete l’approche par jeton CSRF, ce qui nous simplifie la mise en oeuvre. Pour chaque demande que notre Angular _ envoie au serveur, le service Angular $http effectue automatiquement les opérations suivantes:

  • Recherchez un cookie nommé XSRF-TOKEN sur le domaine actuel.
  • Si ce cookie est trouvé, il lit la valeur et l'ajoute à la demande en tant qu'en-tête X-XSRF-TOKEN.

Ainsi, l'implémentation côté client est gérée automatiquement pour vous! Nous devons simplement définir un cookie nommé XSRF-TOKEN sur le domaine actuel côté serveur. Lorsque notre API reçoit un appel du client, elle doit vérifier l’en-tête X-XSRF-TOKEN et la comparer au XSRF-TOKEN dans JWT. S'ils correspondent, l'utilisateur est réel. Sinon, c'est une demande falsifiée et vous pouvez l'ignorer. Cette méthode est inspirée de la méthode "Double Submit Cookie".

Mise en garde

En réalité, vous êtes toujours susceptible aux technologies 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 pour le compte de vos utilisateurs à l'aide de XSS.

Que vous stockiez votre JWT dans la localStorage ou que vous stockiez votre jeton XSRF dans un cookie HttpOnly, les deux peuvent être facilement capturés par XSS. Même votre JWT dans un cookie HttpOnly peut être saisi par une attaque XSS avancée telle que méthode XST .

Donc, en plus de la méthode de double soumission de cookies, 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 les balises // <![CDATA[ et les attributs HTML qui entraînent l'évaluation de JavaScript.

Lire la suite ici:

121
Iman Sedighi