java & jwt stateless authentication
TRANSCRIPT
• Stateful autentikacija
• JSON Web Tokens
• Java i JWT
• Implementacija sa Springom
• Zaključak
Sadržaj
• Cookie-i su „klasičan” mehanizam održavanja autentikacije između različitih zahtjeva istog korisnika (session)
• ID sessiona pamti se u memoriji na serveru čime se kreira stanje (state)
– otežava skaliranje
Stateful autentikacija 1/5
Stateful autentikacija 2/5
Session se pohranjuje u memoriji i identificra se putem
cookiea kojeg korisnik na svakom zahtjevu šalje.
Što ako imamo više od jednog aplikacijskog servera?
Stateful autentikacija 4/5
Što ako se aplikacijski server na kojem se nalazi korisnikov session sruši?
Rješenje 1 – Sticky session
Stateful autentikacija 5/5
Svaki request ide na bazu?
Možemo uvesti cache, ali to se teško skalira (na veći broj servera)
Rješenje 2 – Session u bazi
JSON Web Tokens
• Otvoren standard koji omogućava
siguran prijenos informacija među
različitim stranama (sustavima,
korisnicima..)
• Najčešće korišten pri autentikaciji,
no može se koristiti i za prijenos
ostalih podataka
Koristi se nakon uspješne inicijalne autentikacije!(npr. Basic Auth-om)
Struktura tokena
• Header – tip tokena i algoritam hashiranja
• Payload – podaci tj. prava (claims), mogu biti reserved, public ili private
• Signature – potpis kao potvrda da se korisnik ne predstavlja lažno i da
poruka nije mijenjana na putu
Java i JWT
• JWT je (trenutno) relativno slabo podržan
• 3 najpopularnija librarya za generiranje i
verifikaciju tokena:
– JJWT
– Nimbus
– Java JWT
• Većina popularnih security frameworka i dalje ne
podržava JWT out of the box
Kako to implementirati?
• Potrebna je ručna implementacija korištenjem
jednog od navedenih librarya
• Idealno ako imamo security framework koji se
lagano može proširivati....
Spring Security + JWT
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordProcessingFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
Resource
{NašJwtFilter
Spring Security + JWT
AuthenticationManager
AuthenticationProvider
DaoAuthenticationProvider LdapAuthenticationProvider JWTAuthenticationProvider
Spring Security + JWT
Filter dohvaća token iz HTTP requesta i šalje ga na provjeru AuthenticationManager-u
Spring Security + JWT
AuthenticationProvider uz pomoć JWT librarya parsira token i izvlači iz njega podatke.
U ovom slučaju to je korisničko ime od kojeg se zatim kreira User objekt koji se
sprema u SecurityContext kao logirani korisnik. Ako je taj objekt postavljen Spring
Security propušta korisnika do zaštićenog resursa.
Pohrana tokena na klijentu
• U local storage-u (HTML5)
– XSS?
• U.... cookieu!
– CSRF?
• Šalje se u headeru pri svakom requestu
Prednosti JWT-a
• Veličina
– Malen, stane u HTTP header, malen overhead
prijenosa
• Samostalan
– Sadrži sve informacije potrebne za autentikaciju čime
miče potrebu za višestrukim korištenjem baze ili
drugog autentikacijskog resursa
• Izračunljiv
– Nije ga potrebno pohranjivati na serveru, podatke je
moguće na svakom zahtjevu „izračunati” iz tokena
Ima li to i kakvu manu?
• Na svakom requestu potrebno je procesorsko
vrijeme za provjeru i „izračun” podataka iz
tokena
– S druge strane i dohvat iz baze traje određeno
vrijeme...
• Neporez pri rukovanju na klijentu
– Podložno XSS, CSRF napadima
• Nepodržanost out of the box
Zaključak
Budućnost = Rast korisnika na Internetu
Rast korisnika na Internetu = Skaliranje
Skaliranje = JWT
JWT = Budućnost