banner
Casa / Blog / JSON Web token (JWT): chiavi per utilizzarli in sicurezza
Blog

JSON Web token (JWT): chiavi per utilizzarli in sicurezza

Jul 19, 2023Jul 19, 2023

Qualche settimana fa alcuni colleghi di sviluppo ci hanno espresso la loro preoccupazione riguardo alla generazione di JSON Web Token (JWT) che stavano facendo come parte dell'integrazione di un nuovo strumento. Avevano sentito parlare di "parecchi" problemi di sicurezza e volevano che li aiutassimo a verificare se i token emessi fossero corretti e soddisfacessero alcuni requisiti di sicurezza di base.

Attualmente stiamo lavorando a un progetto che aiuta ad automatizzare i test di sicurezza, APICheck, che abbiamo recentemente pubblicato come "open source". APICheck è costituito da un insieme di piccoli strumenti che possono essere interconnessi tramite pipe per poter concatenare l'esecuzione di diversi test sulle richieste alle API, quindi abbiamo dovuto lavorare con la generazione di uno strumento che consentisse di convalidare i token emessi, jwt -checker, in cui abbiamo implementato la possibilità di superare le validazioni che commenteremo sui token. Successivamente mostrerò un esempio di test utilizzando lo strumento.

JWT (JSON Web Token) è uno standard aperto (pubblicato in RFC 7519) che definisce un metodo compatto e autonomo per incapsulare e condividere in modo sicuro le affermazioni su un argomento tra diverse parti utilizzando oggetti JSON. Il contenuto del token può essere considerato attendibile e verificato quando viene firmato digitalmente (JWS, RFC 7515). La firma può essere generata utilizzando chiavi simmetriche (HMAC) o chiavi asimmetriche (RSA o ECDSA). Inoltre, i JWT possono anche contenere dati crittografati (JWE, RFC 7516) per proteggere i dati sensibili, sebbene questo tipo di token non sia oggetto di questo studio.

È importante notare che, per impostazione predefinita, i token non sono crittografati e che la stringa che vediamo è semplicemente una serializzazione utilizzando la codifica base64url, che può essere facilmente decodificata per vedere in chiaro il contenuto JSON del token.

La risposta quindi alla domanda iniziale è 'dipende...'. Come con molte altre tecnologie, JWT dipende fortemente dalla configurazione utilizzata nella generazione e dal corretto utilizzo e convalida dei token nel consumo.

JWT (JSON Web Token) è uno standard aperto che definisce un metodo compatto e autonomo per incapsulare e condividere in modo sicuro asserzioni su un'entità tra diverse parti utilizzando oggetti JSON.

Inizieremo vedendo quali sono le principali tipologie di token e i principali casi d’uso:

JWT consente lo scambio sicuro di dati tra le parti in modo più efficiente rispetto ad altri standard (SAML) grazie alle sue dimensioni ridotte, rendendolo ideale per i seguenti casi d'uso:

Ogni caso d'uso ha un destinatario diverso (applicazione client e servizio API), ma nel caso in cui venga esercitato un controllo simultaneo su entrambi, è possibile utilizzare un unico token per entrambi i casi.

Di seguito elencheremo le migliori pratiche quando si lavora con JWT, concentrandoci solo sulla loro generazione e convalida.

Con pochissime eccezioni (da utilizzare sul lato client per trasportare informazioni e dati sulla sessione per ricostruire l'interfaccia utente) un token non dovrebbe essere emesso senza una firma. La firma è una protezione di base che consente ai consumatori del token di fidarsi di esso e di garantire che non sia stato manomesso.

Quando si sceglie l'algoritmo di firma, tenere presente che gli algoritmi a chiave simmetrica sono vulnerabili agli attacchi di forza bruta se la chiave utilizzata non è abbastanza forte (anche i nomi degli animali domestici e le date di nascita non sono validi per questo ;-), quindi è necessario fornire una complessità sufficiente se vengono scelti algoritmi a chiave simmetrica. D’altro canto, gli algoritmi a chiave asimmetrica semplificano la custodia della chiave, poiché è necessaria solo nella parte server che genera il token.

Un token, una volta firmato, è valido per sempre se non esiste una data di scadenza (claim exp). Nel caso dei "Token di accesso", se qualcuno ne cattura uno potrà avere accesso all'operazione consentita per sempre. Assegnare identificatori (claim jti) ai token ne consente la revoca; in caso di compromissione del token è altamente auspicabile avere la possibilità di revocarlo.