web-dev-qa-db-fra.com

Le jeton JWT doit-il être stocké dans un cookie, un en-tête ou un corps

Quel est le moyen le plus sûr de stocker le transfert et de stocker un jeton JWT, ou tout jeton d'authentification en général?

Quelqu'un m'a dit que l'envoi du jeton d'authentification en tant que cookie était sécurisé, mais je ne comprends pas comment cela fournirait une sécurité supplémentaire par rapport à l'utilisation d'un cookie d'ID de session simple pour l'authentification, car le navigateur inclurait de toute façon ce cookie pour toutes les demandes sortantes. . Ai-je mal compris quelque chose?

Ce qui est beaucoup plus logique pour moi, c'est que le jeton soit stocké dans un en-tête ou un corps de réponse, puis extrait du côté client par programmation et ajouté manuellement à chaque demande. Il n'y aurait aucun moyen d'intercepter le jeton via une connexion HTTPS et les attaques CSRF sont rendues impossibles (j'utiliserais quand même un jeton CSRF). Bien sûr, le jeton d'authentification peut toujours être accessible par une attaque XSS, mais le cookie n'est-il pas également sujet à cette attaque?

Je ne comprends pas comment le jeton dans un cookie fournit une sécurité supplémentaire sur l'authentification basée sur un cookie d'ID de session simple? Suis-je en manque d'informations?

7
Tuomas Toivonen

En plaçant le jeton dans le cookie et en définissant ce cookie HttpOnly, vous pouvez empêcher l'accès au cookie par un script côté client malveillant (c'est-à-dire XSS) - il n'y a pas d'accès à un cookie HttpOnly à partir de JavaScript, le navigateur le protégera et gérera l'envoi le cookie uniquement à la bonne origine.

https://www.owasp.org/index.php/HttpOnly

6
crovers

Ok, commençons par comprendre ce qu'est JWT (cité sur leur site Web):

Les jetons Web JSON sont une méthode RFC 7519 ouverte et standard de l'industrie pour représenter les revendications en toute sécurité entre deux parties.

JWT.IO vous permet de décoder, vérifier et générer JWT.

Le but de JWT n'est pas de cacher des données, mais de prouver votre identité au serveur. Tout le monde peut décoder le jeton, mais il ne peut pas créer de faux jetons car cela nécessite la clé secrète. Le serveur lèvera une exception lorsqu'il tentera de décoder un faux jeton, car personne ne connaît votre clé privée (j'espère!).

Habituellement, le jeton est envoyé dans l'en-tête d'autorisation, qui ressemble à ceci:

Authorization: Bearer <the token>

Et puis vous avez de nombreuses bibliothèques qui analyseront l'en-tête et extrairont les informations nécessaires pour vous, en fonction de votre langue.

2
Tom

Comme l'ont dit les crovers, vous ne pouvez pas accéder aux cookies HttpOnly avec javascript.

Je ne comprends pas comment le jeton dans un cookie fournit une sécurité supplémentaire sur l'authentification basée sur un cookie d'ID de session simple? Suis-je en manque d'informations?

Ce n'est pas le cas. Le point de JWT n'est pas d'être plus sécurisé que l'ID de session. L'avantage de JWT est que vous n'avez pas besoin de stocker quoi que ce soit côté serveur. Avec l'ID de session, vous devez stocker les sessions quelque part, tandis qu'avec JWT, les données de session sont stockées à l'intérieur du JWT.

1
FINDarkside