Rendre la connexion persistante (Refresh Token)
Comme nous l’avons vu dans la section sur la sécurité des JWT, un jeton peut (ou plutôt doit) expirer au bout d’une certaine durée pour des raisons de sécurité.
En théorie, oui : à chaque fois qu’un jeton expire, l’utilisateur devra se reconnecter pour « demander » au serveur d’en générer un nouveau. Cependant, dans la pratique, il existe entre autre deux solutions qui sont tout à fait viables :
La première consiste à vérifier, côté client, quand a été généré le JWT pour en demander un nouveau au serveur avec une petite marge de sécurité. Par exemple, si la durée de vie d’un JWT est de 15 minutes, alors le client pourra demander au serveur de générer un nouveau JWT au bout de 13 ou 14 minutes pour éviter que l’utilisateur ait à se reconnecter manuellement.
La seconde technique, un peu plus complexe (mais aussi plus évolutive), consiste à utiliser un second JWT ayant une durée de vie plus longue (i.e. plusieurs mois ou années) et dont la seule fonction est de permettre au client de demander un nouveau JWT (de courte durée de vie) au serveur : il s’agit d’un Refresh Token.
C’est une question de sécurité. Un des principes du JWT est que ce jeton se suffit à lui-même. En d’autres termes, un JWT est assez sécurisé pour que le serveur puisse s’y fier et déterminer quels sont les droits du client sans avoir à les vérifier en base de données. Ainsi, si un utilisateur perd ses droits (e.g. il a été banni, il a supprimé son compte, etc.), il faut un moyen de les lui révoquer. Et puisqu’un utilisateur perd ses droits à l’expiration de son JWT : plus la durée de vie du jeton est longue, plus il est difficile de supprimer rapidement les droits d’un utilisateur !
D’où l’utilité d’avoir un JWT standard de courte durée de vie ainsi qu’un second JWT (le Refresh Token) de plus longue durée avec pour seul rôle de permettre la génération d’un nouveau JWT standard (et avec dans ce cas la vérification des droits réels de l’utilisateur côté serveur / base de données).
Voici un schéma qui représente le fonctionnement d'un Refresh Token pour générer un nouveau JWT :