Qu'est-ce que JWT (JSON Web Token) ?

Format qui permet de transmettre, accompagnées d'une signature, des informations au format JSON (des claims). Les trois parties « en-tête.charge utile.signature » sont chacune codées en Base64URL et reliées par des « . ». La signature permet de vérifier l'absence de falsification et l'émetteur, mais dans un JWT signé ordinaire la charge utile n'est pas chiffrée : on n'y met donc pas d'informations secrètes. Il sert notamment pour les jetons d'accès utilisés pour l'authentification auprès des API et pour les jetons d'identité d'OpenID Connect, souvent avec une date d'expiration (exp) courte.

Nom japonais: JWT(JSON Web Token)

« JWT (JSON Web Token) » apparaît dans 2 questions d'entraînement réparties sur 1 thèmes, dont Bases des technologies web.

Domaine: Bases des technologies web

Les trois parties

L'en-tête contient l'algorithme de signature (par exemple HS256) et le type ; {"alg":"HS256","typ":"JWT"} codé en Base64URL donne eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. La charge utile contient des claims comme l'identifiant de l'utilisateur (sub), l'émetteur (iss) et la date d'expiration (exp). La signature est calculée sur l'en-tête et la charge utile codés et reliés par un « . », par un HMAC avec une clé secrète partagée ou avec la clé privée d'une cryptographie à clé publique.

Vérification par le serveur

Le serveur qui reçoit un JWT vérifie la signature avec la clé, puis contrôle que les claims comme la date d'expiration ou le destinataire (aud) satisfont aux conditions. Il est important de ne pas se fier tel quel au champ alg de l'en-tête et de n'accepter que l'algorithme choisi par le serveur. Une fois la signature vérifiée, le serveur peut savoir à qui le jeton a été émis sans avoir conservé d'informations de session.

Précautions d'emploi

Un JWT étant difficile à révoquer après son émission, on lui donne généralement une durée de validité courte et, pour un usage prolongé, on en émet un nouveau à l'aide d'une autre valeur réservée au renouvellement. La charge utile étant lisible par n'importe qui, on n'y met pas d'informations secrètes. Selon l'endroit où il est conservé dans le navigateur, il risque d'être volé par XSS.

S'entraîner : questions sur JWT (JSON Web Token)

Quelle description d'un JWT (JSON Web Token) signé typique est correcte ?

  1. ALa charge utile est chiffrée avec la clé de signature : même si l'on y met un mot de passe ou un numéro de carte bancaire, il ne peut pas être lu en chemin
  2. BMême un jeton expiré doit être accepté par le serveur si sa signature est correcte, puisqu'il n'a pas été falsifié
  3. CC'est un en-tête, une charge utile et une signature codés en Base64URL et reliés par des « . » ; la signature permet de détecter une falsification, mais le contenu n'est pas chiffré
Afficher la réponse et l'explication

Réponse : C. C'est un en-tête, une charge utile et une signature codés en Base64URL et reliés par des « . » ; la signature permet de détecter une falsification, mais le contenu n'est pas chiffré

Un JWT comporte trois parties, « en-tête.charge utile.signature » : l'en-tête contient l'algorithme de signature (par exemple HS256), et la charge utile des informations (claims) comme l'identifiant de l'utilisateur et la date d'expiration (exp). La signature est calculée à partir de l'en-tête et de la charge utile avec une clé secrète ; le serveur qui reçoit le jeton peut ainsi vérifier que le contenu n'a pas été falsifié et qui l'a émis. Cependant, Base64URL n'est pas un chiffrement : n'importe qui peut le décoder et le lire, et l'on n'y met donc aucune information secrète. Pour l'envoyer à une API, on place généralement le jeton après Authorization: Bearer.

Questions fréquentes

Faut-il utiliser un JWT ou un identifiant de session ?

Un identifiant de session n'est qu'une clé qui permet de retrouver des informations conservées sur le serveur ; une déconnexion ou une invalidation se répercute donc immédiatement côté serveur. Un JWT peut être vérifié sans que le serveur conserve d'informations, ce qui convient aux échanges entre plusieurs services, mais il a le défaut d'être difficile à révoquer. Pour la connexion à un seul site web, l'identifiant de session est souvent plus simple à gérer.

Quelle est la différence entre Base64URL et Base64 ?

Base64URL est une variante de Base64 qui remplace « + » et « / », qui ont un sens particulier dans les URL, par « - » et « _ », et qui omet souvent les « = » finaux. Les JWT utilisent ce format pour pouvoir être placés tels quels dans une URL ou un en-tête HTTP. Aucun des deux n'est un chiffrement : n'importe qui peut revenir aux données d'origine.

« JWT (JSON Web Token) » dans les explications

Questions mentionnant « JWT (JSON Web Token) » (2)

  1. Quelle description d'un JWT (JSON Web Token) signé typique est correcte ?
  2. Quelle description de la relation entre OAuth 2.0 et OpenID Connect est correcte ?

Termes associés

OAuth API REST Boucle d'événements (event loop) Code d'état HTTP Cookie (cookie HTTP) CORS (partage des ressources entre origines) DOM (Document Object Model) HTTP (Hypertext Transfer Protocol) JSON (JavaScript Object Notation) Méthode HTTP

Retour au glossaire