Aller au contenu principal

3. JSON Web Token (JWT) Overview (Aperçu de JWT)

Les JWT représentent un ensemble de revendications comme un objet JSON qui est encodé dans une structure JWS et/ou JWE. Cet objet JSON est le JWT Claims Set (Ensemble de revendications JWT). Selon la section 4 du RFC 7159 [RFC7159], l'objet JSON se compose de zéro ou plusieurs paires nom/valeur (ou membres), où les noms sont des chaînes et les valeurs sont des valeurs JSON arbitraires. Ces membres sont les revendications représentées par le JWT. Selon la section 2 du RFC 7159 [RFC7159], cet objet JSON peut (MAY) contenir des espaces et/ou des sauts de ligne avant ou après toute valeur JSON ou caractère structurel.

Les noms de membres dans le JWT Claims Set sont appelés Claim Names (Noms de revendications). Les valeurs correspondantes sont appelées Claim Values (Valeurs de revendications).

Le contenu du JOSE Header décrit les opérations cryptographiques appliquées au JWT Claims Set. Si le JOSE Header est pour un JWS, le JWT est représenté comme un JWS et les revendications sont signées numériquement ou MACées, le JWT Claims Set étant le JWS Payload. Si le JOSE Header est pour un JWE, le JWT est représenté comme un JWE et les revendications sont chiffrées, le JWT Claims Set étant le texte en clair chiffré par le JWE. Un JWT peut (MAY) être inclus dans une autre structure JWE ou JWS pour créer un Nested JWT (JWT imbriqué), permettant ainsi d'effectuer une signature et un chiffrement imbriqués.

Un JWT est représenté comme une séquence de parties sûres pour les URL séparées par des caractères point ('.'). Chaque partie contient une valeur encodée en base64url. Le nombre de parties dans le JWT dépend de la représentation du JWS résultant utilisant la JWS Compact Serialization ou du JWE utilisant la JWE Compact Serialization.

3.1. Example JWT (Exemple de JWT)

L'exemple suivant de JOSE Header déclare que l'objet encodé est un JWT, et que le JWT est un JWS qui est MACé en utilisant l'algorithme HMAC SHA-256 :

{"typ":"JWT",
"alg":"HS256"}

Pour éliminer les ambiguïtés potentielles dans la représentation de l'objet JSON ci-dessus, la représentation UTF-8 réelle utilisée dans cet exemple pour le JOSE Header ci-dessus est également incluse ci-dessous. (Notez que des ambiguïtés peuvent survenir en raison de différentes représentations de plateforme des sauts de ligne (CRLF versus LF), différents espacements au début et à la fin des lignes, si la dernière ligne a un saut de ligne terminal ou non, et d'autres causes. Dans la représentation utilisée dans cet exemple, la première ligne n'a pas d'espaces au début ou à la fin, un saut de ligne CRLF (13, 10) se produit entre la première et la deuxième ligne, la deuxième ligne a un espace de début (32) et pas d'espaces de fin, et la dernière ligne n'a pas de saut de ligne terminal.) La représentation UTF-8 du JOSE Header utilisée dans cet exemple (utilisant la notation de tableau JSON) est :

[123, 34, 116, 121, 112, 34, 58, 34, 74, 87, 84, 34, 44, 13, 10, 32,
34, 97, 108, 103, 34, 58, 34, 72, 83, 50, 53, 54, 34, 125]

L'encodage base64url des octets de la représentation UTF-8 du JOSE Header produit cette valeur de JOSE Header encodée :

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9

Voici un exemple de JWT Claims Set :

{"iss":"joe",
"exp":1300819380,
"http://example.com/is_root":true}

La séquence d'octets suivante, qui est la représentation UTF-8 utilisée dans cet exemple pour le JWT Claims Set ci-dessus, est le JWS Payload :

[123, 34, 105, 115, 115, 34, 58, 34, 106, 111, 101, 34, 44, 13, 10,
32, 34, 101, 120, 112, 34, 58, 49, 51, 48, 48, 56, 49, 57, 51, 56,
48, 44, 13, 10, 32, 34, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97,
109, 112, 108, 101, 46, 99, 111, 109, 47, 105, 115, 95, 114, 111,
111, 116, 34, 58, 116, 114, 117, 101, 125]

L'encodage base64url du JWS Payload produit ce JWS Payload encodé (avec des sauts de ligne à des fins d'affichage uniquement) :

eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly
9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ

Le calcul du MAC du JOSE Header encodé et du JWS Payload encodé en utilisant l'algorithme HMAC SHA-256 et l'encodage base64url de la valeur HMAC de la manière spécifiée dans [JWS] produit cette JWS Signature encodée :

dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

La concaténation de ces parties encodées dans cet ordre avec des caractères point ('.') entre les parties produit ce JWT complet (avec des sauts de ligne à des fins d'affichage uniquement) :

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

Ce calcul est illustré plus en détail dans l'annexe A.1 de [JWS]. Voir l'annexe A.1 pour un exemple de JWT chiffré.