Skip to content

Glossary

Header (JWT/JWS)

Il primo segmento di un JWT

By Published Updated

L’header di un JWT (o JWS) è il primo segmento separato da punti, un oggetto JSON codificato in base64url che descrive le proprietà della firma del token. Decodificalo e otterrai un piccolo oggetto JSON contenente tipicamente 2-5 campi.

Campi standard dell’header (RFC 7515 §4):

  • alg — algoritmo. Obbligatorio. Es.: HS256, RS256, ES256, o none.
  • typ — tipo. Convenzionalmente "JWT" quando il payload è un set di claim JWT.
  • kid — ID chiave. Permette al ricevente di scegliere la chiave corretta da un insieme di chiavi quando l’emittente ruota le chiavi.
  • jwk / jku — JSON Web Key incorporata o URL a una chiave. Meno comune; sensibile alla sicurezza se usata.
  • cty — tipo di contenuto. Usato quando il payload è una struttura JOSE annidata (es. un JWE dentro un JWS).

Esempio pratico. Un header decodificato in:

{ "alg": "RS256", "typ": "JWT", "kid": "2024-q1-key" }

dichiara che il token è firmato con RS256 (RSA + SHA-256), è un JWT (quindi il payload è un set di claim), ed è stato firmato con la chiave identificata da 2024-q1-key nella directory delle chiavi dell’emittente.

Nota di sicurezza critica: non fidarti mai solo del campo alg. Verifica che l’algoritmo corrisponda a ciò per cui la tua chiave è adatta. L’attacco di confusione alg funziona passando un token firmato con HS256 (HMAC) usando la tua chiave pubblica RSA come segreto HMAC — se il tuo verificatore si fida ciecamente di alg, accetta la falsificazione.

La codifica base64url compatta dell’header lo rende ispezionabile dall’uomo: incollare il primo segmento separato da punti di qualsiasi JWT in un decodificatore base64url rivela l’algoritmo e il riferimento alla chiave in pochi secondi. Questo è il punto di ingresso di ogni sessione di debug JWT — se l’header si decodifica in spazzatura, il token è malformato; se si decodifica in un oggetto JSON che non riconosci, l’emittente ha cambiato qualcosa.

Quando e perché è importante

L’header JWT è importante ogni volta che un servizio verifica un token. La catena CVE classica: un verificatore accetta il campo alg per quello che è e lascia passare un token che specifica "alg": "none" senza alcuna verifica della firma. Questo bug è arrivato in librerie di produzione fino al 2015 (CVE-2015-9235, che ha interessato node-jsonwebtoken di Auth0). La difesa è imporre, nella chiamata di verifica, l’algoritmo esatto che la libreria dovrebbe accettare — es. jwt.verify(token, key, { algorithms: ['RS256'] }) — e non fidarsi mai dell’header per scegliere l’algoritmo. Una seconda classe di bug, l’attacco di confusione alg, sfrutta librerie che selezionano automaticamente HMAC vs RSA in base all’header: l’attaccante passa al verificatore un token che dichiara HS256 ma lo firma con la chiave pubblica RSA (che è pubblica) usata come segreto HMAC. Il verificatore valida rispetto alla chiave pubblica e accetta la falsificazione. Entrambi i bug sono problemi di fiducia nell’header. Per le nuove integrazioni JWT, controlla la chiamata di verifica e verifica che fissi l’algoritmo. Riferimento: OWASP — Cheat sheet JSON Web Token.

Il campo kid nell’header per la rotazione delle chiavi in produzione: in qualsiasi sistema reale che emette token su larga scala, la chiave di firma deve ruotare periodicamente — ogni 90 giorni è una politica comune. Il campo kid consente all’emittente di pubblicare più chiavi contemporaneamente (chiavi vecchie per token in transito, nuove chiavi per nuove emissioni) e al verificatore di scegliere quella giusta da un endpoint JWKS. Il pattern di rotazione standard: annunciare la nuova chiave nel JWKS continuando a firmare con quella vecchia, attendere un token-lifetime, passare l’emissione alla nuova chiave, attendere un altro lifetime, poi rimuovere la vecchia chiave dal JWKS. Il campo kid è ciò che rende questo processo fluido — senza di esso, la rotazione delle chiavi richiede una migrazione sincronizzata in un giorno preciso.

Come appare il vettore di attacco jku / x5u: alcune implementazioni consentono all’header di puntare a un URL arbitrario dove presumibilmente risiede la chiave di verifica. Un attaccante che imposta jku a un URL che controlla può presentare qualsiasi chiave voglia e il verificatore la userà. Le linee guida moderne (RFC 8725, best practice JOSE) sono di rifiutare completamente jku/x5u oppure imporre una lista di URL affidabili. Le nuove integrazioni JWT non dovrebbero fare affidamento sulla posizione della chiave controllata dall’header. Riferimento: RFC 8725 — Best Current Practices per JSON Web Token.

Prova il calcolatore

Ispeziona i campi alg, typ e kid in qualsiasi header JWT con un semplice incolla.

Apri il decodificatore JWT →

Frequently asked questions

Che cos’è un header JWT?
L’header JWT è il primo segmento codificato in base64url di un token. È un oggetto JSON che dichiara il tipo di token (typ) e l’algoritmo di firma (alg), come HS256 o RS256.
Come influisce l’header sulla verifica del token?
Il verificatore legge il claim alg nell’header per determinare quale algoritmo usare per controllare la firma. Se l’header viene manomesso, la firma ricalcolata non corrisponderà.
Cos’è la vulnerabilità ‘alg: none’?
Alcune librerie JWT iniziali accettavano alg: none nell’header e saltavano completamente la verifica della firma, permettendo a chiunque di falsificare token. Le implementazioni sicure devono inserire in whitelist gli algoritmi accettati e rifiutare ‘none’.
Posso memorizzare dati personalizzati nell’header JWT?
Tecnicamente sì — l’header è estensibile — ma per convenzione solo i parametri dell’algoritmo (alg, typ, kid, cty) appartengono all’header. I claim personalizzati dovrebbero andare nel payload, non nell’header.

Related

Published May 16, 2026 · Last reviewed May 31, 2026