Le JSON Web Token - JWT
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.
Quelle est la structure d'un JWT ?
Un JSON Web Token contient 3 parties :
- Un header
- Un payload
- Une signature
Il est souvent représenté sous cette forme :
xxxxx.yyyyy.zzzzz
Header
Le header contient généralement deux parties :
- Le type de jeton (JWT)
- 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
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.
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.

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