264 votes

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-il utilisé comme approche autonome ou utilisé dans la session?

428voto

The Tahaan Points 1307

JWT ne pas avoir un avantage sur l'utilisation de "sessions" à proprement parler. JWTs de fournir des moyens de maintien de l'état de session sur le client au lieu de le faire sur le serveur.

Ce que les gens signifient souvent lors de la demande c'est "Quels sont les avantages de l'utilisation de JWTs sur l'utilisation de Serveur-côté sessions"

Côté serveur séances vous seront, soit pour stocker l'identifiant de session dans une base de données, ou bien le garder en mémoire et assurez-vous que le client atteint toujours le même serveur. Ces deux ont des inconvénients. Dans le cas de la base de données (ou d'autres centralisé de stockage), cela devient un goulot d'étranglement et une chose à maintenir essentiellement une requête supplémentaire à faire avec chaque demande.

Avec une solution de mémoire vous de limiter votre mise à l'échelle horizontale, et les séances seront touchés par les problèmes de réseau (clients de l'itinérance entre le Wifi et les données mobiles, le redémarrage des serveurs, etc)

Le déplacement de la session sur le client signifie que vous retirez de la dépendance à l'égard d'une session côté serveur, mais il impose son propre ensemble de défis.
- Stocker le jeton en toute sécurité
- le transport en toute sécurité
- JWTs Séances peut être parfois difficile de les invalider.
- Faire confiance à la réclamation du client.

Ces questions sont partagées par les JWTs et d'autres session côté client mécanismes semblables.

JWT, en particulier, aborde la dernière de ces. Il peut aider à comprendre ce qu'est un JWT est:

C'est un bit d'information. Pour les sessions de l'utilisateur vous pouvez inclure le nom d'utilisateur et le moment de l'expiration de ce jeton. Mais cela pourrait être n'importe quoi, même l'ID de session ou de l'ensemble du profil. (Merci de ne pas le faire tout de même) Il a obtenu une signature sécurisée qui empêche les logiciels malveillants parties de générer de faux jetons (Vous devez avoir accès à la clé privée du serveur pour les signer, et vous pouvez vérifier qu'ils n'ont pas été modifiés après qu'ils ont été signés) Vous envoyez avec toutes les demandes, comme un cookie ou Authorization - Tête serait envoyé. En fait, ils sont souvent envoyés dans le HTTP Authorization - tête, mais en utilisant un cookie est bien aussi.

Le jeton est signé et donc, le serveur peut vérifier son origine. Nous supposons que le serveur fiducies de sa propre capacité à signer en toute sécurité, vous devez utiliser une bibliothèque standard: ne pas essayer de le faire vous-même, et de sécuriser le serveur correctement)

Sur la question avec transport sécurisé de l'jeton la réponse est généralement de l'envoyer via un canal crypté, généralement httpS.

Concernant le stockage en toute sécurité le jeton dans le client, vous devez vous assurer que les méchants ne peuvent pas l'obtenir. Ce (pour la plupart) des moyens de prévention de la JS de mauvais sites web à partir de la lecture du jeton à envoyer de nouveau à eux. C'est atténués en utilisant les mêmes stratégies utilisées pour atténuer d'autres types d'attaques XSS.

Si vous avez besoin d'invalider JWTs il y a certainement des façons cela peut être réalisé. Le stockage par utilisateur époque uniquement pour les utilisateurs qui ont demandé à avoir accès à leur "autres sessions résilié" est une méthode très efficace qui sera probablement assez bon. Si une application a besoin par session invalidation, puis un ID de session peuvent être maintenues dans la même manière et les "tué jetons" table peut toujours être maintenue à être beaucoup plus petite que l'utilisateur complète le tableau (Vous avez seulement besoin de conserver des dossiers plus récents que le plus long autorisé durée de vie du jeton.) De sorte que la capacité d'invalider le jeton partiellement réduit à néant l'avantage de client-côté sessions que vous auriez à maintenir cette session tué état. Ce sera plus que probablement être beaucoup plus petite table à la session d'origine de la table d'état, de sorte que les recherches sont de plus en plus efficace.

Un autre avantage de l'utilisation de JWT jetons, c'est qu'il est assez facile à mettre en œuvre à l'aide de bibliothèques probablement disponible dans toutes les langues, vous pouvez vous attendre à avoir. Il est également complètement dissociée de votre première authentification de l'utilisateur régime - si vous déplacez un doigt d'impression en fonction du système que vous n'avez pas besoin de faire des changements à la session de gestion de dispositif.

Plus subtil avantage: Parce que le JWT peut faire "l'information" et ce peut être consulté par le client, vous pouvez maintenant commencer à faire quelques choses intelligentes. Par exemple, rappeler à l'utilisateur que la session se terminera quelques jours avant qu'elles ne sont pas en session, en leur donnant la possibilité de s'authentifier à nouveau, basé sur la date de péremption dans le jeton. Tout ce que vous pouvez imaginer.

Donc en bref: JWTs répond à certaines des questions et des lacunes de la session d'autres techniques.
1. "Moins cher" authentification parce que vous pouvez éliminer une DB aller-retour (ou au moins d'avoir une beaucoup plus petite table de requête!), qui s'activer évolutivité horizontale.
2. Inviolable côté client revendications.

Alors que JWTs ne pas répondre aux autres questions comme sécurisé de stockage ou de transport, il n'introduit pas de nouveaux problèmes de sécurité.

Beaucoup de négativité existe autour de JWTs mais si vous mettez en œuvre la même sécurité que vous le feriez pour d'autres types d'authentification, vous serez amende.

Une dernière remarque: Il n'est également pas les Cookies vs Jetons. Les Cookies est un mécanisme de stockage et de transport des bits d'information et peuvent être utilisés pour stocker et transporter JWT jetons de trop.

61voto

Carl von Blixen Points 379

La réponse courte est: Aucun.

Une version plus longue est:

J'ai mis en place JWTs pour la gestion de session après la lecture de cette recommandation dans le GraphQL docs:

Si vous n'êtes pas familier avec l'un de ces mécanismes d'authentification, nous vous recommandons d'utiliser express-jwt parce que c'est simple, sans sacrifier la tout l'avenir de la flexibilité.

La mise en œuvre est en effet simple qu'il ne fait qu'ajouter un peu de complexité. Après un certain temps, cependant, j'ai (comme vous) a commencé à se demander ce que les avantages ont été. Il s'avère que très peu (ou aucune) pour JWT autant que la gestion de session va, comme ce blog explique en détail:

Cesser d'utiliser JWT pour les sessions

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X