NOVITÀ: scarica gratuitamente il manuale JWT e impara a fondo i JWT!
Che cos’è il token Web JSON?
JSON Web Token (JWT) è uno standard aperto (RFC 7519) che definisce un modo compatto e autonomo per la trasmissione sicura di informazioni tra le parti come oggetto JSON. Queste informazioni possono essere verificate e attendibili perché sono firmate digitalmente. I JWT possono essere firmati utilizzando un segreto (con l’algoritmo HMAC) o una coppia di chiavi pubblica/privata utilizzando RSA o ECDSA.,
Sebbene i JWT possano essere crittografati per fornire anche segretezza tra le parti, ci concentreremo sui token firmati. I token firmati possono verificare l’integrità delle attestazioni contenute al suo interno, mentre i token crittografati nascondono tali attestazioni da altre parti. Quando i token vengono firmati utilizzando coppie di chiavi pubbliche/private, la firma certifica anche che solo la parte che detiene la chiave privata è quella che l’ha firmata.
Quando dovresti usare i token Web JSON?
Ecco alcuni scenari in cui i token Web JSON sono utili:
-
Autorizzazione: Questo è lo scenario più comune per l’utilizzo di JWT., Una volta che l’utente ha effettuato l’accesso, ogni richiesta successiva includerà il JWT, consentendo all’utente di accedere a percorsi, servizi e risorse consentiti con quel token. Single Sign On è una funzionalità che utilizza ampiamente JWT al giorno d’oggi, a causa del suo piccolo overhead e della sua capacità di essere facilmente utilizzata in diversi domini.
-
Scambio di informazioni: i token Web JSON sono un buon modo per trasmettere in modo sicuro informazioni tra le parti. Poiché i JWT possono essere firmati, ad esempio utilizzando coppie di chiavi pubbliche/private, puoi essere sicuro che i mittenti siano chi dicono di essere., Inoltre, poiché la firma viene calcolata utilizzando l’intestazione e il payload, è anche possibile verificare che il contenuto non sia stato manomesso.
Qual è la struttura del token Web JSON?
Nella sua forma compatta, i token Web JSON sono costituiti da tre parti separate da punti (.
), che sono:
- Header
- Payload
- Signature
Pertanto, un JWT in genere assomiglia al seguente.
xxxxx.yyyyy.zzzzz
Scomponiamo le diverse parti.,
Header
L’intestazione consiste tipicamente di due parti: il tipo di token, che è JWT, e l’algoritmo di firma utilizzato, come HMAC SHA256 o RSA.
Ad esempio:
{ "alg": "HS256", "typ": "JWT"}
Quindi, questo JSON è codificato in Base64Url per formare la prima parte del JWT.
Payload
La seconda parte del token è il payload, che contiene le attestazioni. Le attestazioni sono dichiarazioni su un’entità (in genere, l’utente) e dati aggiuntivi.Esistono tre tipi di reclami: reclami registrati, pubblici e privati.,
-
Attestazioni registrate: si tratta di un insieme di attestazioni predefinite che non sono obbligatorie ma raccomandate, per fornire una serie di attestazioni utili e interoperabili. Alcuni di questi sono: iss (emittente), exp (tempo di scadenza), sub (soggetto), aud (pubblico) e altri.
Si noti che i nomi delle rivendicazioni sono lunghi solo tre caratteri in quanto JWT è pensato per essere compatto.
-
Affermazioni pubbliche: queste possono essere definite a piacimento da coloro che usano JWTs., Ma per evitare collisioni dovrebbero essere definiti nel registro dei token Web IANA JSON o essere definiti come un URI che contiene uno spazio dei nomi resistente alle collisioni.
-
Rivendicazioni private: queste sono le rivendicazioni personalizzate create per condividere informazioni tra le parti che concordano sull’utilizzo e non sono né richieste registrate né pubbliche.
Un esempio di payload potrebbe essere:
{ "sub": "1234567890", "name": "John Doe", "admin": true}
Il payload viene quindi codificato in Base64Url per formare la seconda parte del Token Web JSON.,
Si noti che per i token firmati questa informazione, sebbene protetta da manomissioni, è leggibile da chiunque. Non inserire informazioni segrete negli elementi payload o header di un JWT a meno che non sia crittografato.
Signature
Per creare la parte di firma devi prendere l’intestazione codificata, il payload codificato, un segreto, l’algoritmo specificato nell’intestazione e firmarlo.,
Ad esempio se si desidera utilizzare l’algoritmo HMAC SHA256, la firma verrà creata nel modo seguente:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
La firma viene utilizzata per verificare che il messaggio non sia stato modificato lungo il percorso e, nel caso di token firmati con una chiave privata, può anche verificare che il mittente del JWT sia chi dice di essere.
Mettendo tutti insieme
L’output è di tre stringhe Base64-URL separate da punti che possono essere facilmente passati in ambienti HTML e HTTP, pur essendo più compatto rispetto agli standard basati su XML come SAML.,
Quanto segue mostra un JWT con l’intestazione e il payload precedenti codificati ed è firmato con un segreto.
Se vuoi giocare con JWT e mettere in pratica questi concetti, puoi usare jwt.io Debugger per decodificare, verificare e generare JWT.
Come funzionano i token Web JSON?
Nell’autenticazione, quando l’utente accede correttamente utilizzando le proprie credenziali, verrà restituito un token Web JSON. Poiché i token sono credenziali, è necessario prestare molta attenzione per prevenire problemi di sicurezza., In generale, non dovresti mantenere i token più a lungo del necessario.
Non è inoltre necessario memorizzare i dati sensibili della sessione nella memoria del browser a causa della mancanza di sicurezza.
Ogni volta che l’utente desidera accedere a un percorso o una risorsa protetta, l’agente utente deve inviare il JWT, in genere nell’intestazione di autorizzazione utilizzando lo schema Bearer. Il contenuto dell’intestazione dovrebbe essere il seguente:
Authorization: Bearer <token>
Questo può essere, in alcuni casi, un meccanismo di autorizzazione senza stato., I percorsi protetti del server verificheranno la presenza di un JWT valido nell’intestazione Authorization
e, se presente, l’utente potrà accedere alle risorse protette. Se il JWT contiene i dati necessari, la necessità di interrogare il database per determinate operazioni può essere ridotta, anche se questo potrebbe non essere sempre il caso.
Se il token viene inviato nell’intestazione Authorization
, la condivisione delle risorse cross-Origin (CORS) non sarà un problema in quanto non utilizza i cookie.,
Il seguente diagramma mostra come un JWT viene ottenuto e utilizzato per accedere alle API o alle risorse:
- L’applicazione o il client richiede l’autorizzazione al server di autorizzazione. Questo viene eseguito attraverso uno dei diversi flussi di autorizzazione. Ad esempio, una tipica applicazione Web compatibile con OpenID Connect passerà attraverso l’endpoint
/oauth/authorize
utilizzando il flusso del codice di autorizzazione. - Quando viene concessa l’autorizzazione, il server di autorizzazione restituisce un token di accesso all’applicazione.,
- L’applicazione utilizza il token di accesso per accedere a una risorsa protetta (come un’API).
Si noti che con i token firmati, tutte le informazioni contenute nel token sono esposte agli utenti o ad altre parti, anche se non sono in grado di modificarle. Ciò significa che non dovresti inserire informazioni segrete all’interno del token.
Perché dovremmo usare i token Web JSON?
Parliamo dei vantaggi dei token Web JSON (JWT) rispetto ai token Web semplici (SWT) e ai token SAML (Security Assertion Markup Language).,
Poiché JSON è meno prolisso di XML, quando è codificato la sua dimensione è anche più piccola, rendendo JWT più compatto di SAML. Questo rende JWT una buona scelta da passare in ambienti HTML e HTTP.
Per quanto riguarda la sicurezza, SWT può essere firmato simmetricamente solo da un segreto condiviso utilizzando l’algoritmo HMAC. Tuttavia, i token JWT e SAML possono utilizzare una coppia di chiavi pubblica/privata sotto forma di certificato X. 509 per la firma. La firma XML con la firma digitale XML senza introdurre oscuri buchi di sicurezza è molto difficile rispetto alla semplicità della firma JSON.,
I parser JSON sono comuni nella maggior parte dei linguaggi di programmazione perché mappano direttamente agli oggetti. Al contrario, XML non ha una mappatura naturale da documento a oggetto. Ciò rende più facile lavorare con JWT rispetto alle asserzioni SAML.
Per quanto riguarda l’utilizzo, JWT viene utilizzato su scala Internet. Ciò evidenzia la facilità di elaborazione lato client del token Web JSON su più piattaforme, in particolare mobili.,
Confronto tra la lunghezza di un JWT codificato e un SAML codificato
Se vuoi saperne di più sui token Web JSON e persino iniziare a usarli per eseguire l’autenticazione nelle tue applicazioni, vai alla pagina di destinazione del token Web JSON su Auth0.
Leave a Reply