![]() |
La gestione dell'autenticazione e dello scambio sicuro di dati tra sistemi distribuiti rappresenta una sfida quotidiana e fondamentale. Quante volte ci siamo trovati a gestire sessioni complesse, interrogazioni continue al database o problemi di scalabilità legati al tradizionale stato di login?
È qui che entrano in gioco i JWT, uno standard industriale robusto ed elegante che ha rivoluzionato il modo in cui client e server comunicano.
In questo articolo analizzeremo cosa sono i JWT, come si articolano all'interno del loro flusso tipico, qual è la loro struttura interna e perché sono diventati lo strumento indispensabile per proteggere API RESTful, microservizi e applicazioni di ultima generazione.
Che cos'è un JWT?
Nello sviluppo web moderno, la gestione dell'autenticazione e dello scambio sicuro di dati tra sistemi differenti rappresenta un pilastro fondamentale. Il JWT (JSON Web Token), definito formalmente dallo standard RFC 7519, è uno standard aperto che consente di trasmettere informazioni in modo sicuro tra due parti sotto forma di oggetto JSON.
Ciò che rende i JWT estremamente popolari e versatili è la loro natura intrinseca, riassumibile in tre caratteristiche chiave:
Compatto (Compact)
Grazie alle sue dimensioni ridotte, un JWT può essere facilmente trasmesso tramite URL, parametri POST o inserito all'interno delle intestazioni HTTP (header) durante le richieste di rete.
Sicuro (Secure)
Il token è firmato digitalmente. Questo garantisce che sia a prova di manomissione (tamper-proof) e verificabile in ogni momento dal ricevente, che può certificarne l'autenticità.
Senza Stato (Stateless)
Non richiede alcuna memorizzazione di sessione lato server. Tutte le informazioni necessarie sull'utente sono racchiuse direttamente all'interno del token stesso.
Come funziona il flusso JWT?
Il ciclo di vita di un JSON Web Token si sviluppa attraverso un flusso logico lineare ed efficiente tra un utente (client) e un server. Tutto comincia quando l'utente invia una richiesta di login fornendo le proprie credenziali. Il server verifica l'identità dell'utente e, in caso di successo, genera un JWT strutturato in tre sezioni distinte separate da punti: xxxxx.yyyyy.zzzzz (corrispondenti rispettivamente a Header, Payload e Signature).
Una volta ricevuto il token dal server, il client lo memorizza e lo invia automaticamente insieme a ogni successiva richiesta protetta, solitamente inserendolo nell'intestazione di autorizzazione HTTP. A questo punto, il server riceve la richiesta, verifica l'autenticità e l'integrità del JWT senza la necessità di interrogare un database per recuperare lo stato della sessione, procedendo infine all'elaborazione della richiesta e restituendo la risposta desiderata.
![]() |
| Flusso JWT |
La struttura di un JWT
Prima di analizzare nel dettaglio le singole componenti che compongono la struttura di un token, è utile osservare l'aspetto concreto di un JWT reale. Una volta generato ed emesso, un JSON Web Token appare come una lunga stringa alfanumerica composta da tre segmenti separati da punti:
Decodificando i due blocchi in Base64Url (la prima e la seconda parte), otteniamo i rispettivi oggetti JSON leggibili in chiaro:
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "123456",
"name": "John Doe",
"role": "admin",
"exp": 1719999999
}
Analizzando da vicino la composizione del token, notiamo che esso è formato da tre parti concatenate, ciascuna con un compito ben preciso:
- HEADER: Contiene il tipo di token (ovvero che si tratta di un JWT) e l'algoritmo di firma crittografica utilizzato, come ad esempio HMAC SHA256 o RSA. Un tipico esempio di header in formato JSON specifica
"alg": "HS256"e"typ": "JWT". - PAYLOAD: È il corpo centrale del token e contiene i cosiddetti claims, ovvero le informazioni sull'utente e altri dati utili al sistema (come identificativi, ruoli o date di scadenza).
- SIGNATURE: La firma serve a garantire che il token non sia stato modificato lungo il percorso. Si ottiene combinando l'header codificato, il payload codificato e una chiave segreta tramite l'algoritmo specificato nell'header.
I Claims comuni
I claims presenti nel payload possono essere di vario tipo. Esistono tuttavia dei claims standard raccomandati (sebbene non obbligatori) per definire informazioni interoperabili e standardizzate:
| Claim | Descrizione |
|---|---|
| iss | Issuer (Ente emittente del token) |
| sub | Subject (Identificativo univoco dell'utente, es. User ID) |
| aud | Audience (Destinatario a cui è diretto il token) |
| exp | Expiration time (Data e ora di scadenza oltre la quale il token non è più valido) |
| iat | Issued at (Timestamp che indica quando il token è stato emesso) |
| nbf | Not before (Istante temporale prima del quale il token non deve essere accettato) |
| jti | JWT ID (Identificativo univoco assegnato al token) |
Grazie a questa architettura, i JWT trovano un impiego estesissimo in molteplici contesti tecnologici moderni, venendo ampiamente utilizzati per l'Autenticazione e l'Autorizzazione all'interno di applicazioni web, API RESTful, architetture a microservizi e applicazioni mobile.
Focus sulla Signature: Come funziona e perché è fondamentale
La firma (o signature) è l'elemento architetturale che trasforma una semplice stringa di dati leggibili in un lasciapassare sicuro e verificabile. Per comprendere la sua utilità con semplicità, possiamo immaginare un documento cartaceo ufficiale chiuso all'interno di una busta sigillata con la ceralacca e timbrata dal notaio: chiunque può leggere il contenuto, ma se qualcuno tentasse di alterare anche una sola parola all'interno della busta senza possedere il timbro e la ceralacca originali, il sigillo verrebbe inevitabilmente compromesso, smascherando il tentativo di frode.
Nel mondo digitale dei JWT, la firma opera esattamente allo stesso modo. Essa non serve a cifrare o nascondere il contenuto del payload (che resta perfettamente leggibile da chiunque decodifichi la stringa Base64), bensì a certificarne l'integrità e la provenienza. Il server che genera il token possiede una chiave segreta (nota solo a lui). Quando comporre il token, il server prende l'header e il payload codificati, li unisce con un punto, e applica una funzione crittografica (come HMAC-SHA256) utilizzando la propria chiave segreta.
Esempio pratico: Supponiamo che un utente malintenzionato intercetti un JWT e provi a modificare il payload passando da "role": "user" a "role": "admin". Nel momento in cui il client invia questo token modificato al server, il server ricalcolerà la firma prendendo l'header e il nuovo payload alterato, applicando la chiave segreta. Poiché la chiave segreta è nota solo al server e il payload è cambiato, la firma risultante sarà completamente diversa da quella allegata dall'attaccante. Il server confronterà la firma ricalcolata con quella ricevuta, noterà la discrepansa e rigetterà immediatamente la richiesta.
Questo meccanismo garantisce che nessun utente possa falsificare la propria identità o i propri privilegi, rendendo i JWT uno strumento robusto, elegante e sicuro per l'architettura dei sistemi distribuiti contemporanei.
Conclusioni
I JSON Web Token (JWT) si sono affermati come uno degli standard de facto più apprezzati e utilizzati nello sviluppo software moderno. La loro forza risiede in un equilibrio ideale tra semplicità, sicurezza e scalabilità: consentendo un'architettura completamente stateless, i JWT liberano i server dal carico di gestire e memorizzare le sessioni degli utenti, facilitando enormemente il ridimensionamento delle applicazioni su larga scala.
Dalle API RESTful ai microservizi, passando per le Single Page Application (SPA) e le app mobile, la combinazione di una struttura compatta (Header e Payload) e di un meccanismo di verifica crittografico (Signature) garantisce uno scambio dati fluido, veloce ed elevati standard di integrità.
Tuttavia, come per ogni strumento tecnologico, l'efficacia dei JWT dipende dalla loro corretta implementazione:
- Il Payload non è cifrato: Ricorda sempre che il payload è semplicemente codificato in Base64Url e quindi leggibile da chiunque. Non inserire mai dati sensibili come password, carte di credito o chiavi private all'interno del token.
- Imposta sempre una scadenza (exp): Un token privo di scadenza o con una durata troppo lunga rappresenta un rischio critico per la sicurezza in caso di furto.
- Usa la connessione cifrata (HTTPS): Trasmettere i token attraverso canali protetti previene attacchi di tipo Man-in-the-Middle.
Padroneggiare la struttura e il funzionamento dei JWT permette di progettare architetture moderne, veloci e sicure, offrendo agli utenti un'esperienza fluida e garantendo agli sviluppatori la massima flessibilità nei sistemi distribuiti.
Follow me #techelopment
Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment

