JWT: JSON Web Tokens. Bye bye cookie and session for better CyberSecurity and Scalability.
Slide del talk di Mario Rossano al Linux Day Napoli 2017.
Descrizione dello standard RF7519 riguardante JWT "JSON Web Tokens" mediante il quale si eliminano le sessioni - ed i cookie - per la gestione dell'autenticazione utente. Il vantaggio principale è nell'incremento di performance (non essendovi chiamate al database per recuperare i dati di sessione), nell'essere mobile-friendly, adatto anche ad applicazioni native e stateless, ottimale quindi anche in ottica RESTful.
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