Cos'è un JWT
Un JSON Web Token (JWT, pronunciato "jot") è uno standard aperto (RFC 7519) per trasmettere in modo compatto e sicuro informazioni tra parti come oggetti JSON. Viene usato principalmente per l'autenticazione (chi sei) e l'autorizzazione (cosa puoi fare) nelle API REST e nelle Single Page Application.
Struttura di un JWT
Un JWT è composto da tre parti separate da punti: xxxxx.yyyyy.zzzzz
- Header: JSON codificato in Base64URL contenente il tipo ("typ": "JWT") e l'algoritmo di firma ("alg": "HS256" o "RS256")
- Payload: JSON codificato in Base64URL con i claims (affermazioni sul soggetto): sub, iat, exp, email, ruoli, ecc.
- Signature: firma crittografica calcolata su header + payload con la chiave segreta o privata
Esempio di payload: { "sub": "1234567890", "name": "Mario Rossi", "iat": 1516239022, "exp": 1516242622, "role": "admin" }.
Come funziona l'autenticazione con JWT
- L'utente effettua il login inviando credenziali al server
- Il server verifica le credenziali e genera un JWT firmato con la sua chiave privata/segreta
- Il client riceve e salva il JWT (cookie HttpOnly o memoria)
- Ad ogni richiesta successiva il client invia il JWT nell'header Authorization: Bearer <token>
- Il server verifica la firma del JWT senza fare query al database
HS256 vs RS256
- HS256 (HMAC-SHA256): chiave simmetrica condivisa tra chi genera e chi verifica il token. Semplice ma la stessa chiave deve essere disponibile ovunque
- RS256 (RSA-SHA256): coppia di chiavi asimmetrica. Il server firma con la chiave privata; chiunque verifica con la chiave pubblica. Ideale per sistemi distribuiti (OAuth2, OIDC)
Best practice di sicurezza
- Imposta sempre exp (expiration) breve: 15 minuti per access token
- Usa refresh token separati con rotazione (rotation) per sessioni lunghe
- Non inserire dati sensibili nel payload: è solo codificato in Base64, non cifrato
- Salva i JWT in cookie HttpOnly + Secure + SameSite=Strict per prevenire XSS
- Invalida i token compromessi con una lista di revoca (JTI deny-list) o ruota la chiave segreta