web-dev-qa-db-fra.com

Authentification: utilisation de JWT vs session

Quel est l'avantage de JWT par rapport à l'utilisation de session dans des situations telles que l'authentification?

est-ce utilisé comme approche autonome ou utilisé dans la session?

83
Pourya8366

JWT n'a aucun avantage à utiliser des "sessions" à proprement parler. Les JWT permettent de conserver l'état de session sur le client au lieu de le faire sur le serveur.

Ce que les gens veulent dire souvent en posant cette question est "Quels sont les avantages de l'utilisation de JWT par rapport à l'utilisation de sessions côté serveur"

Avec les sessions côté serveur, vous devez soit stocker l'identifiant de session dans une base de données, soit le garder en mémoire et vous assurer que le client frappe toujours sur le même serveur. Les deux ont des inconvénients. Dans le cas de la base de données (ou d'un autre stockage centralisé), cela devient un goulot d'étranglement et une chose à maintenir - il s'agit essentiellement d'une requête supplémentaire à effectuer à chaque demande.

Avec une solution en mémoire, vous limitez votre mise à l'échelle horizontale et les sessions sont affectées par des problèmes de réseau (clients en itinérance entre Wifi et données mobiles, redémarrage de serveurs, etc.).

Le déplacement de la session vers le client signifie que vous supprimez la dépendance d'une session côté serveur, mais que cela impose son propre ensemble de défis.
- Stocker le jeton en toute sécurité
- le transporter en toute sécurité
- Les sessions de JWT peuvent parfois être difficiles à invalider.
- Faire confiance à la demande du client.

Ces problèmes sont partagés par les JWT et autres mécanismes de session côté client.

JWT en particulier aborde le dernier d'entre eux. Il peut être utile de comprendre ce qu'est un JWT:

C'est un peu d'information. Pour les sessions utilisateur, vous pouvez inclure le nom d'utilisateur et l'heure d'expiration du jeton. Mais ce pourrait être n'importe quoi, même l'identifiant de session ou le profil complet de l'utilisateur. (Merci de ne pas le faire cependant) Il possède une signature sécurisée empêchant les parties malveillantes de générer de faux jetons (vous devez accéder à la clé privée du serveur pour les signer et vous pouvez vérifier qu'elles n'ont pas été modifiées après leur signature.) envoyez-les à chaque demande, exactement comme si un cookie ou Authorization était envoyé. En fait, ils sont généralement envoyés dans l'en-tête HTTP Authorization, mais l'utilisation d'un cookie convient également.

Le jeton est signé et le serveur peut donc vérifier son origine. Nous supposerons que le serveur fait confiance à sa propre capacité à signer de manière sécurisée (vous devez utiliser une bibliothèque standard: n'essayez pas de le faire vous-même et ne sécurisez pas le serveur correctement).

En ce qui concerne le transport sécurisé du jeton, la réponse consiste généralement à l'envoyer via un canal crypté, généralement httpS.

En ce qui concerne le stockage sécurisé du jeton dans le client, vous devez vous assurer que les personnes malveillantes ne peuvent pas y accéder. Cela signifie (principalement) empêcher JS des sites Web malveillants de lire le jeton pour le leur renvoyer. Ceci est atténué en utilisant les mêmes stratégies que celles utilisées pour atténuer d'autres types d'attaques XSS.

Si vous avez besoin d'invalider les JWT, il existe certainement des moyens d'y parvenir. Stocker une époque par utilisateur uniquement pour les utilisateurs ayant demandé la fin de leurs "autres sessions" est une méthode très efficace qui sera probablement suffisante. Si une application nécessite une invalidation par session, un ID de session peut être conservé de la même manière et la table des "jetons tués" peut être maintenue beaucoup plus petite que la table des utilisateurs complets (il vous suffit de conserver les enregistrements plus récents que les La plus longue durée de vie autorisée d'un jeton.) Ainsi, la possibilité d'invalider le jeton annule partiellement l'avantage des sessions côté client en ce sens que vous devez conserver cet état de session terminée. Il s'agira probablement d'une table beaucoup plus petite que la table d'état de la session d'origine, de sorte que les recherches sont toujours plus efficaces.

Un autre avantage de l'utilisation des jetons JWT est qu'il est relativement facile de l'implémenter à l'aide de bibliothèques disponibles dans presque toutes les langues auxquelles vous pouvez vous attendre. Il est également complètement dissocié de votre schéma d'authentification d'utilisateur initial. Si vous passez à un système à empreinte digitale, vous n'avez pas besoin de modifier le schéma de gestion de session.

Un avantage plus subtil: comme le JWT peut transporter des "informations" et que le client peut y accéder, vous pouvez maintenant commencer à faire des choses intelligentes. Par exemple, rappelez à l'utilisateur que sa session expirera quelques jours avant sa déconnexion, en lui donnant la possibilité de s'authentifier à nouveau, en fonction de la date d'expiration indiquée dans le jeton. Quoi que vous puissiez imaginer.

En bref, JWT répond à certaines des questions et faiblesses d’autres techniques de session.
1. Authentification "moins chère", car vous pouvez éliminer un aller-retour dans la base de données (ou au moins une table beaucoup plus petite à interroger!), Ce qui permet une évolutivité horizontale.
2. Revendications côté client inviolables.

Bien que JWT ne réponde pas aux autres problèmes tels que le stockage ou le transport sécurisé, il n'introduit aucun nouveau problème de sécurité.

Il y a beaucoup de négativité autour des JWT, mais si vous implémentez la même sécurité que vous le feriez pour d'autres types d'authentification, tout ira bien.

Une dernière remarque: ce ne sont pas non plus des cookies vs des jetons. Les cookies sont un mécanisme permettant de stocker et de transporter des bits d’information. Ils peuvent également être utilisés pour stocker et transporter des jetons JWT.

144
The Tahaan

La réponse courte est: Aucune.

Une version plus longue est:

J'ai implémenté JWT pour la gestion de session après avoir lu cette recommandation dans la documentation GraphQL :

Si vous ne connaissez pas l'un de ces mécanismes d'authentification, nous vous recommandons d'utiliser express-jwt car c'est simple sans sacrifier la flexibilité future.

La mise en œuvre était en effet simple car elle ne faisait qu'ajouter un peu de complexité. Après un certain temps, cependant (comme vous), j'ai commencé à me demander quels étaient les avantages. Il s'avère qu'il y a très peu (voire aucun) JWT en termes de gestion de session, comme l'explique en détail ce billet de blog:

Arrêtez d'utiliser JWT pour les sessions

27
Carl von Blixen