Les avantages de JSON Web Token (JWT) par rapport à un token de session de base de données
avec un système de token de session de base de données je pourrais avoir une connexion d'utilisateur avec un nom d'utilisateur / mot de passe, le serveur pourrait générer un token (un uuid par exemple) et le stocker dans la base de données et retourner ce token au client. Chaque demande d'y inclure le jeton et le serveur de vérifier si le jeton est valide et que l'utilisateur auquel il appartient.
en utilisant JWT il ne serait pas nécessaire de sauvegarder quoi que ce soit dans la base de données en ce qui concerne les sessions/tokens grâce à la combinaison de la clé secrète conservée sur le serveur et le jeton signé que le client garde et envoie avec chaque requête.
c'est bien mais en plus de sauvegarder une base de données vérifiez chaque requête (ce qui serait rapide de toute façon puisque c'est juste vérifier une table de hachage) ce n'est pas clair pour moi quels sont les avantages d'utiliser JWT. Pouvez-vous quelqu'un de familier avec cette expliquer? ignorons les cookies, c'est spécifiquement un token personnalisé de base de données comme décrit ci-dessus et JWT que j'essaie de comparer et de comprendre les avantages.
2 réponses
la principale différence est la taille de stockage de session et le travail de recherche requis à partir du serveur:
côté serveur, JWT stocke un dans la mémoire (ou dans le fichier de config) - appelé clé secrète. Cette clé a deux objectifs, elle permet de créer de nouveaux jetons chiffrés et elle fonctionne aussi comme une clé principale qui "ouvre toutes les serrures"- ou dans la vie réelle vérifie tous les jetons. En conséquence, le serveur répond beaucoup plus rapidement aux requêtes auth, parce que cela n'a pas d'importance si vous avez deux ou deux millions d'utilisateurs connectés - le même nombre d'enregistrements (UN, la clé du serveur) sera utilisé pour authentifier toutes les requêtes des clients.
Traditionnel d'authentification qui stocke les sessions utilisateur dans une base de données, crée un enregistrement dans la base de données pour chaque utilisateur, ce qui entraîne plusieurs touches. Donc, si vous avez deux millions d'utilisateurs connectés, le serveur va créer deux millions de dossiers et avec chaque demande de client le serveur doit localiser l'enregistrement de session concerné dans la base de données*.
JWT laisse au client le soin de stocker et de gérer l'ensemble de la session/l'objet utilisateur. Il est en fait beaucoup plus logique parce que chaque client gère ses propres données seulement, de sorte qu'il ne provoque pas de levage lourd pour le côté du client non plus.
pour ce que vous avez écrit dans votre dernier paragraphe, il n'est pas seulement db appels que nous enregistrons ici. JWT est en réalité beaucoup plus évolutive en raison de son indépendance et de sa légèreté, il ne tombe pas en panne lorsque les requêtes auth s'empilent et il permet au serveur de gérer les périphériques et les services auth accross sans Gérer les sessions du côté serveur.
du point de vue de la sécurité cependant, les sessions db ont sans doute le dessus: elles peuvent être plus sûres parce que de cette latence, et sont également moins vulnérables au détournement de session après la déconnexion de l'utilisateur.
*la méthode db stored sessions peut être optimisée avec la mise en cache efficace et en stockant seulement l'id de session (par opposition à l'objet utilisateur entier) dans un serveur de clés/valeurs rapide tel que Redis. Cela dit, je choisirais quand même la méthode JWT plutôt que la méthode db dans la plupart des cas.
un JSON based token(JWT) surmonte les problèmes suivants:
- problèmes avec les Mobiles: les applications mobiles natives semblent avoir des problèmes avec les cookies, donc si nous devons interroger une API distante, peut-être que session auth n'est pas la meilleure solution.
- questions CSRF: si vous suivez la méthode des cookies, vous devez avoir CSRF pour éviter les requêtes intersite.
mais JWT n'utilise pas de sessions, n'a pas de problèmes avec le mobile, il n'a pas besoin de CSRF et il fonctionne très bien avec CORS aussi. Si vous n'avez pas de jeton valide, Vous ne pouvez rien faire.
un de plus car ce token est stocké dans le stockage local client/session de sorte que vous pouvez passer ces tokens à d'autres clients mais vous devez partager le même justificatif d'identité que vous avez utilisé pour générer ce JWT.