JSON Web Token, o JWT, è uno standard per trasmettere in sicurezza "affermazioni" in ambienti dallo spazio limitato. Un JSON Web Token è fatto nel seguente modo:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9. TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
Quella che vedete è una rappresentazione di una serie di affermazioni compatta e stampabile, con una firma per verificarne l’autenticità.
{ "alg": "HS256", "typ": "JWT" } { "sub": "1234567890", "name": "John Doe", "admin": true }
Le affermazioni sono definizioni o asserzioni riferite a un certo oggetto. Alcune di queste affermazioni e il loro significato sono definiti come parte delle specifiche JWT, mentre altre sono definite dall’utente. La magia dietro ai JWT sta nello standardizzare certe affermazioni che sono utili nel contesto di alcune operazioni comuni. Per esempio, una di queste operazioni comuni è stabilire l’identità di una certa parte. Per cui, una delle affermazioni standard che si trovano nei JWT è l'affermazione sub (subject - soggetto).
Un altro aspetto chiave dei JWT è la possibilità di firmarli, utilizzando JSON Web Signatures (JWS, RFC 75156) e/o criptarli, utilizzando JSON Web Encryption (JWE, RFC 75167). Con JWS e JWE, i JSON Web Token forniscono una soluzione potente e sicura per vari problemi.
Per quanto lo scopo principale dei JWT sia di trasferire affermazioni tra due parti, probabilmente l'aspetto più importante di ciò è lo sforzo di standardizzazione sotto forma di un formato contenitore semplice, facoltativamente convalidato e/o crittografato. Soluzioni ad hoc per questo stesso problema sono state implementate in passato sia in maniera privata che pubblica. Sono disponibili anche altri standard per stabilire affermazioni riguardo a certe parti. Quello che JWT offre è un formato contenitore semplica, utile e standard.
Non è quindi difficile immaginare quale sia il loro principale ambito di utilizzo: i sistemi di login (anche se sono possibili altri usi). Alcune delle applicazioni pratiche dei JSON Web Token sono:
Per avere un’idea della complessità (o della semplicità) delle più comuni soluzioni basate su JWT nel mercato di oggi, vediamo alcune applicazioni pratiche dei JSON Web Token
Le sessioni chiamate stateless non sono altro che dati client-side. L’aspetto chiave di questa applicazione risiede nel login e possibilmente nella crittografia per autenticare e proteggere i contenuti della sessione. I dati client-side sono soggetti a manomissione, quindi questa applicazione deve essere gestita con molta cura nel backend.
I JWT, grazie a JWS e JWE, possono fornire vari tipi di firme e crittografia. Le firme sono utili per convalidare i dati contro la manomissione, mentre la crittografia è utile per proteggere i dati dall’essere letti da terze parti.
La maggior parte delle volte le sessioni devono soltanto essere firmate. In altre parole, non ci sono problemi di sicurezza o di privacy se i dati immagazzinati in esse sono letti da terze parti. Un esempio comune di una affermazione che può essere letta in sicurezza da terze parti è l'affermazione sub (subject). L'affermazione subject di solito identifica una delle parti rispetto alle altre (per esempio gli ID utenti o gli indirizzi email). Non è un requisito che questa affermazione sia univoca. In altre parole, affermazioni aggiuntive possono essere richieste per identificare univocamente un utente. Questo lo può decidere l’utente.
Una affermazione che potrebbe essere non appropriata lasciare aperta alla lettura da parte di terzi potrebbe essere ad esempio un'affermazione "articoli" che rappresenta il carrello di un utente in un e-commerce. Questo carrello potrebbe essere pieno di articoli che l’utente sta per comprare, e quindi essi sarebbero associati alla sessione dell’utente. Una parte terza (uno script client-side) potrebbe essere in grado di raccogliere questi articoli, se essi sono immagazzinati in un JWT non crittografato, il che potrebbe sollevare problemi di privacy.