JWT: guida completa ai token di autenticazione

I JSON Web Token (JWT) sono usati per l'autenticazione nelle API moderne. Scopri struttura, funzionamento, sicurezza e best practice di implementazione.

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

  1. L'utente effettua il login inviando credenziali al server
  2. Il server verifica le credenziali e genera un JWT firmato con la sua chiave privata/segreta
  3. Il client riceve e salva il JWT (cookie HttpOnly o memoria)
  4. Ad ogni richiesta successiva il client invia il JWT nell'header Authorization: Bearer <token>
  5. 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