jwt

JWT: cosa è il JSON Web Token?

La sicurezza in informatica è in continua evoluzione. Lo studio di sistemi per la protezione di dati e di big data è in continuo progresso. JWT, acronimo di JSON Web Token, è un sistema di cifratura e di contatto in formato JSON per lo scambio di informazioni tra i vari servizi di un server. Si genera così un token che può essere cifrato e firmato tramite una chiave disponibile solo a colui che lo ha effettivamente generato.

L’algoritmo di firma viene elaborato tramite HMAC o con chiavi pubbliche e/o private con standard RSA o ECDSA.

I JWT sono ormai una consolidata realtà e vengono utilizzati nei web services per autenticare un client. Il sistema di funzionamento è abbastanza semplice: il client invia una richiesta al server e questo genera un token di autenticazione che il client utilizzerà tutte le volte che andrà a collegarsi allo stesso nodo.

Composizione del token JWT

Il token si compone di tre corpi essenziali:

  1. Header che contiene le due informazioni base: la tipologia del token, che nel nostro caso è JWT, e quella dell’algoritmo utilizzato per la cifratura;
  2. Payload, il blocco che contiene le informazioni di scambio tra le parti. Questo a sua volta si divide in tre fasi: parametri registrati, parametri pubblici e parametri privati.
    Con i parametri registrati andiamo a indicare quelle proprietà che sono predefinite e che servono a mostrare le peculiarità del token. Sono, per dirla tutta, stringhe, dati e array che servono per il corretto funzionamento del sistema.
    Con i parametri pubblici invece indichiamo altri dati che sono predefiniti nel IANA JSON Web Token Registry. Questi parametri possono essere inseriti a scelta dello user ma bisogna stare attenti in questa fase perché è possibile che si possano registrare delle problematiche se l’inserimento non è stato fatto correttamente.
    Con in parametri privati ci si può sbizzarrire: è un corpo che viene lasciato alla libera determinazione del compilatore. Questa flessibilità è propria della struttura JSON e ne ha caratterizzato il successo.
  3. Signature, la fase di cifratura delle due parti: Payload e Header. Queste vengono dapprima unite e poi sottoposte a un’operazione di crittografia estremamente complessa. Alla fine dell’operazione viene generata una chiave che darà luogo a un token di oltre 200 caratteri.

È importante comunque capire che il contenuto del token non è cifrato. Si può scompattare e decriptare a piacimento per cui è importante che non vengano inseriti dati sensibili come password. La sicurezza viene garantita con una chiave segreta dal server e quindi un qualsiasi dato che venga manipolato non sarà accettato da questo, vietandone di fatto l’accesso ai dati.

Un esempio di utilizzo

Con il sistema di autenticazione tradizionale, l’utente inseriva le credenziali e le inviava al server che le controllava e rilasciava l’autorizzazione a procedere.

Ad esempio se Mario Rossi voleva entrare in Facebook inseriva il suo username, mrossi2019, e la password specifica. Il sistema verificava e dava l’autorizzazione ad entrare. I problemi nascevano dal fatto che spesso i server di una grande struttura non disponevano tutti di tutte le credenziali dei vari utenti. Questo faceva sì che molti utenti dovevano riprovare l’autenticazione più volte prima di poter accedere.

L’arrivo di JSON ha cambiato questo panorama perché ha ribaltato i ruoli. Con il sistema che abbiamo descritto lo user invia i suoi dati al server; questo rilascerà un token di accesso che sarà utilizzato ogni volta che lo stesso utente vorrà entrare nel sistema.

Il segreto, in buona sostanza, che determina la sicurezza di JSON è nella fase di signature che abbiamo descritto in precedenza. La stringa che viene creata può essere letta dal solo server che è in possesso della chiave segreta che ha generato.

Il token che viene rilasciato allo user è quindi una sequenza alfanumerica che racchiude dei dati ma non permette l’accesso al server, che si preoccuperà di verificare solo la veridicità dell’hash.