Un JSON Web Token, RFC 7519, e un modo compatto per trasportare un insieme di dichiarazioni da
una parte all'altra cosi che il lato ricevente possa fidarsi di chi le ha inviate, o al
meno verificare che nulla sia cambiato durante il trasporto. Ogni JWT che vedrai in
un'intestazione Authorization: Bearer sono le stesse tre parti unite da punti:
header.payload.signature.
Le tre parti
L'intestazione e il carico utile sono ciascuno un oggetto JSON, codificato in base64url. L'intestazione
nomina l'algoritmo di firma e il tipo di token, tipicamente qualcosa
di piccolo come {"alg":"HS256","typ":"JWT"}. Il carico utile contiene le dichiarazioni: i
dati che il token sta effettivamente trasportando, piu un pugno di nomi registrati con
significati definiti, iss (emittente), sub (soggetto), aud (pubblico), iat
(emaesso il), nbf (non prima di) e exp (scadenza) e jti (un id del token). Nessuno
di questo e richiesto oltre a cio che l'emittente sceglie di includere, ed e per questo che due JWT
da due servizi diversi possono trasportare dichiarazioni completamente diverse.
La firma non e JSON per niente. E il risultato dell'esecuzione dell'intestazione e
del carico utile, ancora nella loro forma codificata, attraverso l'algoritmo nominato nell'intestazione,
HS256 (HMAC con un segreto condiviso) e RS256/ES256 (RSA o
ECDSA con una chiave privata) essendo quelli che incontrerai piu spesso. Decodificare la firma in base64url
ottiene byte grezzi senza ulteriore struttura da leggere.
Codificato non e criptato
Base64url e una codificazione, non una cifratura. Chiunque possieda un JWT puo decodificare l'intestazione e il carico utile con nulla piu che un editor di testo, che e esattamente ciò che fa il Decodificatore JWT. Questo significa che un JWT non e mai il posto giusto per qualsiasi cosa che non metteresti in un URL: una password, un numero di carta di credito, un nome completo che qualcuno non ha accettato di esporre. Se un carico utile deve rimanere confidenziale anziche solo resistente alla manomissione, ci vuole un token di Crittografia Web JSON, un formato diverso e meno comune, non un JWT firmato con un algoritmo piu forte.
Decodificare non dice nulla sulla fiducia
Questa e la parte per cui i decodificatori vengono incolpati di piu, quindi vale la pena affermare chiaramente: leggere le dichiarazioni di un JWT non dimostra nulla sul fatto che il token sia genuino. Verificare una firma significa ricalcolarla con il vero segreto o la chiave pubblica con cui il token e stato firmato e verificare che corrisponda, byte per byte. Un decodificatore che divide solo il token sui suoi punti e decodifica due delle tre parti in base64url, che e ciò che fa ogni decodificatore puro lato client, non ha accesso a quella chiave e non puo fare quella verifica. Può dirti cosa dichiara un token. Non puo dirti se dovresti crederci.
Un token ben formato, decodificato pulitamente, puo ancora essere contraffatto, scaduto, o
firmato con una chiave che non era mai stata destinata a emetterlo. exp e nbf valgono la pena
essere verificati a ogni decodificazione per esattamente questa ragione: un token oltre la sua
scadenza, o non ancora valido, e invalido indipendentemente dal fatto che la sua firma
sia corretta o meno, e leggere questi due campi come i timestamp che rappresentano
anziche numeri grezzi e il modo piu veloce per coglierlo a colpo d'occhio.
A cosa serve
Nonostante quella limitazione, decodificare senza verificare ha usi reali, quotidiani: leggere quali scope un token di accesso ha ricevuto durante il debug di un'integrazione API, verificare se il token che la tua app ha appena ricevuto e effettivamente scaduto (anziche indovinare da un vago 401), o ispezionare cosa contiene il token di un terzo prima di decidere se il tuo servizio ha bisogno di fidarsi di esso affatto. Nulla di tutto questo richiede la chiave di firma, solo il token stesso. Incollane uno nel Decodificatore JWT e separa l'intestazione, le dichiarazioni registrate e il carico utile rimanente nelle loro righe, segnala immediatamente un token scaduto o non ancora valido, e mostra i byte grezzi della firma senza pretendere di averli verificati contro nulla.