JSON Web Token (JWT) รจ uno standard aperto (RFC 7519) per il trasferimento sicuro di informazioni tra parti sotto forma di oggetto JSON. JWT รจ ampiamente utilizzato per l'autenticazione e l'autorizzazione nelle moderne applicazioni Web e API. In questo articolo, daremo uno sguardo dettagliato a come funzionano i token JWT, di cosa sono fatti e come usarli in sicurezza.
Cos'รจ JWT?
JWT (pronunciato "jot") รจ un modo compatto e sicuro per gli URL per rappresentare i reclami tra due parti. Il token รจ composto da tre parti separate da punti: Header.Payload.Signature. Ogni parte รจ codificata in Base64URL.
A differenza delle sessioni tradizionali, in cui il server memorizza lo stato dell'utente, JWT รจ stateless: tutte le informazioni necessarie sono contenute nel token stesso. Ciรฒ rende JWT ideale per sistemi distribuiti e architetture di microservizi.
Struttura token JWT
Intestazione (Intestazione)
L'intestazione solitamente contiene due campi: tipo di token (typ) e algoritmo di firma (alg). Gli algoritmi piรน comuni sono HS256 (HMAC con SHA-256) e RS256 (RSA con SHA-256).
Intestazione di esempio:
{
"alg": "HS256",
"typ": "JWT"
}
Carico utile (Carico utile)
Payload contiene affermazioni: dichiarazioni sull'utente e metadati aggiuntivi. Esistono tre tipi di reclami:
- Sinistri registrati โ campi standard:
iss(emittente),exp(data di scadenza),sub(oggetto),aud(pubblico),iat(ora di creazione) - Affermazioni pubbliche - definite nel registro IANA o dotate di un URI per evitare collisioni
- Reclami privati โ campi arbitrari concordati tra le parti (ad es.
user_id,role)
Esempio di carico utile:
{
"sub": "1234567890",
"name": "John Doe",
"role": "admin",
"iat": 1516239022,
"exp": 1516242622
}
Firma (Firma)
La firma viene creata codificando Header e Payload in Base64URL, unendoli con un punto e firmando con una chiave segreta. La firma garantisce che il token non sia stato modificato dopo la creazione.
Per HS256, la formula รจ simile a questa:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
Come funziona l'autenticazione JWT
Il processo di autenticazione con JWT solitamente si presenta cosรฌ:
- Login: L'utente invia le sue credenziali (email + password) al server
- Generazione del token: Il server controlla i dati e, se sono corretti, crea un JWT con le attestazioni necessarie
- Archiviazione: Il client memorizza il token (solitamente in localStorage o nel cookie httpOnly)
- Invio di richieste: Ad ogni richiesta, il client aggiunge un token all'intestazione
Authorization: Bearer <token> - Verifica: Il server verifica la firma del token ed estrae i dati utente dal payload
Vantaggi di JWT
- Stateless: Il server non ha bisogno di archiviare le sessioni nel database o nella memoria
- Scalabilitร : Ideale per i microservizi: qualsiasi servizio puรฒ verificare il token
- Interdominio: JWT รจ facile da usare tra diversi domini e servizi
- Compattezza: Le dimensioni ridotte consentono il passaggio di token nell'URL, parametri POST o intestazioni
- Autosufficienza: Tutte le informazioni per l'autorizzazione sono contenute nel token
JWT Sicurezza: migliori pratiche
1. Imposta sempre una data di scadenza
Non creare mai token senza reclamo exp. La durata consigliata di un token di accesso รจ compresa tra 15 minuti e 1 ora. Per sessioni piรน lunghe, utilizza i token di aggiornamento.
2. Utilizza httpSolo cookie
Invece di localStorage, รจ meglio archiviare JWT nei cookie httpOnly, che non sono accessibili a JavaScript. Questo protegge dagli attacchi XSS. Inoltre, seleziona le caselle Secure e SameSite.
3. Non archiviare dati sensibili nel payload
Payload รจ codificato solo Base64, non crittografato. Chiunque puรฒ decodificarlo. Non includere mai password, numeri di carta di credito o altre informazioni sensibili.
4. Utilizza algoritmi affidabili
Evita l'algoritmo none. Per una firma simmetrica, utilizzare HS256 con un segreto lungo (minimo 256 bit).Per asimmetrico โ RS256 o ES256.
5. Convalida tutte le rivendicazioni
Quando verifichi un token, controlla sempre: exp (non scaduto), iss (emittente corretto), aud (destinatario corretto). Non fidarti di un token solo se ha una firma valida.
6. Implementa il ritiro del token
Sebbene JWT sia stateless, a volte รจ necessario revocare il token (ad esempio, quando ti disconnetti o cambi la password). A tale scopo, utilizza una lista nera di token o una durata breve con token di aggiornamento.
Errori tipici quando si lavora con JWT
- La mancanza di verifica della firma รจ l'errore piรน pericoloso che ti consente di falsificare un token
- Utilizzo di un segreto debole: segreti brevi o prevedibili possono essere rilevati con la forza bruta
- Archiviazione in localStorage โ Vulnerabilitร agli attacchi XSS
- Scadenza troppo lunga: aumenta la finestra di attacco quando il token viene compromesso
- Trasmissione tramite URL: il token potrebbe finire nei registri del server e nella cronologia del browser
JWT vs Sessioni: quando utilizzare cosa
JWT รจ ideale per:
- Applicazioni a pagina singola (SPA) con un'API separata
- Architettura di microservizi
- App mobili
- Sistemi con Single Sign-On(SSO)
Le sessioni tradizionali sono migliori per:
- Applicazioni web server (Laravel, Rails, Django)
- Applicazioni che richiedono la revoca immediata dell'accesso
- Progetti semplici senza architetture complesse
Esercitazione: decodifica JWT
Vuoi vedere cosa c'รจ dentro un token JWT? Utilizza il nostro JWT decoder โ smonta il token in componenti, mostra l'intestazione, il payload e controlla la firma. Questo รจ uno strumento utile per gli sviluppatori durante il debug dell'autenticazione.
Conclusione
I tokenJWT sono un potente meccanismo di autenticazione per le applicazioni moderne. They provide stateless authorization, are easily scalable and work between different services. La cosa principale รจ seguire le regole di sicurezza: impostare la data di scadenza, utilizzare algoritmi affidabili, archiviare i token in modo sicuro e convalidare tutte le richieste. Se utilizzato correttamente, JWT semplifica notevolmente l'architettura e migliora le prestazioni dell'applicazione.