Dieses Dokuwiki verwendet ein von Anymorphic Webdesign erstelltes Thema.
Prijevodi ove stranice:

JSON Web Token (JWT)

Sažetak

JSON Web Token je otvoreni standard predstavljen u 2010. godini, kojim je definiran način za siguran i pouzdan prijenos informacija između dvije ili više strana, najviše se koristi za autorizaciju korisnika u servisima koji ne čuvaju stanje (engl. stateless service). Podaci se spremaju u obliku JSON objekata koji se digitalno potpisuju te time čuvaju integritet informacija koje se u njima nalaze. JWT je jednostavan a relativno siguran način autorizacije korisnika, međutim, kao i mnogi drugi sustavi autorizacije, podložan je napadima. Najčešći su oni koji iskorištavaju ranjivosti nastale neznanjem i nestručnosti izvođača prilikom izrade aplikacije.

Ključne riječi: jwt; json web token; autorizacija;

Uvod

JSON Web Token je otvoreni standard predstavljen u 2010. 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:

  1. Autentifikaciju i autorizaciju
  2. Razmjenu informacija.

Struktura JWT-a

JWT se sastoji od više odvojenih JSON 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:

  1. Zaglavlje
  2. Korisni podaci
  3. Digitalni potpis

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.

Primjer tokena izgleda ovako:  Primjer JWT-a

Zaglavlje

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.

Korisni podaci

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
}

Digitalni potpis

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

Način korištenja

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.

Način korištenja JWT-a ([[https://medium.com/@sureshdsk/how-json-web-token-jwt-authentication-works-585c4f076033|Izvor]] )

Sigurnosni aspekt

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:

  • pokušaj izmjene algoritma digitalnog potpisa
    • pokušaj izbjegavana provjere korištenjem None umjesto algoritma u zaglavlju
    • pokušaj izmjene algoritma (korištenje simetričnog umjesto asimetričnog algoritma)
  • Nedostatak digitalnog potpisa
  • Bruteforce napad na slabe ključeve
  • Iskorištavanje drugih ranjivosti u sustavu za pronalazk ključa
  • Manipulacija sa kid (identifikator ključa) u zaglavlju
    • pokušaj specificiranja ključa pomoću točne putanje do neke napadaču poznate datoteke
    • SQL umetanje
    • umetanje naredbi
  • Ostale manipulacije zaglavlja (JKU, JWK, x5u/x5c)
  • Curenje informacija (token se prenosi preko nesigurnog protokola)

Mož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.

Zaključak

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).

Literatura

racfor_wiki/json_web_token.txt · Zadnja izmjena: 2023/06/19 18:17 (vanjsko uređivanje)
Dieses Dokuwiki verwendet ein von Anymorphic Webdesign erstelltes Thema.
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0