web-dev-qa-db-fra.com

Dois-je stocker des jetons JWT dans Redis?

Je construis une application avec ExpressJS, Mongodb (Mogoose). L'application contient des itinéraires où l'utilisateur doit être authentifié avant d'y accéder.

Actuellement, j'ai écrit un middleware express pour faire de même. Ici, avec l'aide du jeton JWT, je fais une requête mongodb pour vérifier si l'utilisateur est authentifié ou non. mais je pense que cela pourrait mettre une charge de demande inutile sur ma base de données.

dois-je intégrer redis pour cette tâche spécifique?
améliorera-t-il les performances de l'API? ou devrait aller de l'avant avec l'approche mongodb existante?

serait utile si j'obtiens plus d'informations à ce sujet.

13
manish keer

TLDR: Si vous voulez pouvoir révoquer le jeton à un moment donné, oui, stockez-le dans quelque chose de rapide comme Redis.

L'un des inconvénients bien documentés de l'utilisation de JWT est qu'il n'existe aucun moyen simple de révoquer un jeton si, par exemple, un utilisateur doit être déconnecté ou si le jeton a été compromis. Révoquer un jeton signifierait le rechercher dans un espace de stockage, puis décider quoi faire ensuite. Étant donné que l'un des points du JWT est d'éviter les allers-retours vers la base de données, un bon compromis serait de le stocker dans quelque chose de moins taxant qu'un rdbms. C'est un travail parfait pour Redis.

Comme suggéré dans les commentaires, une bonne approche consiste à faire de la liste une liste noire (c'est-à-dire une liste de jetons invalidés). À chaque demande, vous recherchez la liste pour vous assurer que le jeton n'y est pas présent. Vous pouvez encore améliorer l'espace mémoire et les performances lors de l'étape de recherche en utilisant un algorithme probabiliste pour stocker le jeton. Une implémentation simple consiste à ne pas stocker l'intégralité du jeton dans la liste noire redis. Stockez simplement les premiers caractères du jeton. Vous pouvez ensuite stocker une version plus complète de la liste noire en utilisant une solution plus persistante (système de fichiers, rdbms, etc.). Il s'agit d'une recherche optimiste qui vous indiquera encore rapidement qu'un jeton n'est pas présent dans la liste noire (ce qui serait le cas le plus courant). Si un jeton recherché correspond à un élément de la liste noire de redis (car ses premiers caractères correspondent), passez à une recherche supplémentaire dans le magasin persistant. Un autre algorithme plus efficace et relativement simple à implémenter est le filtre Bloom.

24
Michael Ekoka

Vous pouvez utiliser Redis pour stocker l'étiquette jwt. Redis est beaucoup plus rapide et pratique pour stocker de telles données. La demande adressée à Redis ne devrait pas affecter considérablement les performances. Vous pouvez essayer la bibliothèque jwt-redis

0
Alexander Natashkin