Come decodificare un JWT e ispezionarne le affermazioni in modo sicuro
Risposta rapida
A JWT sono tre stringhe Base64URL unite da punti: header.payload.signature. Decodifica l'intestazione e il payload con la decodifica Base64URL per ispezionare le affermazioni, ma la decodifica legge solo i dati, non verifica l'autenticità. Verifica sempre la firma sul server prima di considerare attendibile qualsiasi richiesta. Utilizza il nostro decodificatore JWT per controllare i token nel tuo browser.
Introduzione
Un token Web JSON (JWT, RFC 7519) è un formato token compatto, URL-safe utilizzato per l'autenticazione e l'autorizzazione. Ha tre parti con codifica Base64URL separate da punti: header.payload.signature. L'intestazione descrive l'algoritmo, il payload contiene attestazioni (ID utente, ruoli, scadenza) e la firma dimostra che il token è stato emesso da una parte attendibile. Fondamentalmente, l'intestazione e il payload sono codificati, non crittografati: chiunque può leggerli.
Passo dopo passo
-
Dividi il token in tre parti
Un JWT assomiglia a xxxxx.yyyyy.zzzzz. Dividi il carattere punto per ottenere l'intestazione (parte 0), il payload (parte 1) e la firma (parte 2). Se non sono presenti esattamente tre parti, il token non è valido.
-
Base64URL decodifica l'intestazione
L'intestazione è un oggetto JSON con codifica Base64URL come {"alg":"HS256","typ":"JWT"}. Base64URL utilizza - e _ invece di + e / e omette il riempimento. Decodificalo, quindi JSON.parse per leggere l'algoritmo e digitarlo. Il nostro JWT Decoder lo fa automaticamente.
-
Decodifica Base64URL del payload (dichiarazioni)
Il carico utile è un JSON oggetto di reclami. Le attestazioni registrate includono iss (emittente), sub (soggetto), aud (audience), exp (scadenza), nbf (non-prima), iat (rilasciato-at) e jti (id token). Le attestazioni private sono specifiche dell'applicazione (ad esempio ruolo, email). Decodifica e ispeziona, ma non fidarti finché non viene verificato.
-
Controlla le richieste di scadenza e non precedenti
exp e nbf sono timestamp Unix (secondi). Se l'ora corrente è passata, il token è scaduto e deve essere rifiutato. Se l'ora corrente è precedente a nbf, il token non è ancora valido. Controlla questi lato client per UX, ma applicali lato server per sicurezza.
-
Verificare la firma sul server (mai lato client)
La firma è HMAC-SHA256(segreto, header.payload) per HS256 o firma RSA/ECDSA per RS256/ES256. La verifica richiede la chiave segreta o pubblica, che non deve mai raggiungere il browser. Utilizza una libreria come jsonwebtoken (Node) o jose per verificare: non scrivere mai la tua crittografia.
Esempi
Un tipico JWT (tre parti)
Ingresso: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpmeJf36POk6yJV_adQssw5c
Produzione: Header: {"alg":"HS256","typ":"JWT"} Payload: {"sub":"1234567890","name":"John Doe","iat":1516239022}
Carico utile decodificato con affermazioni standard
Ingresso: Payload di un token di autenticazione reale
Produzione: {"sub":"user-42","iss":"freeonlinetoolsgo.com","exp":1767229200,"iat":1767225600,"role":"admin"}
Rilevamento token scaduto
Ingresso: scadenza: 1609459200 (01-01-2021) verificato il 28-08-2026
Produzione: Token is expired —current time (1767225600) > exp (1609459200). Reject and prompt re-login.
Problemi comuni
- Trattare la decodifica come verifica: chiunque può creare un JWT con qualsiasi dichiarazione e una firma falsa. La decodifica legge il carico utile ma non prova nulla. Verificare sempre la firma con la chiave segreta/pubblica sul server prima di considerare attendibili le attestazioni.
- Utilizzo dell'algoritmo 'none': la specifica JWT consente alg: none per token non protetti. Se il tuo verificatore accetta alg: none, un utente malintenzionato può forgiare token. Configura la tua libreria in modo che non rifiuti nessuno e inserisci nella whitelist gli algoritmi previsti.
- Memorizzazione di JWT in localStorage: XSS può leggere localStorage ed estrarre token. Preferisci httpOnly, Secure, SameSite=Cookie rigorosi per token di sessione o token in memoria di breve durata con un cookie di token di aggiornamento.
- Non controllare exp/aud/iss: un token rubato è valido fino alla scadenza. Controlla sempre exp (scadenza), aud (pubblico previsto) e iss (emittente) su ogni richiesta per impedire la riproduzione del token tra i servizi.
Suggerimenti
- Utilizza token di accesso di breve durata (15 minuti) più token di aggiornamento di lunga durata: ciò limita la finestra in caso di furto di un token di accesso.
- Preferisci RS256 (asimmetrico) rispetto a HS256 (simmetrico) quando più servizi verificano i token: ogni servizio ottiene la chiave pubblica e solo l'emittente ha la chiave privata.
- Utilizza il nostro decodificatore JWT durante lo sviluppo per verificare ciò che il server sta emettendo: mostra l'intestazione decodificata, il carico utile e un riepilogo delle richieste leggibile dall'uomo senza inviare il token da nessuna parte.
- Non inserire mai dati sensibili (password, PII) in un payload JWT: è codificato Base64, non crittografato e chiunque intercetti il token può leggere ogni richiesta.