Json Web Tokens

AssociazioneNalug 33 views 29 slides Feb 07, 2019
Slide 1
Slide 1 of 29
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29

About This Presentation

Linux Day Napoli 2017 - Credits to Mario Rossano


Slide Content

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