JSON Web Token

Pour les articles homonymes, voir JWT.

JSON Web Token (JWT)

Date de première version  | Mai 2015
Auteur  | M. Jones, J. Bradley and N. Sakimura
Développeur  | IETF
Normes | RFC 7519[1]
Site web | jwt.io
modifier

JSON Web Token (JWT) est un standard ouvert défini dans la RFC 7519[1]. Il permet l'échange sécurisé de jetons (tokens) entre plusieurs parties. Cette sécurité de l’échange se traduit par la vérification de l'intégrité et de l'authenticité des données. Elle s’effectue par l'algorithme HMAC ou RSA.

## Structure

[modifier | modifier le code]

Un jeton se compose de trois parties :

* Un en-tête (header), utilisé pour décrire le jeton. Il s'agit d'un objet JSON.
* Une charge utile (payload) qui représente les informations embarquées dans le jeton. Il s'agit également d'un objet JSON.
* Une signature numérique.

Il existe des outils en ligne permettant de les déchiffrer[2].

### Exemple

[modifier | modifier le code]

En-tête

{"typ": "jwt", "alg": "HS512"}

Charge utile

{"name":"Wikipedia", "iat":1525777938}

Dans l'exemple ci-dessus, on voit dans l’en-tête que le jeton est un JSON Web Token (JWT) et que l'algorithme utilisé pour la signature est HMAC-SHA512.

## Obtention de la signature

[modifier | modifier le code]

Pour générer la signature (de l'en-tête du jeton et de sa charge utile), il faut tout d'abord encoder séparément l'en-tête et la charge utile avec Base64url défini dans la RFC 4648[3]. Ensuite, on les concatène en les séparant par un point. On obtient la signature de ce résultat avec l'algorithme choisi. Cette signature est ajoutée au résultat de la même manière (encodée et séparée par un point) pour avoir le jeton complet.

À noter que pour l'encodage en Base64url, le caractère de remplissage '=' n'est pas obligatoire et ne sera pas utilisé dans la création du JSON Web Token pour faciliter la transmission dans une URL.

## Procédure étape par étape

[modifier | modifier le code]

À partir de l'exemple ci-dessus, voici les différentes étapes pour obtenir un JSON Web Token.

Encodage de l'en-tête

eyJ0eXAiOiAiand0IiwgImFsZyI6ICJIUzUxMiJ9

Encodage de la charge utile

eyJuYW1lIjoiV2lraXBlZGlhIiwiaWF0IjoxNTI1Nzc3OTM4fQ

Concaténation de l'en-tête et de la charge utile, séparation par un point

eyJ0eXAiOiAiand0IiwgImFsZyI6ICJIUzUxMiJ9.eyJuYW1lIjoiV2lraXBlZGlhIiwiaWF0IjoxNTI1Nzc3OTM4fQ

Obtention du code d'authentification de message avec l'algorithme HMAC-SHA512[4].

HMACSHA512(concatenation, 'ma super clé secrète')

Encodage du code (toujours avec Base64url)

iu0aMCsaepPy6ULphSX5PT32oPvKkM5dPl131knIDq9Cr8OUzzACsuBnpSJ_rE9XkGjmQVawcvyCHLiM4Kr6NA

Concaténation des deux éléments, séparation par un point

eyJ0eXAiOiAiand0IiwgImFsZyI6ICJIUzUxMiJ9.eyJuYW1lIjoiV2lraXBlZGlhIiwiaWF0IjoxNTI1Nzc3OTM4fQ.iu0aMCsaepPy6ULphSX5PT32oPvKkM5dPl131knIDq9Cr8OUzzACsuBnpSJ_rE9XkGjmQVawcvyCHLiM4Kr6NA

## Champs standards (claims)

[modifier | modifier le code]

La spécification de JWT propose différents champs (ou paramètres) standards, appelés Claims[5] :

* iss : créateur (issuer) du jeton
* sub : sujet (subject) du jeton
* aud : audience du jeton
* exp : date d'expiration du jeton
* nbf : date avant laquelle le jeton ne doit pas être considéré comme valide (not before)
* iat : date à laquelle a été créé le jeton (issued at)
* jti : identifiant unique du jeton (JWT ID)

Tous ces paramètres sont optionnels. Ils permettent simplement de définir plus précisément un jeton et de renforcer sa sécurité (e.g. en limitant la durée de vie d'un jeton).

## Implémentation

[modifier | modifier le code]

L'implémentation de JWT peut se faire à travers une pléthore de bibliothèques[6] disponibles dans de nombreux langages de programmation.

Voici une liste non exhaustive de langages de programmation pour lesquels il existe une librairie JWT : .NET, 1C, Ada, C, C++, Clojure, Crystal, D, Delphi, Elixir, Erlang, Go, Groovy, Haskell, Haxe, Java, JavaScript, kdb+/Q, Kotlin, Lua, Node.js, Objective-C, Perl, PHP, PostgreSQL, Python, Ruby, Rust, Scala, Swift.

Il est également possible d'implémenter soi-même la spécification RFC 7519[1] décrivant JWT.

## Vulnérabilités

[modifier | modifier le code]

Les JWT sont un moyen d'authentification sécurisé. Il existe néanmoins certaines vulnérabilités, qui sont évitables en les considérant avec précaution. En voici une liste non exhaustive :

* Un JWT peut être soit encodé soit chiffré[4]. Un JWT uniquement encodé, comme c'est le cas de la majorité des JWT en circulation[4], devra donc transiter par un protocole de communication sécurisé (i.e. HTTPS) pour le rendre inutilisable par un utilisateur mal intentionné qui serait parvenu à l'intercepter[7].
* La clé secrète doit être conservée de façon extrêmement sécurisée. Tout utilisateur (ou système) en possession de la clé secrète d'un serveur serait en mesure de générer des JWT reconnus comme valides par ce serveur[4],[7].

## Notes et références

[modifier | modifier le code]

* (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « JSON Web Token » (voir la liste des auteurs).

1. ↑ a b et c (en) « JSON Web Token (JWT) », Request for comments no 7519
2. ↑ (en) « Jwt Tool »
3. ↑ (en) « The Base16, Base32, and Base64 Data Encodings », Request for comments no 4648
4. ↑ a b c et d (en-US) auth0.com, « JWT.IO - JSON Web Tokens Introduction », sur jwt.io (consulté le 8 mai 2018)
5. ↑ (en) John Bradley et Nat Sakimura, « JSON Web Token (JWT) », sur tools.ietf.org (consulté le 22 juin 2020)
6. ↑ (en) « JWT.IO », sur jwt.io (consulté le 12 novembre 2023).
7. ↑ a et b « JSON Web Token (JWT) : Le guide complet », sur primfx.com, 19 juin 2020 (consulté le 22 juin 2020)

## Voir aussi

[modifier | modifier le code]

* OpenID Connect

* Portail de la sécurité informatique

*[RFC]: Request for comments
*[(en)]: Langue : anglais
*[no]: numéro
*[(en-US)]: Langue : anglais américain