====== JWT (JSON Web Token) ====== **JSON Web Token (JWT)** je otevřený standard (RFC 7519), který definuje kompaktní a samostatný způsob pro bezpečný přenos informací mezi stranami jako objekt JSON. Tyto informace mohou být ověřeny a důvěryhodné, protože jsou digitálně podepsány. V moderním webovém vývoji se JWT používá především pro **autentizaci** a **výměnu informací**. ===== Struktura JWT ===== JWT se skládá ze tří částí oddělených tečkou (''node.js''): **Header**, **Payload** a **Signature**. Výsledný token vypadá následovně: ''xxxxx.yyyyy.zzzzz''. ==== 1. Header (Hlavička) ==== Obsahuje informace o typu tokenu a použitém algoritmu digitálního podpisu (např. HMAC SHA256 nebo RSA). { "alg": "HS256", "typ": "JWT" } ==== 2. Payload (Obsah/Nároky) ==== Obsahuje samotná data, tzv. **claims** (nároky). Jsou to informace o uživateli (např. ID, jméno, role) a metadata (např. čas expirace). { "sub": "1234567890", "name": "Jan Novák", "admin": true, "iat": 1516239022 } ==== 3. Signature (Podpis) ==== Vytváří se vzetím zakódované hlavičky, zakódovaného payloadu, tajného klíče (secret) a algoritmu určeného v hlavičce. Podpis zajišťuje, že s tokenem nebylo po cestě manipulováno. ===== Jak JWT funguje v praxi ===== 1. **Login:** Uživatel pošle přihlašovací údaje (např. jméno a heslo) na server. 2. **Vytvoření:** Server ověří údaje a vygeneruje JWT podepsaný tajným klíčem. 3. **Uložení:** Server pošle JWT zpět klientovi (prohlížeči), který si ho uloží (např. v LocalStorage nebo Cookies). 4. **Autorizace:** Při každém dalším požadavku klient přiloží JWT do HTTP hlavičky (''Authorization: Bearer ''). 5. **Ověření:** Server pouze ověří podpis tokenu. Pokud je platný, uživatele obslouží bez nutnosti dotazovat se znovu do databáze. ===== Výhody a nevýhody ===== ^ Vlastnost ^ Výhoda / Nevýhoda ^ Popis ^ | **Bezstavovost** | Výhoda | Server nemusí držet relaci (session) v paměti. Skvělé pro škálování. | | **Samostatnost** | Výhoda | Token obsahuje všechna potřebná data o uživateli. | | **Bezpečnost** | Výhoda | Digitální podpis brání podvržení dat v payloadu. | | **Expirace** | Nevýhoda | Token nelze snadno zneplatnit před jeho expirací (pokud není použit blacklist). | | **Velikost** | Nevýhoda | Token může narůst, pokud do něj vložíte příliš mnoho dat. | ===== Bezpečnostní doporučení ===== * **Nikdy nevkládejte citlivá data:** Payload je pouze zakódován (Base64), nikoliv šifrován. Kdokoliv jej může přečíst. * **Používejte HTTPS:** Bez šifrovaného spojení může útočník token zachytit (tzv. //Token Theft//). * **Krátká expirace (exp):** Nastavujte TTL tokenu na co nejkratší dobu (minuty) a pro obnovu používejte tzv. **Refresh Tokens**. * **Silný tajný klíč:** Podpis je jen tak silný, jak silný je klíč použitý k jeho vytvoření. > **Nástroj:** Pro ladění a dekódování tokenů můžete použít oficiální webový debugger na **jwt.io**. [[it_encyklopedie:programovani_a_data|Zpět na Data]]