3. JSON Web Signature (JWS) Overview (Aperçu de JWS)
JWS représente du contenu signé numériquement ou protégé par MAC en utilisant des structures de données JSON et un encodage base64url. Ces structures de données JSON peuvent (MAY) contenir des espaces blancs et/ou des caractères de nouvelle ligne avant ou après toute valeur ou caractère structurel JSON, conformément à la section 2 de RFC 7159 [RFC7159]. Un JWS représente les valeurs logiques suivantes (chaque valeur étant définie dans la section 2) :
- JOSE Header (En-tête JOSE)
- JWS Payload (Charge utile JWS)
- JWS Signature (Signature JWS)
Pour un JWS, les membres de l'en-tête JOSE sont l'union des membres des valeurs suivantes (chaque valeur étant définie dans la section 2) :
- JWS Protected Header (En-tête protégé JWS)
- JWS Unprotected Header (En-tête non protégé JWS)
Ce document définit deux sérialisations pour les JWS : une sérialisation compacte et sûre pour les URL appelée JWS Compact Serialization (sérialisation compacte JWS) et une sérialisation JSON appelée JWS JSON Serialization (sérialisation JSON JWS). Dans les deux sérialisations, le JWS Protected Header, le JWS Payload et la JWS Signature sont encodés en base64url, car JSON ne dispose pas d'un moyen de représenter directement des séquences d'octets arbitraires.
3.1 JWS Compact Serialization Overview (Aperçu de la sérialisation compacte JWS)
Dans la sérialisation compacte JWS, aucun JWS Unprotected Header n'est utilisé. Dans ce cas, l'en-tête JOSE et le JWS Protected Header sont identiques.
Dans la sérialisation compacte JWS, un JWS est représenté comme la concaténation suivante :
BASE64URL(UTF8(JWS Protected Header)) || '.' ||
BASE64URL(JWS Payload) || '.' ||
BASE64URL(JWS Signature)
Voir la section 7.1 pour plus d'informations sur la sérialisation compacte JWS.
3.2 JWS JSON Serialization Overview (Aperçu de la sérialisation JSON JWS)
Dans la sérialisation JSON JWS, l'un ou les deux du JWS Protected Header et du JWS Unprotected Header doivent (MUST) être présents. Dans ce cas, les membres de l'en-tête JOSE sont l'union des membres des valeurs JWS Protected Header et JWS Unprotected Header présentes.
Dans la sérialisation JSON JWS, un JWS est représenté comme un objet JSON contenant certains ou tous les quatre membres suivants :
- « protected », avec la valeur BASE64URL(UTF8(JWS Protected Header))
- « header », avec la valeur JWS Unprotected Header
- « payload », avec la valeur BASE64URL(JWS Payload)
- « signature », avec la valeur BASE64URL(JWS Signature)
Ces trois chaînes résultantes encodées en base64url et la valeur JWS Unprotected Header sont représentées comme des membres de l'objet JSON. L'inclusion de certaines de ces valeurs est optionnelle (OPTIONAL). La sérialisation JSON JWS peut également représenter plusieurs valeurs de signature et/ou de MAC, plutôt qu'une seule. Voir la section 7.2 pour plus d'informations sur la sérialisation JSON JWS.
3.3 Example JWS (Exemple JWS)
Cette section fournit un exemple de JWS. Son calcul est décrit plus en détail dans l'annexe A.1, y compris la spécification des valeurs JSON exactes utilisées pour représenter les octets et les valeurs de clé utilisées.
L'exemple de JWS Protected Header suivant déclare que l'objet encodé est un JSON Web Token [JWT] et que le JWS Protected Header et le JWS Payload sont protégés en intégrité à l'aide de l'algorithme HMAC SHA-256 [RFC2104] [SHS] :
{"typ":"JWT",
"alg":"HS256"}
L'encodage de ce JWS Protected Header comme BASE64URL(UTF8(JWS Protected Header)) donne cette valeur :
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
La représentation UTF-8 de l'objet JSON suivant est utilisée comme JWS Payload. (Notez que la charge utile peut être n'importe quel contenu et n'a pas besoin d'être une représentation d'un objet JSON.)
{"iss":"joe",
"exp":1300819380,
"http://example.com/is_root":true}
L'encodage de ce JWS Payload comme BASE64URL(JWS Payload) donne cette valeur (avec des sauts de ligne pour des raisons d'affichage) :
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
Le calcul de la JWS Signature de manière définie pour l'algorithme HMAC SHA-256 sur l'entrée de signature JWS ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload)) avec la clé HMAC octets donne cette valeur :
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
L'encodage de ce JWS avec la sérialisation compacte JWS produit ce JWS complet (avec des sauts de ligne pour des raisons d'affichage) :
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
Voir l'annexe A pour d'autres exemples de JWS.