Ovo je stara izmjena dokumenta!
Ključne riječi: jwt; json web token; autorizacija;
JSON Web Token je otvoreni standard predstavljen u 2015. godini, kojim je definiran način za siguran i pouzdan prijenos informacija između dvije ili više strana. Podaci se spremaju u obliku JSON objekta te se zatim ta struktura koristi za digitalno potpisivanje (JWS - JSON Web Signature) kako bi sačuvali autentičnost i integritet podataka. Iako se tokeni mogu još dodatno i kriptirati, češća je upotreba bez eksplicitne enkripcije, s obzirom na to da se najčešće prenose putem HTTP(S) protokola. na kojem se, barem za potrebe autorizacije i autentifikacije, koristi enkripcija za razmjenu podataka. JSON Web tokeni se dakle najviše koriste za:
JWT se sastoji od više odvojenih objekata između kojih se nalazi točka. Najčešći oblik JSON Web tokena je onaj digitalno potpisani, koji se sastoji od ova 3 dijela:
Svaki od ta tri dijela se prilikom slaganja krajnjeg oblika tokena šifrira pomoću Base64 kodiranja kako pri prenošenju ne bi došlo do promjena s obzirom na različita tumačenja znakova od strane različitih sustava. Zatim dijelove spojimo s točkom između svakog te smo time dobili token.
U zaglavlju se nalaze informacije o tipu objekta i algoritmu koji se koristio prilikom izrade digitalnog potpisa.
{"typ":"JWT", "alg":"HS256"}
U ovom primjeru korišten je HMAC algoritam uz SHA-256 funkciju sažimanja. Još neki od popularnih algoritama digitalnog potpisa koji se koriste su RSA i ECDSA uz razne mogućnosti odabira funkcije sažimanja.
U ovom objektu nalaze se podaci spremljeni u tokenu, a za koje možemo tvrditi da su ispravni. Ovi podaci mogu biti proizvoljni ovisno o implementaciji JWT-a u sustavu, međutim, postoje imena varijabli koja su namijenjena točno određenoj svrsi te su opisana u specifikaciji JSON Web Tokena.
“iss”
- predstavlja izdavača tokena“sub”
- predstavlja subjekt tog tokena, onoga za koga je taj token izdan“aud”
- predstavlja primatelje za koje je taj token namijenjen“exp”
- predstavlja vrijeme isteka tokena“nbf”
- predstavlja vrijeme od kojeg token vrijedi“iat”
- predstavlja vrijeme izdavanja tokena“jti”
- predstavlja jedinstveni identifikator tokena
Prema specifikaciji iznad navedene vrijednosti su opcionalne, tako da ih token ne mora sadržavati, ali je preporučeno da ih sadrže.
Na primjeru kojeg vidimo na slici prije, vidljivo su nam podaci sadržani u tokenu gdje sub
predstavlja identifikator korisnika u sustavu, u polju name
se nalazi ime korisnika, a u polju iat
je vidljivo vrijeme izdavanja tokena predstavljenu u sekundama proteklih od 1.1.1970. što ovdje predstavlja 18.1.2018. u 1.30 sati.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
Kao treći dio ovdje predstavljamo digitalni potpis kao važan dio tokena koji predstavlja integritet samog tokena, odnosno da isti nije mijenjan od trenutka njegovog izdavanja ili izrađen s lažnim podacima. Način na koji ćemo to osigurati je da zaglavlje i korisne podatke, odnosno sve prijašnje objekte u tokenu digitalno potpišemo. Postupak se sastoji od toga da se navedeni objekti šifriraju pomoću Base64 kodiranja i spoje točkom kako se spajaju i u sami token te zatim dodajemo tajnu vrijednost, ako postoji u algoritmu. Ako se primjerice koristi RSA digitalni potpis, onda ćemo onako šifrirane podatke sažeti funkcijom sažimanja te onda sažetak digitalno potpisati privatnim ključem. Primatelj će zatim moći provjeriti na isti način, tako da izračuna sažetak prvih dijelova tokena i provjeriti podudara li se sa vrijednosti koju dobije kada javnim ključem dešifrira vrijednost digitalnog potpisa.
signature = RSA( private_key, SHA-256(base64urlEncoding(header) + '.' + base64urlEncoding(payload)) ) RSA(public_key, signature) == SHA-256(base64urlEncoding(header) + '.' + base64urlEncoding(payload))
JSON Web tokeni se najčešće koriste u SSO (engl. Single Sign-On) sustavima i REST API aplikacijama gdje se koristi jedan poslužitelj za autorizaciju korisnika koji onda korisniku vraća JWT token s kojim on može pristupati usluzi kojoj želi. Dakle, korisnik će se svojim korisničkim podacima prijaviti samo jednom, a pomoću tokena korisnik pristupa usluzi dok god token vrijedi.
Kako se JWT koristi za pristup, ondnosno autorizaciju korisnika, podložan je raznim napadima i pokušajima probijanja njegove zaštite.
Najčešći oblici napada na JSON Web tokene u 2019. godini su bili:
None
umjesto algoritma u zaglavljukid
(identifikator ključa) u zaglavljuMožemo primijetiti da se najčešći napadi događaju nepravilnim korištenjem JWT-a od strane izvođača aplikacije (programera), odnosno ako postoji manjak znanja o specifikaciji, pa se implementacija napravi na krivi način. Također, rizike nam predstavljaju i drugi dijelovi samih sustava, odnosno tokena kao što su algoritmi za digitalni potpis i funkcije šifriranja koje s vremenom brzog napretka računala postaju sve podložnije bruteforce napadima, stoga je potrebno redovito pratiti trendove i novosti, kako bismo pravovremeno reagirali na neku moguću sigurnosnu ranjivost. Također, isto vrijedi i za razne gotove biblioteke koje danas postoje, a koje koriste JSON Web Tokene, gdje povjerenje stavljamo u nekog drugog.
U ovom radu napravljen je pregled i način korištenja JSON Web Tokena. Također, komentiran je sigurnosni aspekt u kojem dobivamo pregled najčešćih sigurnosnih incidenata povezanih s JWT.
Prema napravljenom pregledu na samu strukturu i način korištenja JSON Web Tokena, možemo reći kako je to jednostavan, a siguran način za razmjenu informacija i autorizaciju korisnika u današnjim sustavima koji zahtijevaju povećanu sigurnost uz jednostavnost. Kao i kod većine današnjih sigurnosnih problema i ovdje je naglasak na nedovoljnom znanju te nepravilnom korištenju standarda od strane programera koje može onda dovesti do sigurnosnih incidenata i curenja podataka. Usprkos tome, JSON Web tokeni su u svojih nekoliko godina postojanja postali veoma popularni prilikom autoriziranja za mnoge današanjim servisima koji ne čuvaju stanje (engl. stateless service).