Co znaczy « zdekoduj JWT » ?
Zdekodowanie JWT (« jwt decode », « decode jwt online ») oznacza przecięcie ciągu w miejscu kropek, a następnie zdekodowanie każdego segmentu z Base64URL, aby odzyskać oryginalny JSON. Klucz nie jest potrzebny : nagłówek i payload są jedynie zakodowane, nie zaszyfrowane. Dokładnie o to chodzi w zapytaniach « jwt payload decoder » i « decode jwt without verify » — zobaczyć, co zawiera token, nie twierdząc, że jest autentyczny.
Pamiętaj, aby dobrze odróżnić te dwie czynności. Sam odczyt JWT niczego nie dowodzi : każdy może stworzyć token z atrakcyjnym payloadem i podpisać go własnym sekretem. Sprawdź podpis dowodzi, że treść nie została zmieniona przez osobę trzecią. Dekoder wyświetlający « admin: true » bez kontroli podpisu opowiada Ci historię, a nie fakt.
Trzy segmenty JWT
Ciąg znaków dzieli się dokładnie na trzy części rozdzielone kropkami : header.payload.signature. Nagłówek zawiera co najmniej alg i typ, czasem kid aby wskazać, którego klucza użyto. Payload zawiera claims, czyli pary klucz-wartość, których rejestr prowadzi IANA. Podpis obejmuje dwa pierwsze segmenty sklejone dokładnie tak, jak są zapisane — najmniejsza zmiana spacji lub znaku psuje porównanie.
Cała trudność stąd, że te segmenty są w Base64URL, a nie w Base64 : znak plus zamienia się w myślnik, ukośnik w podkreślenie, a wypełnienie = znika. Klasyczny dekoder Base64 zawali się więc na poprawnym JWT. Tabela « Base64URL a klasyczne Base64 » w zakładce referencyjnej pokazuje dokładnie te podmiany.
Jak sprawdzić podpis : HS256, RS256, ES256
Dla algorytmu HMAC — HS256, HS384, HS512 — ten sam sekret służy do podpisywania i sprawdzania : narzędzie przelicza HMAC(secret, base64url(header) + "." + base64url(payload)) i porównuje wynik z przesłanym podpisem. To najczęstszy przypadek i zarazem najniebezpieczniejszy : każda usługa posiadająca sekret może wydać token. Sekret krótszy niż 32 bajty, używany ponownie między środowiskami, wystarczy, aby narażyć cały łańcuch.
Dla algorytmów asymetrycznych — RS256, RS384, RS512, ES256, ES384, ES512, PS256 — do sprawdzenia potrzebny jest tylko klucz publiczny, dzięki czemu zweryfikujesz token wydany przez osobę trzecią, nigdy nie udostępniając jej sekretu podpisu. Wklej klucz w formacie PEM -----BEGIN PUBLIC KEY----- (SPKI) ; surowy wynik eksportu z OpenSSL jest od razu gotowy do użycia. Dla ES256 podpis jest w surowym formacie r||s, którego oczekuje WebCrypto.
Na koniec uważaj naalg confusion : jeśli Twoja usługa oczekuje RS256, ale akceptuje token, którego nagłówek deklaruje HS256, atakujący podpisze go kluczem publicznym — stając się kluczem HMAC — i przejdzie weryfikację. Ustal oczekiwany algorytm po stronie serwera i nigdy nie czytaj go z samego tokenu.
exp, iat, nbf : znaczniki czasu, które mylą
Te trzy claims to sekundy Unix, bez milisekund i bez strefy czasowej : iat oznacza 2018-01-17T21:30:22Z. Dwa błędy wracają bez przerwy : porównanie z datą w milisekundach (wartość dziesięć tysięcy razy za duża) i traktowanie znacznika czasu jako lokalnego zamiast UTC. Zakładka « Wygasanie » konwertuje w obie strony, wyświetla ISO 8601, datę lokalną oraz pozostały lub upłynięty czas — od razu wykryjesz token « już wygasły » co do sekundy.
Przedłużanie czasu ważności nie podnosi poziomu bezpieczeństwa : przesunięty exp claim zmienia wyświetlaną wartość, a nie podpis. Jeśli musisz ponownie wydać token, podpisz go sekretem lub kluczem prywatnym — to właśnie robi zakładka « Koduj ».
Base64URL : dlaczego klasyczne dekodery zawodzą
Base64URL (RFC 4648 §5) używa alfabetu A-Z a-z 0-9 - _ i nie dopuszcza wypełnienia. Payload o długości 20 znaków często daje długość niepodzielną przez cztery po usunięciu = : to normalne, nie uszkodzenie. Znaki - i _ są niejednoznaczne dla ludzkiego oka, co stanowi połowę zgłoszonych « zepsutych tokenów ». Nasz dekoder akceptuje oba alfabety, mieszany wariant liter, opcjonalne wypełnienie oraz prefiks Bearer.
Bezpieczeństwo : czego JWT nie robi
JWT nie zapewnia ani poufności, ani wycofywania. Payload jest czytelny dla wszystkich : nigdy nie umieszczaj tam adresu e-mail, roli wewnętrznej ani danych osobowych, których nie wysłałbyś jawnie. A podpisany token pozostaje ważny aż do exp nawet po wylogowaniu — potrzebna jest lista wycofań, jti śledzenie po stronie serwera albo krótkie czasy ważności z refresh token. Dobra praktyka : exp krótki (10 do 15 minut), iat kontrolowany, nbf zsynchronizowany z iat, aud i iss weryfikowanymi przy odbiorze.
Polecane dla
Deweloperzy back-end i front-end (OAuth 2.0, OpenID Connect, API REST), integratorzy i DevOps (infrastruktura tożsamości, JWKS, rotacja kluczy), testerzy i pentesterzy (przepisywanie claimów, alg confusion, wygaśnięcie), administratorzy systemów (debugowanie niewytłumaczalnego błędu 401), studenci (zrozumienie Base64URL i WebCrypto) oraz każdy, kto potrzebuje dekodera JWT online szybkiego, kompletnego i dyskretnego — uzupełnionego okoder i dekoder Base64, a takżekoder i dekoder URL oraz formatowanie JSON.