java & jwt stateless authentication

21
Java & JWT Stateless autentikacija Karlo Novak, SV Group d.o.o. [email protected]

Upload: karlo-novak

Post on 21-Jan-2018

324 views

Category:

Software


2 download

TRANSCRIPT

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

A sad vi...

[email protected]