Jak używać
- Wklej cały token: trzy części Base64URL oddzielone kropkami.
- Odczytaj zdekodowany nagłówek i ładunek. Oświadczenia exp, iat i nbf są wyświetlane jako daty, a gdy token wygasł lub nie jest jeszcze ważny, pojawia się ostrzeżenie.
- Aby zweryfikować podpis, rozwiń sekcję „Weryfikuj podpis” i wpisz wspólny klucz tajny dla HS256, HS384 lub HS512 albo wklej klucz publiczny PEM dla algorytmów RS, PS lub ES.
- Sprawdź, czy oświadczenia określające wystawcę, odbiorcę i podmiot odpowiadają temu, czego oczekuje aplikacja.
Budowa tokena JWT
JSON Web Token (RFC 7519) składa się z trzech części oddzielonych kropkami: header.payload.signature. Nagłówek i ładunek to obiekty JSON zakodowane jako Base64URL bez dopełnienia, dlatego tokeny prawie zawsze zaczynają się od eyJ, czyli zakodowanej postaci otwierającego {". Podpis jest obliczany na podstawie dwóch pierwszych części, dokładnie w takiej postaci, w jakiej występują w tokenie.
- Nagłówek: algorytm podpisu w polu
alg, zwykle"typ": "JWT", a często takżekid, który wskazuje klucz. - Ładunek: oświadczenia, np. kim jest użytkownik, kto wystawił token i kiedy token wygasa.
- Podpis: podpis HMAC, RSA lub ECDSA potwierdzający, że nagłówek i ładunek nie zostały zmienione.
Token składający się z pięciu części to zaszyfrowany JWE; jego zawartości nie da się odczytać bez klucza deszyfrującego.
Zarejestrowane oświadczenia
| Oświadczenie | Nazwa | Znaczenie |
|---|---|---|
iss | Wystawca (Issuer) | Kto utworzył i podpisał token |
sub | Podmiot (Subject) | Kogo dotyczy token, zwykle identyfikator użytkownika |
aud | Odbiorca (Audience) | Usługa, dla której token jest przeznaczony |
exp | Czas wygaśnięcia (Expiration time) | Po tej chwili token musi zostać odrzucony |
nbf | Nie wcześniej niż (Not before) | Przed tą chwilą token musi zostać odrzucony |
iat | Czas wystawienia (Issued at) | Kiedy token został utworzony |
jti | Identyfikator JWT (JWT ID) | Unikatowy identyfikator służący do wykrywania ponownego użycia tokena |
Czasy są wartościami typu NumericDate: to liczba sekund (a nie milisekund) od 1 stycznia 1970 r. UTC. Dekoder wyświetla je jako czytelne daty i porównuje z zegarem urządzenia.
Dekodowanie to nie weryfikacja
Każdy może zdekodować JWT, ponieważ ładunek jest tylko zakodowany, a nie zaszyfrowany; nigdy nie umieszczaj w nim haseł ani innych tajnych danych. Zaufanie daje wyłącznie sprawdzenie podpisu właściwym kluczem, a serwer przyjmujący tokeny powinien ponadto:
- dopuszczać tylko oczekiwany algorytm i odrzucać
"alg": "none", co oznacza token bez podpisu; - nigdy nie pozwalać, by nagłówek tokena decydował o wyborze między HMAC a RSA, bo wtedy atakujący może podpisać sfałszowany token, używając klucza publicznego serwera jako klucza tajnego HMAC;
- sprawdzać
exp,nbf,issiaudprzy każdym żądaniu.
Opcjonalna weryfikacja na tej stronie korzysta z interfejsu Web Crypto API wbudowanego w przeglądarkę. Dekodowanie i weryfikacja odbywają się na urządzeniu i nic nie jest wysyłane. Ogólna zasada: nigdy nie wklejaj produkcyjnych kluczy podpisujących ani aktywnych tokenów na stronach, którym nie ufasz.
Najczęściej zadawane pytania
Czy wklejanie JWT do tego dekodera jest bezpieczne?
Token jest dekodowany i weryfikowany przez JavaScript w przeglądarce i nigdy nie trafia na serwer. Pamiętaj jednak, że token, który nie wygasł, działa jak hasło dla każdego, kto go posiada, dlatego przy udostępnianiu zrzutów ekranu lub logów lepiej używać tokenów testowych albo wygasłych.
Czy można zdekodować JWT bez klucza tajnego?
Tak. Nagłówek i ładunek to zwykły JSON zakodowany w Base64URL, więc można je odczytać bez żadnego klucza. Klucz tajny lub publiczny jest potrzebny tylko do weryfikacji podpisu.
Dlaczego dekoder pokazuje, że token wygasł?
exp wskazuje moment wcześniejszy niż bieżący czas na urządzeniu. Jeśli token powinien być nadal ważny, sprawdź zegar systemowy oraz czas życia tokena skonfigurowany przez wystawcę.Które algorytmy podpisu można zweryfikować?
HS256, HS384 i HS512 ze wspólnym kluczem tajnym oraz RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384 i ES512 z kluczem publicznym w formacie PEM.
Co oznacza "alg": "none"?
Oznacza niezabezpieczony token JWT z pustym podpisem, zdefiniowany w RFC 7518. Każdy może utworzyć lub zmienić taki token, dlatego serwer oczekujący podpisanych tokenów musi go zawsze odrzucać.