Authentification: JWT usage vs session

Quel est l'avantage de JWT sur l'utilisation de session dans des situations comme l'authentification?

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

41
demandé sur Pourya8386 2017-04-17 16:55:09

2 réponses

JWT n'a pas d'avantage sur l'utilisation de "sessions" par exemple. Les JWTs fournissent un moyen de maintenir l'état de session sur le client au lieu de le faire sur le serveur.

ce que les gens veulent souvent dire quand ils demandent ceci est " Quels sont les avantages d'utiliser JWTs au lieu d'utiliser côté Serveur sessions"

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

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

déplacer la session vers le client signifie que vous supprimez dépendance à une session côté serveur, mais elle impose sa propre série de défis.

- Stocker le jeton en toute sécurité

- le transport en toute sécurité

- Les Sessions JWTs peuvent parfois être difficiles à invalider.

- Faire confiance à la réclamation du client.

ces questions sont partagées par les Tjsf et d'autres mécanismes de session côté client.

JWT en particulier adresse le dernier de ceux-ci. Il peut aider à comprendre ce QU'une JWT est:

c'est un peu d'information. Pour les sessions utilisateur, vous pouvez inclure le nom d'utilisateur et la date d'expiration du token. 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 si) Il a obtenu une signature sécurisée qui empêche les parties malveillantes de générer de faux jetons (vous avez besoin d'accéder à 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 aient été signés) Vous les envoyez avec chaque requête, comme un cookie ou Authorization L'en-tête serait envoyé. En fait, ils sont généralement envoyés dans le HTTP Authorization en-tête mais utiliser un cookie est très bien aussi.

le token est signé et ainsi le serveur peut vérifier son origine. Nous supposerons que le serveur fait confiance à sa propre capacité de signer en toute sécurité (vous devriez utiliser une bibliothèque standard: n'essayez pas de le faire vous-même, et de sécuriser le serveur correctement)

sur la question du transport sécurisé du jeton, la réponse est généralement pour 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 méchants ne peuvent pas y accéder. Cela (principalement) signifie empêcher JS de mauvais sites Web de lire le jeton pour le leur renvoyer. 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 un besoin d'invalider JWTs, il y a certainement des moyens d'y parvenir. Stocker une époque par utilisateur pour seuls les utilisateurs qui ont demandé que leurs "autres sessions se terminent" sont une méthode très efficace qui sera probablement suffisante. Si une application a besoin d'une invalidation par session, alors un ID de session peut être maintenu de la même manière et la table "killed tokens" peut encore être maintenue pour être beaucoup plus petite que la table d'utilisateur complète (vous n'avez besoin de conserver que des enregistrements plus récents que la plus longue durée de vie autorisée du jeton).) De sorte que la capacité d'invalider le jeton partiellement annule le bénéfice de sessions côté client en ce que vous devez maintenir cette session état tué. Ce sera plus que probablement une table beaucoup plus petite que la table d'état de session originale, donc les recherches sont encore plus efficaces.

un autre avantage d'utiliser des tokens JWT est qu'il est raisonnablement facile d'implémenter en utilisant des bibliothèques disponibles probablement dans toutes les langues que vous pouvez vous attendre à avoir. Il est également complètement séparé de votre schéma initial d'authentification de l'utilisateur - si vous passez à un vous n'avez pas besoin de modifier le schéma de gestion de session.

un avantage plus subtil: parce que la 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 d'être déconnectée, ce qui lui donnera la possibilité de se réauthentifier, en fonction de la date d'expiration du token. Tout ce que vous pouvez imaginer.

Donc dans en bref: JWTs répond à certaines des questions et lacunes des autres techniques de session.

1. Authentification "moins chère" parce que vous pouvez éliminer un aller-retour DB (ou au moins avoir une table beaucoup plus petite à interroger!), qui s'activer évolutivité horizontale.

2. Des revendications côté client inviolables.

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

beaucoup de la négativité existe autour de JWTs mais si vous implémentez la même sécurité que vous le feriez pour d'autres types d'authentification, vous vous en sortirez très bien.

une dernière remarque: il ne s'agit pas non plus de Cookies par rapport aux Tokens. Les Cookies sont un mécanisme de stockage et de transport de bits d'information et peuvent également être utilisés pour stocker et transporter des jetons JWT.

74
répondu The Tahaan 2017-07-21 21:01:11

La réponse courte est: Aucun.

Une version plus longue est:

j'ai mis en œuvre JWTs pour la gestion des sessions après avoir lu cette recommandation dans the GraphQL docs:

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

la mise en oeuvre a été en effet simple car elle a seulement ajouté un peu de complexité. Au bout d'un certain temps, cependant, j'ai commencé (comme vous) à me demander quels étaient les avantages. Il s'avère qu'il y en a très peu (ou peut-être Aucun) pour JWT en ce qui concerne la gestion des sessions, comme l'explique en détail ce billet de blog:

Arrêt à l'aide de JWT pour les sessions

10
répondu Carl von Blixen 2017-07-20 13:11:15