As REST is rising in power and importance, statelessness is becoming a priority which is not always easy to acquire since we all love cookies. Even though it’s hard to believe, I have something you’ll like more than cookies – JSON Web Tokens. Join me in this session to learn using a fully stateless authentication with Java (+Spring Security) and JWT, therefore obeying strong REST principles most applications require nowadays.
3. • 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
4. 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?
6. Stateful autentikacija 4/5
Što ako se aplikacijski server na kojem se nalazi korisnikov session sruši?
Rješenje 1 – Sticky session
7. 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
8. 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)
9. 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
10. JWT u akciji
Token nije spremljen u memoriji, bazi ili cache-u!
Stateless autentikacija ✓
11. 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
12. 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....
14. Spring Security + JWT
AuthenticationManager
AuthenticationProvider
DaoAuthenticationProvider LdapAuthenticationProvider JWTAuthenticationProvider
15. Spring Security + JWT
Filter dohvaća token iz HTTP requesta i šalje ga na provjeru AuthenticationManager-u
16. 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.
17. Pohrana tokena na klijentu
• U local storage-u (HTML5)
– XSS?
• U.... cookieu!
– CSRF?
• Šalje se u headeru pri svakom requestu
18. 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
19. 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
20. Zaključak
Budućnost = Rast korisnika na Internetu
Rast korisnika na Internetu = Skaliranje
Skaliranje = JWT
JWT = Budućnost