JSON Web Token (JWT): čo to je a ako funguje

JWT (JSON Web Token) je kompaktný, samostatný token na bezpečné prenášanie informácií medzi stranami. Popisujem jeho štruktúru, použitia pri autentifikácii/autorizácii, bezpečnostné riziká a praktické odporúčania na nasadenie.
Čo je JWT a na čo slúži
JSON Web Token (JWT) je štandard (RFC 7519) na reprezentáciu nárokov (claims) medzi dvoma stranami vo forme bezpečne podpísaného (a prípadne zašifrovaného) JSON objektu. Najčastejšie sa používa v systémoch autentifikácie a autorizácie ako spôsob, ako uchovať a prenášať informácie o používateľovi alebo oprávneniach bez potreby udržiavať stav na serveri (stateless).
Základná štruktúra
JWT je textový reťazec tvorený tromi časťami oddelenými bodkami:
header.payload.signature
- header (hlavička): JSON, ktorý typicky obsahuje typ tokenu ("typ": "JWT") a použitý algoritmus podpisu ("alg": napr. HS256, RS256).
- payload (telo/token claims): JSON obsahujúci údaje (claims) — štandardné (exp, iat, iss, aud, nbf) aj vlastné (napr. user_id, role).
- signature (podpis): kryptografický podpis alebo MAC nad base64url(header) + "." + base64url(payload), použitý na overenie integrity a autenticity tokenu.
Všetky časti sú base64url kódované (bez '=' a so zmenenými znakmi pre URL), takže výsledný token je kompaktný a prenosný.
Príklad (zjednodušený)
Hlavička: {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"12345","role":"admin","exp":1700000000}
Po zakódovaní a podpise vyzerá token ako: eyJhbGciOiJI... .eyJzdWIiOiIx... .dBjftJeZ4CVP-mB92K27uhbU
Ako sa JWT používa v praxi
- Autentifikácia: Po úspešnom prihlásení server vydá JWT klientovi, ktorý ho pripojí k následným požiadavkám (napr. v HTTP hlavičke Authorization: Bearer <token>). Server môže overiť token bez ukladania session stavu.
- Autorizácia: Token môže obsahovať role alebo oprávnenia. Server pri overení rozhodne, či má užívateľ prístup k zdroju.
- SSO a delegovanie práv: JWT sa často používa v protokoloch ako OAuth 2.0 alebo OpenID Connect na prenos identity a nárokov medzi službami.
Výhody JWT
- Bezstavovosť: server nemusí uchovávať session (škálovateľné).
- Kompaktný a prenosný: dobrý pre mobilné alebo single-page aplikácie.
- Samostatný: obsahuje potrebné informácie (čiastočne aj expiry), takže nie je potrebné dotazovať DB pri každej požiadavke (iba overenie podpisu).
Nevýhody a riziká
- Revokácia: keď je token vydaný, jeho odvolanie je zložitejšie (nie je centrálna session), preto sa odporúča krátka životnosť tokenov alebo čierne listiny (blacklist).
- Ukladanie na kliente: uloženie v localStorage je zraniteľné voči XSS. Ukladanie v HttpOnly secure cookies je bezpečnejšie.
- Únik tokenu = kompromitácia: ak útočník získa token, môže ho použiť až do vypršania platnosti.
- Nesprávne používanie: populárne chyby sú použitie alg: "none" (umožňuje obchádzanie podpisu) alebo nesprávne overovanie algoritmu/klúča.
- Nadmerné ukladanie citlivých údajov: payload nie je šifrovaný (pokým sa nepoužije JWE), preto sa do payloadu neukladajú heslá ani citlivé osobné údaje.
Algoritmy a bezpečnosť
- HS256 (HMAC + SHA256): symetrický podpis, používa zdieľaný tajný kľúč medzi stranami.
- RS256 (RSA) alebo ES256 (ECDSA): asymetrické podpisy, server podpisuje privátnym kľúčom a overuje sa verejným — bezpečnejšie pri rozdelení rolí (napr. auth server vs resource server).
- Nikdy neprijímajte tokeny s alg: "none". Pri overovaní si explicitne skontrolujte, aký algoritmus očakávate a použite silné kľúče, správne rotujte a chráňte súkromné kľúče.
Overovanie JWT na serveri — kroky
- Dekódovať header a payload z base64url (bez automatickej dôvery).
- Skontrolovať, či header.alg je očakávaný (a nepovoliť none).
- Overiť podpis použitím správneho kľúča a algoritmu.
- Skontrolovať štandardné claims: exp (platnosť), nbf (nie pred), iat (vydané), iss (vydavateľ), aud (publikum).
- Nepoužívať údaje z payloadu bez kontroly podpisu.
Dobre praktiky pri nasadení
- Krátka životnosť access tokenov (minúty až hodiny).
- Použiť refresh tokeny (dlhšia platnosť), ktoré sa dajú bezpečnejšie uložiť a pri kompromitácii zrušiť — refresh tokeny ukladať opatrne (HttpOnly cookies).
- Rotácia kľúčov a audit prístupu.
- Neukladať citlivé údaje do payloadu; ak potrebné, používať JWE (šifrovanie).
- Používať RS/ES algoritmy, ak sú viaceré služby alebo potreba izolovať kľúče.
- Overovať issuer a audience, kontrolovať exp a nbf.
Porovnanie s klasickými sessions
- Sessions: server ukladá stav (session id), na klienta sa posiela len identifikátor. Jednoduché odvolanie (zmazať session na serveri), menší risk pri úniku tokenu (ak je id krátke a kontrolované).
- JWT: vhodné pri škálovaní a microservices, kde nechcete centrálne session úložisko. Nevýhodou je spravovanie revokácie a bezpečné ukladanie na klientoch.
Záver (praktická rada)
JWT je užitočný a flexibilný nástroj, ak sa používa správne. Pred implementáciou zvážte potrebu bezstavového riešenia, navrhnite krátku platnosť tokenov, bezpečné ukladanie a silný systém rotácie/odvolávania. Pri pochybnostiach používajte overené knižnice a dodržiavajte odporúčania pre kryptografiu a overovanie, aby ste sa vyhli bežným pastiam (alg:none, zlé kľúče, XSS).





