Decoder ed encoder JWT — Decodifica, verifica e firma JSON Web Token
Decodifica header e payload di un JWT, leggi la scadenza in parole semplici, verifica firme HS, RS, PS ed ES o firma un nuovo token. Nulla esce dal browser.
{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "user_42",
"name": "Ada Lovelace",
"role": "admin",
"iat": 1757320000,
"exp": 1788856000
}| sub | Soggetto | user_42 |
| name | Ada Lovelace | |
| role | admin | |
| iat | Emesso il | 1757320000 |
| exp | Scadenza | 1788856000 |
Il token di esempio è firmato con il segreto demo-secret-do-not-use.
La decodifica non controlla mai la firma: chiunque può leggere un JWT, solo la firma dimostra chi l'ha emesso. I token HS* richiedono il segreto condiviso; RS*, PS*, ES* ed EdDSA richiedono la chiave pubblica dell'emittente (PEM, certificato, JWK o il JWKS del suo /.well-known/jwks.json, abbinato tramite kid). Non incollare segreti o chiavi private di produzione in nessuna pagina web, compresa questa; usa chiavi di test.
Token e chiavi vengono elaborati nel tuo browser con WebCrypto e non vengono mai inviati; tuttavia, tratta come una credenziale qualsiasi token o chiave di produzione incollati. Sfoglia tutti gli strumenti gratuiti.
Hai trovato un problema o qualcosa che potrebbe andare meglio? Leggiamo ogni messaggio e sistemiamo le cose in fretta.
Questo decoder JWT gratuito mostra header, payload e claim di un JSON Web Token, trasforma exp, iat e nbf in date leggibili con un esito chiaro (valido o scaduto), verifica la firma (HMAC con un segreto, oppure RSA, RSA-PSS, ECDSA ed Ed25519 con una chiave pubblica, un certificato o una JWK) e include un encoder che firma nuovi token per i test. Tutto avviene nel browser, cosa che qui conta più che per la maggior parte degli strumenti: un token incollato è spesso una credenziale attiva e non dovrebbe essere inviato al server di nessuno, compreso il nostro.
Un JWT è composto da tre sezioni Base64URL separate da punti: un header che indica l'algoritmo, un payload di claim e una firma. Le prime due non sono cifrate, solo codificate, quindi chiunque può leggerle; è la firma a dimostrare chi ha emesso il token e che non è stato alterato. Decodificare, quindi, non equivale a fidarsi, e la pagina tiene ben visibile questa distinzione.
Come si usa
- Incolla il token. Un “Bearer ” iniziale copiato da un header Authorization va bene: viene rimosso.
- Leggi la riga di stato: per quanto è ancora valido, da quando è scaduto o se non è ancora valido.
- Controlla il payload e la tabella dei claim. I claim temporali sono mostrati come date locali accanto ai secondi Unix grezzi.
- Per la verifica, inserisci la chiave e premi Verifica: il segreto condiviso per HS256/384/512, oppure per i token RS, PS, ES ed EdDSA la chiave pubblica dell'emittente come PEM, certificato, JWK o l'intero JWKS (la chiave viene scelta in base al kid del token).
- Per creare un token, passa a Codifica e firma, scegli l'algoritmo, modifica il JSON di header e payload e inserisci un segreto o incolla una chiave privata PKCS#8 (oppure genera una coppia di chiavi di prova). Firma, poi aprilo nel decoder per verificarlo.
- Copia payload o header come JSON formattato se ti serve in una segnalazione di bug o in una fixture di test.
Domande frequenti
È sicuro incollare qui un token reale?
Il token viene decodificato con JavaScript nel browser e non viene mai trasmesso: puoi scollegarti da internet e la pagina continua a funzionare. Detto questo, tratta un token di produzione come una password: non incollarlo in pagine di cui non ti fidi e, quando puoi, preferisci un token di prova a breve scadenza.
Perché posso leggere il payload senza il segreto?
Perché i JWT sono firmati, non cifrati. Il payload è JSON codificato in Base64URL che chiunque può decodificare. Il segreto (o la chiave privata) serve solo a creare o verificare la firma. Non mettere mai dati sensibili nel payload di un JWT, a meno che tu non usi JWE, la variante cifrata, che questo strumento non decodifica.
Che cosa significano exp, iat e nbf?
Sono timestamp Unix in secondi. exp è il momento in cui il token scade; iat quello in cui è stato emesso; nbf (not before) il primo istante in cui è valido. Un verificatore deve rifiutare un token dopo exp o prima di nbf. Qui la riga di stato applica entrambe le regole all'ora attuale.
Come verifico un token RS256 o ES256?
Ti serve la chiave pubblica dell'emittente, mai quella privata. I provider di identità la pubblicano come JWKS a un URL come https://issuer/.well-known/jwks.json (lo fanno Auth0, Okta, Cognito, Azure AD e Google). Incolla l'intero JWKS e verrà usata la chiave il cui kid corrisponde all'header del token, oppure incolla una singola JWK, una chiave pubblica PEM (BEGIN PUBLIC KEY) o un certificato X.509. La pagina non scarica nulla da sola, quindi copia il JWKS dal browser.
Posso creare e firmare un JWT qui?
Sì. Codifica e firma prende il JSON di header e payload e firma con HS256/384/512 e un segreto, oppure con RS, PS, ES o EdDSA e una chiave privata in formato PEM PKCS#8 (BEGIN PRIVATE KEY). I vecchi file BEGIN RSA PRIVATE KEY sono PKCS#1: convertili con openssl pkcs8 -topk8 -nocrypt -in key.pem. Usa solo chiavi di prova: una chiave di firma di produzione incollata in una qualsiasi pagina web va considerata compromessa.
Che cosa significa “alg: none” e perché l'avviso?
Dichiara che il token non ha firma. In passato alcune librerie accettavano questi token come validi, permettendo agli attaccanti di falsificare qualsiasi payload. Un verificatore configurato correttamente rifiuta alg none senza eccezioni. Se lo trovi in un sistema reale, è un problema di sicurezza, non una curiosità.
Anatomia di un JWT
Header: {"alg":"HS256","typ":"JWT"} dice al verificatore quale algoritmo ha firmato il token. Payload: i claim, un oggetto JSON con ciò che l'emittente ha scelto di includere, più i claim registrati (iss, sub, aud, exp, nbf, iat, jti) che i verificatori comprendono. Firma: HMAC o una firma digitale calcolata su base64url(header).base64url(payload). Basta cambiare un carattere del payload perché la firma non corrisponda più, ed è proprio questo lo scopo.
Errori comuni con i JWT
• Fidarsi del payload senza verificare la firma, o verificarla con l'algoritmo indicato nel token invece di quello che il server si aspetta (algorithm confusion).
• Access token di lunga durata. Tieni exp breve (da qualche minuto a un'ora) e usa un refresh token per le sessioni più lunghe.
• Mettere dati personali o segreti nel payload: è leggibile da chiunque abbia il token.
• Conservare i token in localStorage su un sito esposto anche minimamente all'XSS. Un cookie httpOnly è più sicuro per le sessioni nel browser.
• Dimenticare di controllare aud e iss, il che permette di riutilizzare contro un altro servizio un token emesso per un servizio diverso.
• Segreti HMAC troppo corti o scelti da una persona. HS256 richiede almeno 256 bit (32 byte casuali); un segreto indovinabile si può forzare offline partendo da un solo token.
Quale algoritmo di firma scegliere
• HS256 (HMAC-SHA256): un unico segreto condiviso firma e verifica. Semplice e veloce, ma ogni servizio che verifica può anche emettere token. Va bene all'interno di un unico backend.
• RS256 (RSA PKCS#1 v1.5 con SHA-256): l'opzione asimmetrica più supportata; l'emittente tiene la chiave privata, tutti gli altri verificano con la chiave pubblica. Le firme sono di 256 byte con una chiave a 2048 bit.
• PS256 (RSA-PSS): stesse chiavi di RS256 con uno schema di padding più moderno; usalo quando tutti i consumatori lo supportano.
• ES256 (ECDSA P-256): chiavi molto più piccole e firme di 64 byte con una sicurezza paragonabile; diffuso nei sistemi più recenti e richiesto da alcuni (Apple, API legate a WebAuthn).
• EdDSA (Ed25519): firme veloci e deterministiche, sempre più supportate dalle librerie; il supporto nei browser è arrivato dopo gli altri.
Strumenti gratuiti correlati
- Codificatore / decodificatore Base64 — Codifica testo o file in Base64, trasforma immagini in data URI con snippet CSS e <img>, e decodifica Base64 in un file con anteprima. Nulla esce dal tuo browser.
- Formattatore JSON — Formatta, minifica e valida JSON, con gli errori di parsing localizzati per riga e colonna. Nel tuo browser, senza upload.
- Generatore di password — Genera una password casuale sicura, una passphrase facile da ricordare o un PIN. Funziona interamente nel browser: nulla viene inviato o salvato.