Decoder JWT

Incolla un JWT (tre parti codificate in base64url separate da punti) e il decoder mostra l’intestazione, il payload e la firma, decodificati e formattati, insieme all’algoritmo rilevato, la scadenza del token nel tuo fuso orario e se nbf (non prima), iat (emesso il) e exp (scadenza) sono coerenti. Verifica della firma opzionale se hai la chiave segreta o pubblica.

Come decodificare un JWT

  1. 1

    Incolla il token

    Tre stringhe base64url separate da `.` (intestazione.payload.firma).

  2. 2

    Leggi l'intestazione decodificata

    Algoritmo, tipo, ID chiave (`kid`). L'algoritmo ti dice quale tipo di chiave ti serve per la verifica.

  3. 3

    Leggi il payload

    Claim standard (`iss`, `sub`, `aud`, `exp`, `iat`, `nbf`, `jti`) più eventuali claim personalizzati emessi dalla tua applicazione.

  4. 4

    Verifica (opzionale)

    Fornisci la chiave segreta HMAC (per HS256/384/512) o la chiave pubblica (per RS256, ES256, ecc.) per confermare che la firma sia valida.

Anatomia di un JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNjAwMDAwMDAwfQ
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Ogni segmento è codificato in base64url (non standard base64). L’intestazione è JSON come {"alg":"HS256","typ":"JWT"}, il payload è JSON come {"sub":"1234567890","name":"Alice","iat":1600000000}, e la firma è la firma HMAC o RSA di intestazione.payload.

Claim standard (RFC 7519)

Claim Nome Note
iss Emittente Chi ha emesso il token
sub Soggetto Di chi è il token
aud Pubblico Per chi è il token
exp Tempo di scadenza Timestamp Unix; rifiutato dopo questo tempo
nbf Non prima Timestamp Unix; rifiutato prima di questo tempo
iat Emesso il Timestamp Unix di creazione del token
jti ID JWT Identificatore unico per le liste di revoca

Algoritmi supportati

Valore alg Tipo di chiave
HS256/HS384/HS512 Chiave segreta HMAC condivisa
RS256/RS384/RS512 Chiave pubblica RSA
ES256/ES384 Chiave pubblica ECDSA
PS256/PS384 Chiave pubblica RSA-PSS
EdDSA / Ed25519 Curva di Edwards
none Non fidarti mai di questo, token non firmati

Il pericolo del alg: none

Le prime librerie JWT consentivano token "alg": "none" e li accettavano ingenuamente come validi. Sempre:

  • Inserisci nella whitelist gli algoritmi che la tua applicazione accetta.
  • Rifiuta alg: none incondizionatamente.
  • Rifiuta alg: HS256 quando il tuo codice di verifica si aspetta RS256 (l’attacco di “confusione dell’algoritmo”).

Cosa NON è un JWT

  • Non crittografato. L’intestazione e il payload sono codificati in base64, il che è facilmente decodificabile. Non mettere segreti in un JWT senza avvolgerlo in JWE.
  • Non revocabile per impostazione predefinita. Una volta emesso, un JWT è valido fino a exp. Per la revoca hai bisogno di una blacklist o di una scadenza breve + token di aggiornamento.
  • Non è un sostituto dei cookie di sessione per ogni caso d’uso. Token opachi memorizzati lato server sono spesso più semplici e sicuri.

Errori comuni

  • Fidarsi dell’intestazione. Il kid e alg provengono dal token stesso. Un server compromesso può impostarli arbitrariamente; valida sempre contro un elenco fisso.
  • Ignorare la differenza di nbf e iat. La deriva dell’orologio significa che iat > ora può accadere. Consenti un piccolo margine (30-60s).
  • Registrare interi JWT. Il payload spesso contiene ID utente, email, permessi, PII che non dovrebbero finire in stdout.
  • Usare HS256 con una chiave debole. Una chiave segreta di 16 caratteri è vulnerabile a forza bruta in pochi minuti. Usa almeno 256 bit di entropia casuale.

Domande frequenti

No. La decodifica avviene nel tuo browser. Il token rimane locale, importante perché i JWT spesso contengono dati di sessione, ID utente e permessi.

Sì. Se incolli la chiave segreta HMAC condivisa o la chiave pubblica codificata PEM, la verifica avviene nel tuo browser. La chiave non lascia mai la tua macchina.

Significa che il token non è firmato. Non accettare mai tali token in produzione, possono essere falsificati facilmente. Diversi CVE di alto profilo riguardavano specificamente librerie che accettavano alg: none per impostazione predefinita.

La firma JWT prova l’autenticità, non la riservatezza. L’intestazione e il payload sono codificati in base64url, il che è reversibile. Per la segretezza, usa JWE (JSON Web Encryption) attorno al JWT, o evita di mettere dati sensibili nel payload.

Strumenti correlati

Strumento disponibile in altre lingue