🔬 JWT Lab — Crea, decodifica e verifica token
Decodifica qualsiasi token JWT, crea nuovi token con payload personalizzato, simula scadenze. Tutto nel browser.
Apri JWT Lab →

Cos'è un JWT?

JWT sta per JSON Web Token, definito dallo standard RFC 7519. È una stringa compatta e auto-contenuta che codifica informazioni (detti "claim") in modo verificabile e opzionalmente cifrato. Il caso d'uso più comune è l'autenticazione: dopo il login, il server emette un JWT che il client allega a ogni richiesta successiva.

La caratteristica chiave di JWT è l'essere stateless: il server non deve consultare un database di sessioni per verificare l'identità — verifica solo la firma matematica del token.

La struttura di un JWT

Un JWT è composto da tre parti separate da un punto (.), ognuna codificata in Base64URL:

Header
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ik1hcmlvIFJvc3NpIiwiaWF0IjoxNzE0MDAwMDAwfQ
Signature
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1. Header

Contiene il tipo di token (JWT) e l'algoritmo usato per la firma. Decodificato in JSON:

{ "alg": "HS256", // algoritmo: HS256, RS256, ES256... "typ": "JWT" }

2. Payload (i "claim")

Contiene le informazioni sull'utente e sul token. I claim standard (definiti da RFC 7519) includono:

{ "sub": "user_42", // subject: l'ID dell'utente "iss": "api.myapp.com", // issuer: chi ha emesso il token "aud": "myapp.com", // audience: per chi è destinato "iat": 1714000000, // issued at: timestamp emissione "exp": 1714003600, // expiration: scadenza (unix timestamp) "nbf": 1714000000, // not before: valido solo dopo questo momento // Claim custom (tutto quello che vuoi aggiungere): "email": "mario@esempio.it", "role": "admin", "plan": "pro" }

⚠️ Il payload NON è cifrato! È solo codificato in Base64URL — chiunque può leggerlo. Non mettere mai password, chiavi API o dati sensibili nel payload JWT.

3. Signature

È la garanzia di integrità. Viene calcolata così:

HMACSHA256( base64url(header) + "." + base64url(payload), secret_key )

Se qualcuno modifica anche solo un carattere del payload, la firma non corrisponderà più e il server rifiuterà il token. Non puoi falsificare un JWT senza conoscere la chiave segreta.

Il flusso di autenticazione JWT

  1. Login: il client invia username e password al server
  2. Verifica credenziali: il server autentica l'utente
  3. Emissione token: il server firma un JWT con la chiave segreta e lo invia al client
  4. Richieste successive: il client allega il JWT nell'header Authorization: Bearer <token>
  5. Verifica stateless: il server verifica la firma — senza query al database

Access token e Refresh token

Il punto debole di JWT è la revoca: un token valido rimane valido fino alla scadenza anche se l'utente fa logout. La soluzione standard è il pattern access + refresh token:

// Client: access token scaduto → chiede rinnovo POST /auth/refresh Authorization: Bearer {refresh_token} // Server: verifica refresh token nel DB, emette nuovo access token { "access_token": "eyJ...", "expires_in": 900 }

Algoritmi di firma: HS256 vs RS256 vs ES256

HS256 — HMAC-SHA256

  • Chiave simmetrica (stessa per firma e verifica)
  • Semplice da implementare
  • Veloce
  • Tutti i servizi devono condividere il segreto
  • Ideale: monoliti, microservizi interni

RS256 — RSA-SHA256

  • Coppia di chiavi asimmetrica
  • Chiave privata: solo il server di auth firma
  • Chiave pubblica: qualsiasi servizio verifica
  • Più lento di HS256
  • Ideale: architetture a microservizi, OAuth 2.0

ES256 — ECDSA

  • Asimmetrico come RS256
  • Firma molto più corta (256 bit vs 2048 RSA)
  • Più veloce di RS256
  • Ideale: mobile, IoT, performance critiche

⚠️ Algoritmo "none"

  • Nessuna firma — token non verificato
  • Mai usare in produzione
  • Alcuni parser vulnerabili accettano "alg: none"
  • Verifica sempre che il tuo backend lo rifiuti

Dove salvare il JWT nel browser?

Questa è una delle domande più dibattute nello sviluppo web. Le opzioni:

Best practice moderna: access token in memoria, refresh token in cookie HttpOnly. Il refresh avviene in modo silenzioso quando l'access token scade, usando il refresh token dal cookie.

Quando NON usare JWT

JWT è spesso usato dove non serve. Considera alternative quando:


FAQ

JWT e session token sono la stessa cosa?

No. I session token sono opachi — il server mantiene lo stato in memoria o database. I JWT sono auto-contenuti: il server non tiene stato, verifica solo la firma. JWT è stateless, il session token è stateful.

Posso revocare un JWT prima della scadenza?

Non nativamente. Le soluzioni sono: access token con scadenza breve (5–15 min) + refresh token revocabile in DB, oppure una blocklist dei token revocati (aggiunge stato ma rimane selettivo). La prima è la più usata.

HS256 o RS256: quale algoritmo scegliere?

HS256 (simmetrico) è più semplice e veloce ma richiede di condividere il segreto tra tutti i servizi. RS256 (asimmetrico) è preferibile quando più servizi devono verificare i token senza poterli emettere — tipico nei microservizi.

Dove salvare il JWT nel browser?

I cookie HttpOnly + Secure + SameSite=Strict sono la scelta più sicura: non accessibili da JavaScript e protetti da CSRF con SameSite. localStorage è pratico ma vulnerabile a XSS. La best practice moderna è access token in memoria + refresh token in cookie HttpOnly.