JWT (JSON Web Token) je otvorený štandard (RFC 7519), ktorý definuje kompaktný a samostatný spôsob bezpečného prenosu informácií medzi stranami. Tieto informácie môžu byť overené a dôveryhodné, pretože sú digitálne podpísané.
JWT sa skladá z troch častí, oddelených bodkou (.): hlavička (Header), náklad (Payload) a podpis (Signature). Hlavička určuje podpisový algoritmus, náklad obsahuje deklarácie a podpis slúži na overenie, že správa nebola pozmenená.
Bežné scenáre použitia JWT
Autentifikácia (najbežnejší scenár), výmena informácií (JWT môže bezpečne prenášať informácie, pretože môžu byť podpísané), autorizácia (obsahuje informácie o oprávneniach používateľa) a implementácia jednotného prihlásenia.
Typy podpisových algoritmov
JWT podporuje viaceré podpisové algoritmy, hlavne rozdelené do dvoch kategórií: symetrické algoritmy založené na HMAC (ako HS256) a asymetrické algoritmy založené na RSA/ECDSA (ako RS256, ES256). Symetrické algoritmy používajú rovnaký kľúč na podpis a overenie, asymetrické algoritmy používajú súkromný kľúč na podpis a verejný kľúč na overenie.
Neskladujte citlivé informácie (ako heslá) v JWT, pretože nákladová časť JWT je len kódovaná v Base64, nie šifrovaná. Pre aplikácie vyžadujúce vysokú bezpečnosť odporúčame použiť krátky čas expirácie a implementovať stratégiu rotácie tokenov.
Ako postupovať po expirácii JWT?
Keď JWT expiruje, server tento token odmietne. Odporúčaný spôsob riešenia je implementovať mechanizmus obnovovacieho tokenu (Refresh Token), kde klient používa obnovovací token na získanie nového prístupového tokenu bez nutnosti opätovného prihlásenia používateľa. Obnovovacie tokeny zvyčajne majú dlhšiu platnosť, ale mali by byť uložené opatrne.
Striktne povedané, JWT je navrhnutý ako bezstavový token a nemôže byť skutočne zrušený. Existuje však niekoľko bežných riešení: udržiavanie čiernej listiny zrušených tokenov (čo môže negovať výhody bezstavovosti JWT), použitie krátkeho času expirácie v kombinácii s obnovovacími tokenmi alebo vloženie verzie do tokenu, ktorú server môže odmietnuť.
Rozdiel medzi JWT a session?
JWT je samostatný token, ktorý obsahuje všetky potrebné informácie, vhodný pre distribuované systémy a nevyžaduje ukladanie stavu relácie na serveri. Session je založený na ukladaní na strane servera a vyžaduje udržiavanie stavu relácie, čo je vhodnejšie pre architektúru s jedným serverom. JWT je priateľskejší k rozširovaniu, ale zrušenie je zložité; Session sa ľahko ruší, ale má horšiu škálovateľnosť.