Overiť podpis JSON Web Token (JWT)
- Dashboard
- Dokumentácia
- API
Prečo overovať podpis JWT?
JSON Web Token (JWT) sa rozkladá na tri časti oddelené bodkami:
header.payload.signature. Dekódovanie JWT spočíva jednoducho v čítaní prvých dvoch
častí (ktoré sú v Base64URL). Ktokoľvek to môže urobiť a ktokoľvek môže vyrobiť
JWT s ľubovoľným payloadom. To, čo robí JWT dôveryhodným, je výlučne
podpis: bez overenia akceptovať JWT znamená pustiť k sebe domov akúkoľvek osobu, ktorá
tvrdí, že je niekým, bez požadovania občianskeho preukazu.
Tento nástroj overuje podpis JWT pomocou kľúča. Neuspokojí sa s dekódovaním: prepočítava podpis z headera, payloadu a vášho kľúča, potom ho porovnáva s podpisom tokena. Ak sa oba zhodujú, token je autentický. Inak bol vyrobený, modifikovaný alebo podpísaný iným kľúčom.
Overenie je uholným kameňom každej architektúry, ktorá používa JWT pre
autentifikáciu alebo autorizáciu: bez validného podpisu môže payload klamať.
Útočník, ktorý by modifikoval "role":"user" na "role":"admin", by nemal žiadne
problémy to urobiť, ak by server overoval iba formát tokena a nie jeho podpis.
Bežné algoritmy
JWT špecifikácia (RFC 7518, JSON Web Algorithms) definuje viacero rodín algoritmov. Tu sú najpoužívanejšie v produkcii:
- HMAC (HS256, HS384, HS512): symetrický podpis založený na HMAC-SHA. Rovnaký secret slúži na podpisovanie a overovanie. Jednoduché na zavedenie, výkonné, ale akákoľvek strana schopná overiť token je tiež schopná ho vydať. Vhodné pre scenáre, kde sú vydavateľ a verifikátor rovnaký tím alebo rovnaký servis.
- RSA (RS256, RS384, RS512): asymetrický podpis. Privátny kľúč podpisuje, verejný kľúč overuje. Ideálne, keď sú vydavateľ a verifikátori odlišné entity (OAuth2, OpenID Connect, identity federation). Je to preferovaný algoritmus väčšiny verejných identity providerov.
- ECDSA (ES256, ES384): asymetrický podpis na eliptických krivkách. Rovnaká logika ako RSA (privátny kľúč na podpis, verejný na overenie), ale s kompaktnejšími kľúčmi a podpismi pre ekvivalentnú úroveň bezpečnosti. Stále viac rozšírený v moderných architektúrach.
Ako dodať kľúč
Formát očakávaného kľúča závisí od algoritmu deklarovaného v headeri JWT:
- HS256, HS384, HS512: kľúč je tajný reťazec (string).
Je to secret zdieľaný s vydavateľom, často uložený v environment premennej ako
JWT_SECRET. Žiadne zvláštne formátovanie, len surová hodnota. - RS256, RS384, RS512: kľúč je verejný RSA kľúč vo formáte PEM,
ktorý začína
-----BEGIN PUBLIC KEY-----a končí-----END PUBLIC KEY-----. Zachovajte zlomy riadkov tak, ako sú, inak OpenSSL odmietne ho parsovať. - ES256, ES384: kľúč je verejný ECDSA kľúč vo formáte PEM, na zodpovedajúcej krivke (P-256 pre ES256, P-384 pre ES384).
Príklad očakávaného RSA verejného kľúča
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxe...
...vQIDAQAB
-----END PUBLIC KEY-----
Ako funguje overovanie?
Náš server presne reprodukuje operáciu, ktorú urobil vydavateľ:
- Rozdelí JWT na header, payload a signature.
- Konkatenuje
base64url(header) + "." + base64url(payload). - Pre HMAC počíta HMAC-SHA-256/384/512 s vaším secretom, potom porovnáva s prijatým
podpisom cez
hash_equals(constant-time porovnanie pre zabránenie timing útokom). - Pre RSA volá
openssl_verifys vaším verejným kľúčom vo formáte PEM.
Prípady použitia
- Debug API autentifikácie: dostávate 401, overujete, či je váš token skutočne podpísaný očakávaným kľúčom.
- Validácia tokena prijatého od providera: partner (Auth0, Keycloak, Cognito, Okta) vám posiela JWT podpísané v RS256; chcete potvrdiť, že pochádzajú od neho jeho verejným kľúčom.
- Bezpečnostný audit: overiť, že tretí servis správne podpisuje svoje tokeny robustným algoritmom a nie v HS256 so slabým secretom.
- Manuálne testy: overiť, že JWT generovaný vaším kódom správne prechádza overením s poskytnutým verejným kľúčom.
- Rýchle overenie prijatého tokena: počas integrácie SSO alebo partnerského API overiť za pár sekúnd, že signature/key reťazec funguje pred napísaním akéhokoľvek riadku kódu.
Ako používať nástroj
- Vložte kompletný JWT (tri časti oddelené bodkami).
- Uveďte kľúč prispôsobený algoritmu headera:
- Pre HS256, HS384 alebo HS512 je kľúč zdieľaný tajný
reťazec s vydavateľom. Je to voľný reťazec, často uložený v
environment premennej ako
JWT_SECRET. - Pre RS256, RS384 alebo RS512 je kľúč verejný kľúč vo formáte
PEM, ktorý začína
-----BEGIN PUBLIC KEY-----a končí-----END PUBLIC KEY-----.
- Pre HS256, HS384 alebo HS512 je kľúč zdieľaný tajný
reťazec s vydavateľom. Je to voľný reťazec, často uložený v
environment premennej ako
- Spustite overenie. Nástroj zobrazí status (validný alebo nevalidný) a dekódovaný payload.
Bežné pasti na vyhnutie
- Algoritmus "none": spec povoľuje
alg: none, čo znamená "bez podpisu". Klasická diera spočíva vo vyrobení tokena s týmto headerom v nádeji, že server ho akceptuje. Náš nástroj systematicky odmieta tokeny salg: none. - HMAC vs RSA zámena (algorithm confusion): útočník zmení algoritmus
RS256naHS256a podpíše payload verejným RSA kľúčom použitým ako HMAC secret. Ak server nekontroluje algoritmus, akceptuje token. Vždy zablokujte očakávaný algoritmus na strane servera. - HMAC secrety natvrdo v kóde: secret committed v Git repozitári robí celú dôveru tokenov kaduknou. Ukladajte secrety v environment premenných alebo aplikačnom trezore.
- Verejný kľúč vs privátny kľúč: pre overenie JWT podpísaného v RSA alebo ECDSA sa poskytuje verejný kľúč, nikdy privátny. Privátny slúži iba na podpisovanie a nesmie nikdy opustiť vydavateľa.
- Ignorovaná expirácia: validný podpis na expirovanom tokene nesmie byť
nikdy akceptovaný. Pamätajte overiť
expanbf. - Nekontrolovaná audience: token určený API A by nemal byť akceptovaný
API B. Overte claim
aud.
Časové claims: exp a nbf
Okrem podpisu musí validný JWT tiež rešpektovať časové obmedzenia:
- exp (expiration): token už nie je validný po tomto dátume.
- nbf (not before): token ešte nie je validný pred týmto dátumom.
Náš nástroj explicitne signalizuje, keď je token expirovaný alebo ešte nevalidný, aj keď je jeho podpis správny. Je to dôležité: validný podpis na expirovanom tokene nesmie byť nikdy akceptovaný v produkcii.
Rozdiel od nášho JWT decodera
Náš JWT decoder sa uspokojí s dekódovaním header a payload častí pre ich učinenie čitateľnými. Nevykonáva žiadne overenie podpisu a nevyžaduje kľúč. Použite ho pre rýchlu inšpekciu obsahu tokena. Použite JWT verifier (táto stránka), akonáhle potrebujete dokázať, že je token autentický. Pre vyrobenie podpísaného JWT na testovacie účely použite náš JWT builder.
Často kladené otázky
Prečo RS256 namiesto HS256?
S HS256 vydavateľ a verifikátor zdieľajú rovnaký secret: každý verifikátor teda môže vydávať tokeny. Je to spravovateľné, keď kontrolujete oba konce. Akonáhle hovoríme o jedinom identity provideri s viacerými konzumentmi, prepneme na RS256: vydavateľ si necháva privátny kľúč, distribuujeme verejný kľúč všetkým API, ktoré musia overovať. Žiadne konzumentné API potom nemôže falšovať tokeny.
Ako získať verejný kľúč identity providera (IdP)?
Väčšina IdP vystavuje štandardizovaný JWKS endpoint (napríklad
https://priklad.com/.well-known/jwks.json). Tento endpoint vracia JSON obsahujúci
aktívne verejné kľúče. Môžete previesť JWK záznam zodpovedajúci kid
headera vášho JWT na PEM kľúč cez openssl príkaz alebo cez JWKS
knižnicu vášho stacku (napríklad jose-jwt, jwks-rsa).
Čo robiť, ak verify zlyhá?
Najprv overte algoritmus: token podpísaný HS256 neoveríte RSA kľúčom a
naopak. Potom overte kľúč: biely znak navyše, chýbajúci zlom riadku
v PEM kľúči alebo HMAC secret mierne odlišný od toho použitého vydavateľom
stačia na zlyhanie overenia. Ak IdP vykonal rotáciu kľúča, váš
kid môže ukazovať na kľúč, ktorý už nemáte.
Čo je JWKS?
JWKS (JSON Web Key Set, RFC 7517) je JSON formát, ktorý popisuje sadu
verejných kľúčov. Každý kľúč je identifikovaný kid (key ID) a overovaný JWT
referencuje tento kid vo svojom headeri. Mechanizmus umožňuje IdP rotovať svoje
kľúče bez rozbitia verifikátorov: jednoducho sa dotazujú JWKS endpointu na získanie
kľúča zodpovedajúceho kid prijatého tokena.
Ako generovať RSA pár na podpis mojich JWT?
S OpenSSL: openssl genrsa -out private.pem 2048 potom
openssl rsa -in private.pem -pubout -out public.pem. Privátny kľúč podpisuje na strane
vydavateľa, verejný kľúč overuje na strane konzumenta. Pre nové služby preferujte 3072 alebo
4096 bitov.
Mám JWT šifrovať navyše k podpisu (JWE)?
Podpísaný JWT (JWS) garantuje integritu a autentickosť, ale payload zostáva čitateľný pre každého, kto ho získa. Ak token obsahuje citlivé dáta (interné identifikátory, detailné práva, osobné údaje), zvažte JWE formát (JSON Web Encryption), ktorý payload šifruje navyše k podpisu.
Ukážka požiadavky
curl -X POST https://cdrn.fr/api/v1/tools/jwt-verifier/execute \
-H "Content-Type: application/json" \
-d '{"token":"...","key":"..."}'
Vstupná schéma
| Pole | Typ | Povinné | Predvolené |
|---|---|---|---|
token |
text | ✓ | – |
key |
text | ✓ | – |
Koncové body
GET https://cdrn.fr/api/v1/tools- vypíše všetky dostupné nástrojeGET https://cdrn.fr/api/v1/tools/jwt-verifier- získa schému tohto nástrojaPOST https://cdrn.fr/api/v1/tools/jwt-verifier/execute- spustí tento nástroj s JSON payloadom