Passa al contenuto principale

3. JSON Web Token (JWT) Overview (Panoramica JWT)

I JWT rappresentano un insieme di rivendicazioni come un oggetto JSON che è codificato in una struttura JWS e/o JWE. Questo oggetto JSON è il JWT Claims Set (Set di rivendicazioni JWT). Secondo la Sezione 4 dell'RFC 7159 [RFC7159], l'oggetto JSON è composto da zero o più coppie nome/valore (o membri), dove i nomi sono stringhe e i valori sono valori JSON arbitrari. Questi membri sono le rivendicazioni rappresentate dal JWT. Secondo la Sezione 2 dell'RFC 7159 [RFC7159], questo oggetto JSON può (MAY) contenere spazi bianchi e/o interruzioni di riga prima o dopo qualsiasi valore JSON o carattere strutturale.

I nomi dei membri all'interno del JWT Claims Set sono chiamati Claim Names (Nomi di rivendicazioni). I valori corrispondenti sono chiamati Claim Values (Valori di rivendicazioni).

Il contenuto del JOSE Header descrive le operazioni crittografiche applicate al JWT Claims Set. Se il JOSE Header è per un JWS, il JWT è rappresentato come un JWS e le rivendicazioni sono firmate digitalmente o MACate, con il JWT Claims Set che è il JWS Payload. Se il JOSE Header è per un JWE, il JWT è rappresentato come un JWE e le rivendicazioni sono crittografate, con il JWT Claims Set che è il testo in chiaro crittografato dal JWE. Un JWT può (MAY) essere racchiuso in un'altra struttura JWE o JWS per creare un Nested JWT (JWT annidato), consentendo l'esecuzione di firma e crittografia annidate.

Un JWT è rappresentato come una sequenza di parti sicure per URL separate da caratteri punto ('.'). Ogni parte contiene un valore codificato in base64url. Il numero di parti nel JWT dipende dalla rappresentazione del JWS risultante utilizzando la JWS Compact Serialization o del JWE utilizzando la JWE Compact Serialization.

3.1. Example JWT (Esempio di JWT)

Il seguente esempio di JOSE Header dichiara che l'oggetto codificato è un JWT e che il JWT è un JWS che è MACato utilizzando l'algoritmo HMAC SHA-256:

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

Per rimuovere potenziali ambiguità nella rappresentazione dell'oggetto JSON sopra, la rappresentazione UTF-8 effettiva utilizzata in questo esempio per il JOSE Header sopra è anche inclusa di seguito. (Notare che possono sorgere ambiguità a causa di diverse rappresentazioni di piattaforma delle interruzioni di riga (CRLF versus LF), diversi spaziature all'inizio e alla fine delle righe, se l'ultima riga ha un'interruzione di riga terminale o meno, e altre cause. Nella rappresentazione utilizzata in questo esempio, la prima riga non ha spazi iniziali o finali, un'interruzione di riga CRLF (13, 10) si verifica tra la prima e la seconda riga, la seconda riga ha uno spazio iniziale (32) e nessuno spazio finale, e l'ultima riga non ha un'interruzione di riga terminale.) La rappresentazione UTF-8 del JOSE Header utilizzata in questo esempio (utilizzando la notazione array JSON) è:

[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]

La codifica base64url dei byte della rappresentazione UTF-8 del JOSE Header produce questo valore di JOSE Header codificato:

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9

Il seguente è un esempio di JWT Claims Set:

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

La seguente sequenza di byte, che è la rappresentazione UTF-8 utilizzata in questo esempio per il JWT Claims Set sopra, è il 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]

La codifica base64url del JWS Payload produce questo JWS Payload codificato (con interruzioni di riga solo per scopi di visualizzazione):

eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly
9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ

Il calcolo del MAC del JOSE Header codificato e del JWS Payload codificato utilizzando l'algoritmo HMAC SHA-256 e la codifica base64url del valore HMAC nel modo specificato in [JWS] produce questa JWS Signature codificata:

dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

La concatenazione di queste parti codificate in questo ordine con caratteri punto ('.') tra le parti produce questo JWT completo (con interruzioni di riga solo per scopi di visualizzazione):

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

Questo calcolo è illustrato più in dettaglio nell'Appendice A.1 di [JWS]. Vedere l'Appendice A.1 per un esempio di JWT crittografato.