SlideShare a Scribd company logo
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
anak@cpan.org
software@netlogica.it
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 TokensJWT: 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? > headerheaderJWT: 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? > payloadpayloadJWT: 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? > signaturesignatureJWT: JSON Web Tokens /> come è fatto? >come è fatto? > signaturesignature
Il token completo è quindi del tipo seguente:
JWT: JSON Web Tokens /> come è fatto? >come è fatto? > risultatorisultatoJWT: 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? MACJWT: JSON Web Tokens /> è sicuro? MACè sicuro? MAC
Flusso di un MAC
JWT: JSON Web Tokens /> vantaggivantaggiJWT: 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 /> classiclassiJWT: 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 studyJWT: 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 studyJWT: 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 studyJWT: 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 studyJWT: 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 studyJWT: 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 studyJWT: JSON Web Tokens /> case studycase study
JWT: JSON Web Tokens /> Riferimenti JWTRiferimenti JWTJWT: 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 autoreJWT: 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 /> exitexitJWT: 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

More Related Content

JWT: JSON Web Tokens - bye bye Session and Cookie - RFC7519

  • 1. 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 anak@cpan.org software@netlogica.it https://netlogica.it $ ./bye_bye_cookie_and_session > improved CyberSecurity and Scalability
  • 2. { "JWT": { "question1": "cos’è", "question2": "come è fatto?", "question3": "a cosa serve?", "question4": "è sicuro?", "declaration1": "vantaggi", "declaration2": "classi", "example": "case study" } } JWT: JSON Web TokensJWT: JSON Web Tokens LinuxDay Napoli 2017
  • 3. ● È 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’è?
  • 4. ● È 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?
  • 5. header è costituito da due parti ● typ: dichiarazione del tipo ● alg: algoritmo crittografico JWT: JSON Web Tokens /> come è fatto? >come è fatto? > headerheaderJWT: JSON Web Tokens /> come è fatto? >come è fatto? > headerheader { "typ": "JWT", "alg": “HS256” }
  • 6. 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? > payloadpayloadJWT: JSON Web Tokens /> come è fatto? >come è fatto? > payloadpayload { "id": "1234567", "name": “John Doe”, "role": “admin” }
  • 7. 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? > signaturesignatureJWT: JSON Web Tokens /> come è fatto? >come è fatto? > signaturesignature
  • 8. Il token completo è quindi del tipo seguente: JWT: JSON Web Tokens /> come è fatto? >come è fatto? > risultatorisultatoJWT: JSON Web Tokens /> come è fatto? >come è fatto? > risultatorisultato
  • 9. 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
  • 10. 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...
  • 11. 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
  • 12. 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
  • 13. 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
  • 14. 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
  • 15. 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
  • 16. 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
  • 17. 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
  • 18. JWT: JSON Web Tokens /> è sicuro? MACè sicuro? MACJWT: JSON Web Tokens /> è sicuro? MACè sicuro? MAC Flusso di un MAC
  • 19. JWT: JSON Web Tokens /> vantaggivantaggiJWT: 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
  • 20. JWT: JSON Web Tokens /> classiclassiJWT: 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/
  • 21. JWT: JSON Web Tokens /> case studycase studyJWT: 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.
  • 22. JWT: JSON Web Tokens /> case studycase studyJWT: 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
  • 23. JWT: JSON Web Tokens /> case studycase studyJWT: 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
  • 24. JWT: JSON Web Tokens /> case studycase studyJWT: 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?
  • 25. JWT: JSON Web Tokens /> case studycase studyJWT: 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?
  • 26. JWT: JSON Web Tokens /> case studycase studyJWT: JSON Web Tokens /> case studycase study
  • 27. JWT: JSON Web Tokens /> Riferimenti JWTRiferimenti JWTJWT: JSON Web Tokens /> Riferimenti JWTRiferimenti JWT ● Specifiche JWT → RFC7119 https://tools.ietf.org/html/rfc7519 ● Debugger e classi → https://jwt.io/ LinuxDay Napoli 2017
  • 28. JWT: JSON Web Tokens /> Riferimenti autoreRiferimenti autoreJWT: 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
  • 29. JWT: JSON Web Tokens /> exitexitJWT: 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