Cos'è JWT? Una Guida Completa ai JSON Web Token
Cos'è JWT?
Il JSON Web Token (JWT) è uno standard aperto (RFC 7519) che definisce un modo compatto e autonomo per trasmettere in modo sicuro informazioni tra parti come oggetto JSON. I JWT sono il formato di token dominante nelle applicazioni web moderne, utilizzati per tutto: dall'autenticazione degli utenti e l'autorizzazione delle API allo scambio sicuro di dati tra microservizi.
Come Funziona l'Autenticazione JWT
L'autenticazione JWT segue un modello stateless che elimina la necessità di archiviare sessioni lato server. Comprendere questo flusso è fondamentale per capire perché i JWT sono diventati la scelta predefinita per la sicurezza delle API moderne.
Il Flusso di Autenticazione
- L'utente accede — Il client invia le credenziali (nome utente e password) al server di autenticazione.
- Il server crea un JWT — Il server valida le credenziali, crea un JWT contenente l'identità e le autorizzazioni dell'utente, lo firma con una chiave segreta o privata e lo restituisce al client.
- Il client memorizza il token — Il client conserva il JWT, tipicamente in localStorage, sessionStorage o in un cookie HTTP-only.
- Il client invia il token con ogni richiesta — Per ogni successiva richiesta API, il client include il JWT nell'header
Authorizationutilizzando lo schema Bearer:Authorization: Bearer <token>. - Il server verifica il token — Il server verifica la firma del JWT, controlla il tempo di scadenza ed estrae i claim dell'utente per autorizzare la richiesta.
- Nessuna ricerca di sessione richiesta — Poiché il JWT contiene tutte le informazioni necessarie, il server non deve interrogare un database o una cache per identificare l'utente.
Perché Questo È Importante
L'autenticazione tradizionale basata su sessione memorizza gli ID di sessione nella memoria o nel database del server. Ogni richiesta autenticata richiede una ricerca. I JWT eliminano questa ricerca: il token stesso dimostra l'identità dell'utente. Questo rende i sistemi basati su JWT intrinsecamente scalabili, perché qualsiasi server in un cluster può verificare un token senza uno stato di sessione condiviso.
JWT vs Autenticazione Basata su Sessione
| Aspetto | Autenticazione JWT | Autenticazione Basata su Sessione | |---------|--------------------|-----------------------------------| | Archiviazione | Lato client (nel token) | Lato server (in memoria o DB) | | Scalabilità | Nessuno store di sessione condiviso necessario | Richiede uno store di sessione condiviso tra le istanze | | Cross-domain | Funziona naturalmente tra domini | Difficile condividere le sessioni | | Compatibile mobile | Sì (nessun cookie richiesto) | Richiede il supporto dei cookie | | Revoca | Difficile (fino alla scadenza del token) | Facile (elimina la sessione dallo store) | | Dimensione del payload | Maggiore per richiesta (token nell'header) | Minima (solo l'ID di sessione) |
Perché JWT È Utilizzato per la Sicurezza delle API
Le caratteristiche che rendono JWT adatto all'autenticazione lo rendono ideale anche per proteggere le API.
Stateless e Scalabile
Ogni JWT trasporta tutte le informazioni necessarie al server per autorizzare una richiesta. Non c'è un database di sessioni da interrogare, nessuna cache da controllare, nessuno stato da sincronizzare tra i server. I load balancer possono instradare le richieste a qualsiasi istanza del server senza coordinamento.
Cross-Domain e Cross-Origin
JWT funziona naturalmente tra diversi domini e origin. Un token emesso da auth.example.com può essere utilizzato per accedere a api.example.com e admin.example.com. Questo rende JWT il fondamento dei sistemi di single sign-on (SSO).
Autorizzazione Granulare
Il payload JWT può includere claim personalizzati per ruoli, autorizzazioni e appartenenze a organizzazioni:
{
"sub": "user_abc123",
"role": "admin",
"permissions": ["read:users", "write:users", "delete:users"],
"org_id": "org_xyz789",
"iat": 1516239022,
"exp": 1516325422
}
Il server API legge questi claim direttamente dal token senza alcuna ricerca aggiuntiva.
JWT per il Single Sign-On (SSO)
Il single sign-on è uno dei casi d'uso JWT più comuni. In una tipica architettura SSO:
- Un utente accede al provider di identità (IdP), come Auth0, Okta o Keycloak.
- L'IdP emette un JWT firmato con la sua chiave privata.
- L'utente presenta questo JWT a più applicazioni.
- Ogni applicazione verifica la firma utilizzando la chiave pubblica dell'IdP.
- Ogni applicazione si fida del token senza comunicare con l'IdP a ogni richiesta.
Questo modello consente a un singolo accesso di concedere l'accesso a dozzine di servizi — email, archiviazione file, gestione progetti, sistemi HR — senza che ogni servizio implementi il proprio flusso di accesso.
Best Practice di Sicurezza JWT
Sebbene JWT fornisca solide fondamenta per la sicurezza delle API, un'implementazione corretta è essenziale.
Mantieni i Token a Vita Breve
Imposta il claim exp (scadenza) a una durata breve — da 15 minuti a 1 ora per i token di accesso. Usa refresh token a vita più lunga (giorni o settimane) per ottenere nuovi token di accesso senza richiedere all'utente di riautenticarsi.
Usa Sempre HTTPS
JWT non cifra il suo payload. Chiunque intercetti il token può decodificarlo e leggerne il contenuto. Trasmetti sempre i JWT su HTTPS per prevenire l'intercettazione.
Valida Tutto
Verifica sempre la firma, controlla che il token non sia scaduto, conferma che aud (audience) corrisponda alla tua applicazione e rifiuta i token con algoritmi imprevisti.
Memorizza i Token in Modo Sicuro
Lato client, conserva i JWT in cookie HTTP-only quando possibile, oppure in memoria per le applicazioni a pagina singola. Evita localStorage per i token che forniscono accesso a dati sensibili.
Idee Sbagliate Comuni su JWT
"JWT è cifrato." — No. JWT è firmato, non cifrato. Il payload è codificato in base64url, che è reversibile. JWE (JSON Web Encryption) fornisce la cifratura, ma è una specifica separata non coperta dal JWT standard.
"JWT previene il CSRF." — Non da solo. JWT in un header Authorization aiuta, ma se il token è in un cookie, la protezione CSRF è comunque necessaria.
"JWT è solo per l'autenticazione." — JWT è usato per l'autenticazione, ma anche per lo scambio di dati di autorizzazione, sessioni stateless e condivisione sicura di informazioni tra servizi.
Decodifica ed Esplora JWT Online
Usa lo strumento decoder JWT per ispezionare qualsiasi JSON Web Token. Incolla il tuo token e vedi immediatamente header, payload e algoritmo di firma decodificati. Lo strumento ti aiuta a capire quali dati trasportano i tuoi token e a verificare che siano strutturati correttamente.