Je voudrais ajouter une autre perspective à cela.
Authentification sans état sans accéder à la base de données à chaque requête
Supposons que vous souhaitiez créer un mécanisme de sécurité sans état (sans session) qui puisse authentifier des millions d'utilisateurs, sans avoir à faire un appel à la base de données pour l'authentification. Avec tout le trafic que votre application génère, économiser un appel à la base de données à chaque requête vaut beaucoup! Et cela doit être sans état afin de pouvoir facilement être mis en grappe et étendu à des centaines, voire des milliers de serveurs.
Avec les sessions à l'ancienne, l'utilisateur se connecte, à ce moment-là, nous lisons ses informations utilisateur dans la base de données. Pour éviter de devoir le relire encore et encore, nous le stockons dans une session (généralement en mémoire ou dans un cache en grappe). Nous envoyons l'ID de session au client dans un cookie, qui est attaché à toutes les requêtes suivantes. Lors des requêtes suivantes, nous utilisons l'ID de session pour rechercher la session, qui contient à son tour les informations utilisateur.
Placez les informations utilisateur directement dans le jeton d'accès
Mais nous ne voulons pas de sessions. Donc, au lieu de stocker les informations utilisateur dans la session, mettons-les simplement dans un jeton d'accès. Nous signons le jeton pour que personne ne puisse le falsifier et voilà. Nous pouvons authentifier les requêtes sans session et sans avoir à rechercher les informations utilisateur dans la base de données pour chaque requête.
Pas de session ... pas moyen de bannir des utilisateurs?
Mais ne pas avoir de session a un gros inconvénient. Que se passerait-il si cet utilisateur est banni par exemple? Dans l'ancien scénario, nous supprimons simplement sa session. Il devra alors se reconnecter, ce qu'il ne pourra pas faire. Ban terminé. Mais dans le nouveau scénario, il n'y a pas de session. Comment pouvons-nous le bannir? Nous devrions lui demander (très poliment) de supprimer son jeton d'accès. Vérifier chaque requête entrante contre une liste de bannissement? Oui, cela fonctionnerait, mais maintenant nous devrions à nouveau effectuer cet appel à la base de données que nous ne voulons pas.
Compromis avec des jetons à durée de vie courte
Si nous pensons qu'il est acceptable qu'un utilisateur puisse toujours utiliser son compte, disons, pendant 10 minutes après avoir été banni, nous pouvons créer une situation qui est un compromis entre vérifier la base de données à chaque requête et uniquement à la connexion. C'est là que les jetons de rafraîchissement interviennent. Ils nous permettent d'utiliser un mécanisme sans état avec des jetons d'accès de courte durée de vie. Nous ne pouvons pas révoquer ces jetons car aucun contrôle de base de données n'est effectué pour eux. Nous ne vérifions que leur date d'expiration par rapport à l'heure actuelle. Mais une fois qu'ils expirent, l'utilisateur devra fournir le jeton de rafraîchissement pour obtenir un nouveau jeton d'accès. À ce stade, nous vérifions la base de données et constatons que l'utilisateur a été banni. Nous refusons donc la demande d'un jeton d'accès et le bannissement prend effet.