(engendré à partir de ce fil car c'est vraiment une question en soi et non spécifique à NodeJS, etc.)
J'implémente un serveur API REST avec authentification et j'ai implémenté avec succès la gestion des jetons JWT afin qu'un utilisateur puisse se connecter via un point de terminaison / login avec un nom d'utilisateur / mot de passe, sur lequel un jeton JWT est généré à partir d'un secret de serveur et renvoyé au client. Le jeton est ensuite passé du client au serveur dans chaque demande d'API authentifiée, sur laquelle le secret du serveur est utilisé pour vérifier le jeton.
Cependant, j'essaie de comprendre les meilleures pratiques pour savoir exactement comment et dans quelle mesure le jeton doit être validé, pour créer un système vraiment sécurisé. Que faut-il impliquer exactement dans la «validation» du jeton? Est-il suffisant que la signature puisse être vérifiée à l'aide du secret du serveur, ou dois-je également contre-vérifier le jeton et / ou la charge utile du jeton par rapport à certaines données stockées sur le serveur?
Un système d'authentification basé sur des jetons ne sera aussi sûr que de transmettre un nom d'utilisateur / mot de passe dans chaque demande à condition qu'il soit tout aussi ou plus difficile d'obtenir un jeton que d'obtenir le mot de passe d'un utilisateur. Cependant, dans les exemples que j'ai vus, les seules informations requises pour produire un jeton sont le nom d'utilisateur et le secret côté serveur. Cela ne signifie-t-il pas qu'en supposant pendant une minute qu'un utilisateur malveillant acquiert la connaissance du secret du serveur, il peut maintenant produire des jetons au nom de n'importe quel utilisateur, ayant ainsi accès non seulement à un utilisateur donné, comme le serait le fait si un mot de passe était obtenu, mais en fait à tous les comptes d'utilisateurs?
Cela m'amène aux questions:
1) La validation du jeton JWT devrait-elle être limitée à la vérification de la signature du jeton lui-même, en s'appuyant uniquement sur l'intégrité du secret du serveur, ou accompagnée d'un mécanisme de validation distinct?
Dans certains cas, j'ai vu l'utilisation combinée de jetons et de sessions serveur où, lors d'une connexion réussie via le point de terminaison / login, une session est établie. Les demandes d'API valident le jeton et comparent également les données décodées trouvées dans le jeton avec certaines données stockées dans la session. Cependant, utiliser des sessions signifie utiliser des cookies et, dans un certain sens, cela va à l'encontre de l'objectif d'utiliser une approche basée sur des jetons. Cela peut également causer des problèmes à certains clients.
On pourrait imaginer que le serveur garde tous les jetons actuellement utilisés dans un cache mémoire ou similaire, pour s'assurer que même si le secret du serveur est compromis de sorte qu'un attaquant puisse produire des jetons «valides», seuls les jetons exacts qui ont été générés via le point de terminaison / login serait accepté. Est-ce raisonnable ou simplement redondant / exagéré?
2) Si la vérification de la signature JWT est le seul moyen de valider les jetons, ce qui signifie que l'intégrité du secret du serveur est le point de rupture, comment les secrets du serveur doivent-ils être gérés? Lire à partir d'une variable d'environnement et créé (aléatoire?) Une fois par pile déployée? Renouvelé ou pivoté périodiquement (et si tel est le cas, comment gérer les jetons valides existants qui ont été créés avant la rotation mais qui doivent être validés après la rotation, peut-être suffit-il si le serveur conserve le secret actuel et le secret précédent à un moment donné) ? Autre chose?
Peut-être que je suis simplement trop paranoïaque en ce qui concerne le risque de compromission du secret du serveur, ce qui est bien sûr un problème plus général qui doit être résolu dans toutes les situations cryptographiques ...
RSAPrivateKey privateKey
??