Jak Dekodować JWT i Bezpiecznie Inspekcjonować Jego Claims
Szybka odpowiedź
JWT to trzy ciągi Base64URL połączone kropkami: header.payload.signature. Zdekoduj header i payload przez Base64URL decoding aby inspectować claims —ale dekodowanie tylko czyta dane, nie weryfikuje autentyczności. Zawsze weryfikuj signature na serverze. Użyj naszego JWT Decoder aby inspectować tokeny.
Wstęp
JSON Web Token (JWT, RFC 7519) to kompaktowy, URL-safe format tokenu używany do autentykacji i autoryzacji. Ma trzy części zakodowane Base64URL oddzielone kropkami: header.payload.signature. Header opisuje algorytm, payload niesie claims (user id, roles, expiry), a signature udowadnia, że token został wydany przez zaufaną stronę. Kluczowe: header i payload są zakodowane, nie zaszyfrowane —każdy może je przeczytać.
Krok po kroku
-
Podziel token na trzy części
JWT wygląda jak xxxxx.yyyyy.zzzzz. Podziel znak kropki, aby uzyskać nagłówek (część 0), ładunek (część 1) i podpis (część 2). Jeśli nie ma dokładnie trzech części, token jest zniekształcony.
-
Base64URL - dekoduj nagłówek
Nagłówek jest obiektem JSON zakodowanym w formacie Base64URL, takim jak {"alg":"HS256","typ":"JWT"}. Base64URL używa - i _ zamiast + i / oraz pomija dopełnienie. Odkoduj go, a następnie JSON.parse, aby odczytać algorytm i wpisać. Nasz dekoder JWT robi to automatycznie.
-
Base64URL - dekodowanie ładunku (oświadczenia)
Ładunek jest JSON przedmiotem roszczeń. Zarejestrowane roszczenia obejmują iss (wydawca), sub (podmiot), aud (odbiorcy), exp (wygaśnięcie), nbf (nie wcześniej), iat (wydany w) i jti (identyfikator tokena). Roszczenia prywatne są specyficzne dla aplikacji (np. rola, adres e-mail). Odkoduj i sprawdź, ale nie ufaj, dopóki nie zostanie to zweryfikowane.
-
Sprawdź roszczenia dotyczące wygaśnięcia i nie wcześniejsze
exp i nbf to uniksowe znaczniki czasu (sekundy). Jeśli bieżący czas minął już po upływie terminu ważności, token traci ważność i należy go odrzucić. Jeżeli bieżący czas przypada przed nbf, token nie jest jeszcze ważny. Sprawdź je po stronie klienta pod kątem UX, ale egzekwuj je po stronie serwera ze względów bezpieczeństwa.
-
Zweryfikuj podpis na serwerze (nigdy po stronie klienta)
Podpis to HMAC-SHA256(sekret, nagłówek.ładunek) dla HS256 lub podpis RSA/ECDSA dla RS256/ES256. Weryfikacja wymaga podania tajnego lub publicznego klucza, który nigdy nie może dotrzeć do przeglądarki. Do weryfikacji użyj biblioteki takiej jak jsonwebtoken (Node) lub jose – nigdy nie pisz własnego krypto.
Przykłady
Typowy JWT (trzy części)
Wejście: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpmeJf36POk6yJV_adQssw5c
Wyjście: Header: {"alg":"HS256","typ":"JWT"} Payload: {"sub":"1234567890","name":"John Doe","iat":1516239022}
Odkodowany ładunek ze standardowymi roszczeniami
Wejście: Ładunek prawdziwego tokena uwierzytelniającego
Wyjście: {"sub":"user-42","iss":"freeonlinetoolsgo.com","exp":1767229200,"iat":1767225600,"role":"admin"}
Wykrywanie wygasłego tokenu
Wejście: exp: 1609459200 (2021-01-01) sprawdzony 28.08.2026
Wyjście: Token is expired —current time (1767225600) > exp (1609459200). Reject and prompt re-login.
Typowe problemy
- Traktuj dekodowanie jako weryfikację: każdy może stworzyć JWT z dowolnymi roszczeniami i fałszywym podpisem. Dekodowanie odczytuje ładunek, ale niczego nie dowodzi. Zawsze sprawdzaj podpis za pomocą tajnego/publicznego klucza na serwerze, zanim zaufasz oświadczeniom.
- Używanie algorytmu „none”: specyfikacja JWT pozwala na alg: none dla niezabezpieczonych tokenów. Jeśli Twój weryfikator zaakceptuje alg: none, osoba atakująca może sfałszować tokeny. Skonfiguruj swoją bibliotekę tak, aby nie odrzucała żadnej i umieściła oczekiwane algorytmy na białej liście.
- Przechowywanie JWT w localStorage: XSS może odczytywać localStorage i wydobywać tokeny. Preferuj pliki cookie httpOnly, Secure, SameSite=Strict dla tokenów sesji lub krótkotrwałe tokeny w pamięci z plikiem cookie tokenu odświeżania.
- Brak sprawdzania exp/aud/iss: skradziony token jest ważny do momentu jego wygaśnięcia. Zawsze sprawdzaj exp (wygaśnięcie), aud (docelowi odbiorcy) i iss (wystawca) przy każdym żądaniu, aby zapobiec ponownemu odtwarzaniu tokenu między usługami.
Porady
- Używaj krótkotrwałych tokenów dostępu (15 minut) i długotrwałych tokenów odświeżających — ogranicza to okno w przypadku kradzieży tokenu dostępu.
- Preferuj RS256 (asymetryczny) zamiast HS256 (symetryczny), gdy wiele usług weryfikuje tokeny: każda usługa otrzymuje klucz publiczny, a tylko wystawca ma klucz prywatny.
- Użyj naszego dekodera JWT podczas programowania, aby sprawdzić, co wydaje serwer — pokazuje zdekodowany nagłówek, ładunek i czytelne dla człowieka podsumowanie roszczenia bez wysyłania gdziekolwiek tokena.
- Nigdy nie umieszczaj wrażliwych danych (haseł, informacji umożliwiających identyfikację) w ładunku JWT — są one zakodowane w Base64, a nie zaszyfrowane, a każdy, kto przechwyci token, może przeczytać każde żądanie.