web-dev-qa-db-fra.com

Comment stocker un jeton JWT dans un cookie HTTP uniquement?

J'ai créé une application qui utilise simplement un JWT envoyé par le serveur sur les informations de connexion correctes et autorise contre tout /api route sur mon serveur backend Express.js.

AngularJS, d'autre part, a pris ce jeton, l'a stocké dans le stockage de session et a utilisé un intercepteur d'authentification à chaque tour pour renvoyer le jeton au serveur.

Plus récemment, j'ai compris à quel point cette pratique est dangereuse.

Je comprends la méthode de transfert des jetons dans les deux sens, dans ce scénario. Cependant, quelqu'un serait-il assez aimable pour expliquer, à un niveau élevé, la méthode qui a lieu lorsque vous souhaitez stocker ce JWT dans un cookie HTTP sécurisé uniquement que Javascript côté client ne peut pas lire?

Par exemple: en cas de réussite des informations d'identification

  1. le cookie est créé sur le serveur,
  2. créer un JWT en même temps que le cookie
  3. stocker le JWT dans une propriété de cookie appelée jeton, etc.

J'essaie d'acquérir un modèle mental ici de la façon dont cela fonctionne. Si ma compréhension est correcte, le faire de cette façon ne nécessiterait plus d'intercepteur d'authentification, car lors d'une connexion correcte, le serveur ferait tout le transfert du jeton à l'intérieur du cookie.

15
user6823414

Le traitement des cookies a leur juste part de subtilités, mais à un niveau élevé, un cookie est un élément de données que votre serveur Web peut définir, qui sera ensuite stocké par le navigateur Web de l'utilisateur et renvoyé au serveur pour toute demande future qui navigateur fait sur le même serveur tant que le cookie est valide et applicable à la demande en cours.

( c'est pourquoi vous n'aurez plus besoin d'utiliser les Angular, car c'est le navigateur lui-même qui assure l'envoi du cookie)

Outre certaines options d'indicateur spéciales, comme HTTP uniquement, à un niveau supérieur, vous pouvez définir des cookies à associer à un domaine et un chemin d'accès donnés. Par exemple, votre serveur pourrait définir un cookie de telle sorte qu'il ne serait envoyé par la suite par le navigateur qu'aux demandes effectuées sous le /api chemin.

Pour résumer, les cookies sont un mécanisme de gestion d'état pour HTTP, voir le RFC 2617 associé pour plus de détails.

En revanche, un JWT est juste quelques données qui ont une représentation bien connue et suivent certaines conventions. Plus spécifiquement, un JWT est composé d'un en-tête, d'une charge utile et de sections de signature et il est généralement conseillé de garder la taille de la charge utile faible pour la plupart des cas d'utilisation du JWT. Voir Premiers pas avec les jetons Web JSON pour plus de détails.

Si vous parcourez l'article précédent, vous remarquerez que la représentation finale d'un JWT est trois chaînes encodées en Base64url séparées par des points. Ceci est particulièrement intéressant car cela signifie qu'un JWT est bien adapté pour être utilisé dans HTTP, y compris comme valeur d'un cookie.

Une chose à garder à l'esprit est que, par la spécification, vous êtes seulement assuré qu'un navigateur prendra en charge un cookie jusqu'à 4096 octets par cookie (mesuré par la somme de la longueur du nom, de la valeur et des attributs du cookie). À moins que vous ne stockiez beaucoup de données dans le jeton, vous ne devriez pas avoir de problème, mais c'est toujours quelque chose à considérer. Oui, vous pouvez également diviser un jeton JWT en plusieurs cookies, mais les choses commencent à devenir plus complexes.

De plus, les cookies ont leur notion d'expiration, alors gardez cela à l'esprit également parce que le JWT lui-même, lorsqu'il est utilisé dans le cadre de l'authentification, aura également sa propre notion d'expiration.

Enfin, je veux juste répondre à certaines de vos préoccupations concernant le stockage du JWT dans localStorage/sessionStorage. Vous avez raison, si vous le faites, vous devez comprendre son implication, par exemple, tout code Javascript dans le domaine auquel le stockage est associé pourra lire le jeton. Cependant, les cookies HTTP uniquement ne sont pas non plus une solution miracle. Je voudrais lire l'article suivant: Cookies vs Tokens: The Definitive Guide .

Il se concentre sur les différences entre les cookies d'identification de session traditionnels et les systèmes d'authentification à base de jetons (JWT), la section nommée Où stocker les jetons? garantit une lecture car elle aborde les aspects liés à la sécurité de espace de rangement.

Un résumé pour les gens de TL: DR:

Deux des vecteurs d'attaque les plus courants auxquels sont confrontés les sites Web sont Cross Site Scripting (XSS) et Cross Site Request Forgery (XSRF ou CSRF). Cross Site Scripting) se produisent lorsqu'une entité extérieure est en mesure d'exécuter du code sur votre site Web ou votre application. (...)

Si un attaquant peut exécuter du code sur votre domaine, vos jetons JWT ( dans le stockage local) sont vulnérables. (...)

Les attaques de type Cross Site Request Forgery ne sont pas un problème si vous utilisez JWT avec un stockage local. D'autre part, si votre cas d'utilisation vous oblige à stocker le JWT dans un cookie, vous devrez vous protéger contre XSRF.

(c'est moi qui souligne)

13
João Angelo

Oui, cela ne nécessiterait aucun intercepteur d'authentification. Le navigateur enverra un cookie à la même origine qui l'a défini pour chaque demande.

0
Sudheer Muhammed