Javantura v3 - Java & JWT Stateless authentication – Karlo Novak

21
Java & JWT Stateless autentikacija Karlo Novak, SV Group d.o.o. karlo.novak@svgroup.

Transcript of Javantura v3 - Java & JWT Stateless authentication – Karlo Novak

Java & JWTStateless autentikacija

Karlo Novak, SV Group [email protected]

• 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 3/5

Moramo pronaći način da oba servera prepoznaju isti cookie!

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

JWT u akciji

Token nije spremljen u memoriji, bazi ili cache-u!

Stateless autentikacija ✓

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 + JWTSecurityContextPersistenceFilter

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 InternetuRast korisnika na Internetu = Skaliranje

Skaliranje = JWT

JWT = Budućnost

A sad vi...

[email protected]