Le JSON Web Token - JWT

Le JSON Web Token - JWT
Photo by FLY:D / Unsplash

Qu'est-ce qu'un JSON Web Token ?

Le JSON Web Token (JWT) est une norme qui définit un moyen qui se suffit à lui même pour transmettre en toute sécurité des informations entre plusieurs parties en tant qu'objet JSON. Ces informations peuvent être vérifiées et approuvées car elles sont signées numériquement. Les JWT peuvent être signés à l'aide d'un secret (avec l'algorithme HMAC) ou d'une paire de clés publique/privée utilisant RSA ou ECDSA.

Les jetons signés peuvent vérifier l'intégrité des informations qu'ils contiennent et lorsque les jetons sont signés à l'aide de clés publique/privée, la signature certifie également que seule la partie détenant la clé privée est celle qui l'a signée.

Les JWT interviennent majoritairement dans les mécanismes d'autorisation. Une fois que l'utilisateur s'est connecté à l'aide de son identifiant et de son mot de passe, chaque demande ultérieure sera réalisée à l'aide du JWT qui lui permettra d'accéder aux routes ou au services protégés.

Les Single Sign On utilisent très largement les JWT notamment du fait du faible impact réseau et sa capacité à pouvoir être utilisés sur différents domaines.

C’est quoi un SSO (Single Sign On) ?
Découvrez ce qu’est un single sign on, comment cela fonctionne et quelles sont les technologies mises en œuvre

Quelle est la structure d'un JWT ?

Un JSON Web Token contient 3 parties :

  1. Un header
  2. Un payload
  3. Une signature

Il est souvent représenté sous cette forme :

xxxxx.yyyyy.zzzzz

Le header contient généralement deux parties :

  1. Le type de jeton (JWT)
  2. L'algorithme utilisé pour la signature (RSA, HMAC SHA256)
{
  "alg": "HS256",
  "typ": "JWT"
}

Ensuite, cette entête est transformée en Base64.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload

Le payload va contenir l'ensemble des informations que vous souhaitez passer à votre application. Il peut contenir ce que vous voulez mais il y a certains champs qui sont recommandés (même si ils sont optionnels dans la norme) :

  • Le champ sub pour subject qui va généralement contenir l'identifiant de votre utilisateur
  • Le champ iss pour issuer qui va définir l'URL de l'émetteur du JWT
  • Le champ exp pour expiration qui va définir la date d'invalidité du jeton

Puis vous allez pouvoir ajouter d'autres informations telles que :

  • Le nom et prénom de l'utilisateur, son email
  • Les rôles qui vont lui donner accès à telle ou telle page et service

Voici un exemple de payload :

{
  "sub": "109296339690202542",
  "iss": "https://blog.adr1.fr",
  "exp": "1697788871000",
  "name": "John Doe",
  "roles": "ROLE_ADMIN"
}

Le tout est transformé au format Base64

eyJzdWIiOiIxMDkyOTYzMzk2OTAyMDI1NDIiLCJpc3MiOiJodHRwczovL2Jsb2cuYWRyMS5mciIsImV4cCI6IjE2OTc3ODg4NzEwMDAiLCJuYW1lIjoiSm9obiBEb2UiLCJyb2xlcyI6IlJPTEVfQURNSU4ifQ
💡
Attention, l'ensemble des informations qui sont dans le payload sont accessibles à tout le monde. Vous ne devez pas mettre de secrets dans la payload à moins de ne chiffrer ces dernières.

Signature

La signature va permettre d'assurer l'intégrité des informations transmises. Pour cela, nous allons devoir signer à la fois le header et le payload.

La cryptographie - le chiffrement (1/2)
Découvrez les quatre objectifs du chiffrement, les algorithmes symétriques et asymétriques, les signatures et surtout comment tout cela fonctionne

En prenant par exemple l'algorithme HMAC SH256, nous aurions :

HMACSHA256( Base64(Header) + "." + Base64(Payload), secret )

La signature utilise un secret ou une clé privée en fonction de l'alogrithme utilisé puis est transformée à l'aide de Base64

SHVDxbjV4ae75x-iZr4r4dJyYLZ6K9NcM5ncDSTHjz8

Création de notre JWT

Notre jeton JWT est donc la concaténation de ces trois parties au format Base63 séparés par un "."

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMDkyOTYzMzk2OTAyMDI1NDIiLCJpc3MiOiJodHRwczovL2Jsb2cuYWRyMS5mciIsImV4cCI6IjE2OTc3ODg4NzEwMDAiLCJuYW1lIjoiSm9obiBEb2UiLCJyb2xlcyI6IlJPTEVfQURNSU4ifQ.SHVDxbjV4ae75x-iZr4r4dJyYLZ6K9NcM5ncDSTHjz8

Il ne vous reste plus qu'à l'utiliser ! Et pour cela, rien de plus simple, il est généralement ajouter dans le header de vos requêtes HTTP(S) sous la forme :

Authorization : Bearer votre_jeton_jwt

Vous trouverez ci-dessous un site très utile (dont je me suis largement inspiré pour cet article) quand il s'agit de jouer avec les JWT.

JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

Nous verrons dans d'autres articles comment on peut les attaquer ! 😈