Cos'è un JWT? Una spiegazione completa dei token Web JSON
Risposta rapida
A JWT è una stringa con tre parti con codifica Base64URL separate da punti: header.payload.signature. L'intestazione specifica l'algoritmo, il payload contiene attestazioni (ID utente, ruoli, scadenza) e la firma dimostra l'autenticità. I JWT vengono utilizzati per l'autenticazione senza stato. Utilizza il nostro decodificatore JWT gratuito per controllare il contenuto del token nel tuo browser.
Introduzione
Un JWT (JSON Web Token) è un formato token compatto, URL-safe definito da RFC 7519 per la trasmissione sicura di informazioni tra le parti come oggetto JSON. I JWT sono ampiamente utilizzati per l'autenticazione e l'autorizzazione nelle applicazioni web: dopo che un utente ha effettuato l'accesso, il server emette un JWT che il client include nelle richieste successive per dimostrare l'identità. I JWT sono senza stato: il server non ha bisogno di cercare il token in un database; il token stesso contiene le affermazioni dell'utente e una firma che dimostra che non è stato manomesso.
Passo dopo passo
-
Comprendere la struttura in tre parti
Un JWT è composto da tre parti: intestazione (algoritmo e tipo), payload (dichiarazioni) e firma (dimostra l'integrità). Ogni parte è codificata URL Base64 e separata da punti: eyJhbGciOi...J9.eyJzdWIi...J9.signature. Le prime due parti sono leggibili da chiunque abbia il token; solo la firma richiede la chiave segreta.
-
Impara le affermazioni standard
Il payload contiene affermazioni: dichiarazioni sull'argomento. Affermazioni standard: 'sub' (ID soggetto/utente), 'iat' (emesso al timestamp), 'exp' (scadenza), 'nbf' (non prima), 'iss' (emittente), 'aud' (audience). Le attestazioni personalizzate possono includere ruoli, autorizzazioni o qualsiasi altro dato.
-
Comprendere gli algoritmi di firma
I JWT utilizzano la firma simmetrica (HS256 — segreto condiviso) o asimmetrica (RS256, ES256 — coppia di chiavi pubblica/privata). La firma impedisce la manomissione: la modifica di qualsiasi parte del token invalida la firma. Solo il detentore della chiave segreta/privata può creare token validi.
-
Utilizza JWT per l'autenticazione
Dopo l'accesso, il server crea un JWT e lo invia al client. Il client include JWT nell'intestazione dell'autorizzazione (token portatore) per le richieste successive. Il server verifica la firma e controlla la scadenza, senza necessità di ricerca nel database.
Esempi
struttura JWT
Ingresso: Un tipico JWT
Produzione: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSIsImV4cCI6MTY5MzYxMjgwMH0.signature
Intestazione decodificata
Ingresso: Prima parte decodificata
Produzione: {"alg": "HS256", "typ": "JWT"}
Carico utile decodificato
Ingresso: Seconda parte decodificata
Produzione: {"sub": "user1", "name": "Alice", "iat": 1693526400, "exp": 1693612800}
Problemi comuni
- Decodificare o verificare: decodificare un JWT (leggerne il contenuto) NON dimostra che sia autentico. Verificare sempre la firma lato server con la chiave segreta prima di considerare attendibili le attestazioni.
- Memorizzazione di JWT in localStorage: questo li rende accessibili a JavaScript, vulnerabili agli attacchi XSS. Memorizza in httpOnly i cookie per una migliore sicurezza.
- Token di lunga durata: se un token viene rubato, rimane valido fino alla scadenza. Utilizza token di accesso di breve durata (15-60 minuti) con token di aggiornamento per sessioni lunghe.
- Dati sensibili nel payload: il payload è leggibile da chiunque abbia il token (è Base64, non crittografato). Non inserire mai password, carte di credito o segreti nel payload.
Suggerimenti
- Verifica sempre la firma JWT lato server prima di fidarti di qualsiasi affermazione: la sola decodifica non è un'autenticazione.
- Utilizza token di accesso di breve durata (15-60 minuti) con token di aggiornamento per sessioni lunghe per ridurre al minimo i danni derivanti dal furto di token.
- Archivia i JWT nei cookie httpOnly, Secure, SameSite anziché in localStorage per prevenire attacchi XSS.
- Utilizza il nostro decodificatore JWT per ispezionare i contenuti del token per il debug: il tuo token non lascia mai il tuo browser.