A cura di Mario Rossano
JWT: JSON Web Tokens
LinuxDay Napoli 2017
Star Trek enthusiast
CTO Netlogica – web and software engineering
NaLUG member
CPAN author
Italian Perl Community member [email protected] [email protected]
https://netlogica.it
$ ./bye_bye_cookie_and_session > improved CyberSecurity and Scalability
{
"JWT": {
"question1": "cos’è",
"question2": "come è fatto?",
"question3": "a cosa serve?",
"question4": "è sicuro?",
"declaration1": "vantaggi",
"declaration2": "classi",
"example": "case study"
}
}
JWT: JSON Web Tokens JWT: JSON Web Tokens
LinuxDay Napoli 2017
●È uno standard (RFC 7519) per la trasmissione di
informazioni
●Le informazioni sono impacchettate in formato JSON
●Implementa diversi algoritmi crittografici per la firma
delle informazioni che trasporta
●Implementa internamente un MAC per la verifica delle
informazioni trasmesse
●È self-contained ovvero trasporta in sé tutti i dati
necessari per il suo utilizzo
JWT: JSON Web Tokens /> cos’è?cos’è? JWT: JSON Web Tokens /> cos’è?cos’è?
●È formato da tre stringhe codificate in base64
qualitativamente differenti e separate dal punto “.”
(ASCII 46)
JWT: JSON Web Tokens /> come è fatto?come è fatto? JWT: JSON Web Tokens /> come è fatto?come è fatto?
header è costituito da due parti
●typ: dichiarazione del tipo
●alg: algoritmo crittografico
JWT: JSON Web Tokens /> come è fatto? > come è fatto? > headerheader JWT: JSON Web Tokens /> come è fatto? > come è fatto? > headerheader
{
"typ": "JWT",
"alg": “HS256”
}
payload contiene le informazioni da trasferire
Ad es.:
●id: identificativo utente
●name: nome e cognome utente
●role: privilegio utente
JWT: JSON Web Tokens /> come è fatto? > come è fatto? > payloadpayload JWT: JSON Web Tokens /> come è fatto? > come è fatto? > payloadpayload
{
"id": "1234567",
"name": “John Doe”,
"role": “admin”
}
signature è la firma per la verifica dei dati
Costruita mediante hash della concatenazione di
header, payload con secret come sale crittografico
(chiave segreta - stringa)
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, 'secret');
JWT: JSON Web Tokens /> come è fatto? > come è fatto? > signaturesignature JWT: JSON Web Tokens /> come è fatto? > come è fatto? > signaturesignature
Il token completo è quindi del tipo seguente:
JWT: JSON Web Tokens /> come è fatto? > come è fatto? > risultatorisultato JWT: JSON Web Tokens /> come è fatto? > come è fatto? > risultatorisultato
JWT: JSON Web Tokens /> a cosa serve?a cosa serve? JWT: JSON Web Tokens /> a cosa serve?a cosa serve?
JWT è utilizzato per gestire l’autenticazione utente
JWT: JSON Web Tokens /> a cosa serve?a cosa serve? JWT: JSON Web Tokens /> a cosa serve?a cosa serve?
JWT è utilizzato per gestire l’autenticazione utente
Ad esempio viene implementato da...
JWT: JSON Web Tokens /> a cosa serve?a cosa serve? JWT: JSON Web Tokens /> a cosa serve?a cosa serve?
●HTTP è un protocollo stateless. Per
"ricordare" che un utente è loggato si
usano le sessioni
●Le sessioni sono costituite da un
oggetto server-side (ad es. id utente) e
da un cookie contenente ad es. l'id
dell'oggetto server-side
Prima di JWT… client → server
JWT: JSON Web Tokens /> a cosa serve?a cosa serve? JWT: JSON Web Tokens /> a cosa serve?a cosa serve?
●Se il servizio esposto è più complesso
e richiede server specializzati in ottica
microservices il dualismo cookie-
session non funziona: i server
ignorano le sessioni degli altri.
●Allo stesso modo anche un sistema di
bilanciamento del carico di un
webserver canonico produce la stessa
problematica
Come si è risolto?
Prima di JWT… client → multiple server
JWT: JSON Web Tokens /> a cosa serve?a cosa serve? JWT: JSON Web Tokens /> a cosa serve?a cosa serve?
...come si è risolto?
●Interponendo un proxy che gestisce le
transazioni e provvede a uniformare le
sessioni
●Risolto? Si, ma con incremento di
complessità e perdita di scalabilità
C’è di meglio?
Prima di JWT… client → multiple server
JWT: JSON Web Tokens /> a cosa serve?a cosa serve? JWT: JSON Web Tokens /> a cosa serve?a cosa serve?
...come si è risolto?
●Interponendo un proxy che gestisce le
transazioni e provvede a uniformare le
sessioni
●Risolto? Si, ma con incremento di
complessità e perdita di scalabilità
C’è di meglio? Si!
Prima di JWT… client → multiple server
JWT: JSON Web Tokens /> a cosa serve?a cosa serve? JWT: JSON Web Tokens /> a cosa serve?a cosa serve?
●Il server verifica le credenziali al login
e rilascia il token
●l’utente memorizza il token localmente
●Il client, per tutte le successive
richieste all’infrastruttura servente,
invierà il token che sarà verificato ad
ogni richiesta
Con JWT… client → single/multiple server
JWT: JSON Web Tokens /> a cosa serve?a cosa serve? JWT: JSON Web Tokens /> a cosa serve?a cosa serve?
Con JWT… client → login on multiplatform
JWT: JSON Web Tokens /> è sicuro?è sicuro? JWT: JSON Web Tokens /> è sicuro?è sicuro?
Si! Se applicato nel modo corretto.
●E’ consigliabile trasferire JWT tramite
HTTPS
●La signature può essere effettuata
anche con RSARSA, separando quindi
chiave pubblica dalla privata
●Inoltre JWT assicura la veridicità della
chiamata mediante MAC
Message Authentication Code
JWT: JSON Web Tokens /> è sicuro? MACè sicuro? MAC JWT: JSON Web Tokens /> è sicuro? MACè sicuro? MAC
Flusso di un MAC
JWT: JSON Web Tokens /> vantaggivantaggi JWT: JSON Web Tokens /> vantaggivantaggi
●Stateless: non occorre gestire session. Ottimale per applicazioni RESTful
●Portabile: un solo token può essere riutilizzato su differenti backend, domini,
applicazioni
●Cookieless: sul client il token può essere salvato dove si vuole: localStorage,
indexDB o anche cookie(?!) :O (ndr. non lo farete vero?)
●Mobile friendly: implementabile ovunque, su web, su app native (per cui la
gestione cookie avrebbe richiesto uno sforzo aggiuntivo)
●Built-in Expiration: dichiarando il claim exp nell’header
●CORS friendly: Cross-Origin Resource Sharing
●Decentralizzato: il token può essere generato ovunque
●Performance: cercare sessioni nel db ed estrarre le informazioni
è dispendioso rispetto al calcolo di un HMACSHA256
●Standard: le specifiche RFC7519 sono state implementate in numerosi
ambienti
JWT: JSON Web Tokens /> classiclassi JWT: JSON Web Tokens /> classiclassi
.NET Node.js Java PHP
Python Javascript Perl Ruby
Haskell Swift Objective-C C
Lista aggiornata su:
Haskell
https://jwt.io/
JWT: JSON Web Tokens /> case studycase study JWT: JSON Web Tokens /> case studycase study
Programma il Futuro è il progetto del
CINI e del MIUR in collaborazione con
Code.org per la diffusione del pensiero
computazionale in Italia.
JWT: JSON Web Tokens /> case studycase study JWT: JSON Web Tokens /> case studycase study
Programma il Futuro è il progetto del
CINI e del MIUR in collaborazione con
Code.org per la diffusione del pensiero
computazionale in Italia.
Nell’anno scolastico 2016/17 sono stati coinvolti 1’600’000 studenti
JWT: JSON Web Tokens /> case studycase study JWT: JSON Web Tokens /> case studycase study
Programma il Futuro è il progetto del
CINI e del MIUR in collaborazione con
Code.org per la diffusione del pensiero
computazionale in Italia.
Nell’anno scolastico 2016/17 sono stati coinvolti 1’600’000 studenti
TIM in qualità di partner del progetto ha fornito a Programma il Futuro
la sua piattaforma di crowdfunding per sostenere le attività nel triennio
2017/20
JWT: JSON Web Tokens /> case studycase study JWT: JSON Web Tokens /> case studycase study
Programma il Futuro è il progetto del
CINI e del MIUR in collaborazione con
Code.org per la diffusione del pensiero
computazionale in Italia.
Nell’anno scolastico 2016/17 sono stati coinvolti 1’600’000 studenti
TIM in qualità di partner del progetto ha fornito a Programma il Futuro
la sua piattaforma di crowdfunding per sostenere le attività nel triennio
2017/20
Occorreva quindi un metodo sicuro e
verificato per comunicare i dati dei
donatori dalla piattaforma di crowdfunding
a PIF per eseguire alcune
operazioni a valle. Come?
JWT: JSON Web Tokens /> case studycase study JWT: JSON Web Tokens /> case studycase study
Programma il Futuro è il progetto del
CINI e del MIUR in collaborazione con
Code.org per la diffusione del pensiero
computazionale in Italia.
Nell’anno scolastico 2016/17 sono stati coinvolti 1’600’000 studenti
TIM in qualità di partner del progetto ha fornito a Programma il Futuro
la sua piattaforma di crowdfunding per sostenere le attività nel triennio
2017/20
Occorreva quindi un metodo sicuro e
verificato per comunicare i dati dei
donatori dalla piattaforma di crowdfunding
a PIF per eseguire alcune
operazioni a valle. Come?
JWT: JSON Web Tokens /> case studycase study JWT: JSON Web Tokens /> case studycase study
JWT: JSON Web Tokens /> Riferimenti JWTRiferimenti JWT JWT: JSON Web Tokens /> Riferimenti JWTRiferimenti JWT
●Specifiche JWT → RFC7119 https://tools.ietf.org/html/rfc7519
●Debugger e classi → https://jwt.io/
LinuxDay Napoli 2017
JWT: JSON Web Tokens /> Riferimenti autoreRiferimenti autore JWT: JSON Web Tokens /> Riferimenti autoreRiferimenti autore
Mario Rossano aka Anak
●Web: https://netlogica.it
●Facebook: https://facebook.com/netlogica
●Twitter: https://twitter.com/Mario_Rossano
●MetaCPAN: https://metacpan.org/author/ANAK
●SlideShare: https://www.slideshare.net/Anakthewolf
LinuxDay Napoli 2017
JWT: JSON Web Tokens /> exitexit JWT: JSON Web Tokens /> exitexit
Grazie a Voi per l’attenzione
al NaLUG per l’organizzazione
ed alla Federico II per la consueta ospitalità :-)
LinuxDay Napoli 2017