JSON Web Token (JWT) : Le guide complet

PrimFX Boris ('PrimFX') Le 19 juin 2020

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é.

 

Si un jeton expire au bout de 15 minutes, ça veut dire que l’utilisateur devra se reconnecter à chaque fois ?

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.

 

Mais alors, plutôt que d’utiliser un second JWT, pourquoi ne pas simplement rallonger la durée de vie du JWT standard ?

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 :

Schéma de fonctionnement d'un Refresh Token

 

Dans tous les cas, il faut toujours se poser la question suivante : « Comment puis-je révoquer les droits d’un utilisateur en cas de problème ? » Dans le cas d’un double JWT standard/refresh token, il sera par exemple important de stocker le refresh token de l’utilisateur en base de données afin non seulement de vérifier sa correspondance à un utilisateur mais surtout pour pouvoir lui aussi le révoquer manuellement si nécessaire. De cette façon, l’utilisateur ne pourra plus se servir de ce refresh token pour générer un nouveau JWT !


A propos de l'auteur

PrimFX
Boris ('PrimFX')

Je m'appelle Boris, j'ai 22 ans et je suis passionné d'informatique. Suite à mes études (Licence Informatique puis MSc Computer Science au Trinity College Dublin), je gère l'entreprise Single Quote co-fondée en 2019 et je profite de mon temps libre pour partager ma passion à travers des vidéos & articles 😃