Jak dekodować i sprawdzać tokeny JWT
Tokeny JSON Web Token (JWT) to najczęstszy sposób zarządzania uwierzytelnianiem w nowoczesnych aplikacjach webowych. Gdy coś idzie nie tak po stronie auth — użytkownik jest wylogowywany bez powodu, uprawnienia są niewłaściwe lub API zwraca 401 — dekodowanie JWT to często pierwszy krok debugowania.
Co zawiera JWT
JWT składa się z trzech części oddzielonych kropkami:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
Nagłówek — zawiera algorytm (HS256, RS256 itp.) i typ tokenu.
{"alg": "HS256", "typ": "JWT"}
Ładunek — zawiera deklaracje (oświadczenia) dotyczące użytkownika i tokenu.
{"sub": "1234567890", "name": "Alice", "exp": 1700000000}
Podpis — kryptograficzny odcisk, który gwarantuje, że token nie został zmieniony. Nie możesz go odczytać bez klucza podpisującego.
Częste deklaracje JWT
| Deklaracja | Pełna nazwa | Treść |
|---|---|---|
sub |
Subject | ID lub identyfikator użytkownika |
exp |
Expiration | Znacznik czasu Unix końca ważności |
iat |
Issued At | Znacznik czasu Unix utworzenia |
iss |
Issuer | Kto utworzył token (Twój serwer auth) |
aud |
Audience | Dla kogo token jest przeznaczony |
nbf |
Not Before | Token nie jest ważny przed tą datą |
jti |
JWT ID | Unikalny identyfikator tokenu |
Jak dekodować JWT
- Wklej swój token — wprowadź pełny JWT (format nagłówek.ładunek.podpis) do dekodera.
- Sprawdź zdekodowane sekcje — narzędzie wyświetla nagłówek (algorytm), ładunek (deklaracje) i podpis jako sformatowany JSON.
- Sprawdź deklaracje — przejrzyj datę wygaśnięcia, wystawcę, podmiot i wszelkie niestandardowe deklaracje.
Debugowanie z JWT
Token wygasł? Sprawdź deklarację exp. Konwertuj znacznik czasu Unix na czytelną datę. Jeśli minął, token wygasł i musi zostać odświeżony.
Niewłaściwe uprawnienia? Szukaj deklaracji roli lub zakresu w ładunku. Różnią się w zależności od implementacji, ale często wyglądają jak "role": "admin" lub "scope": "read write".
Problem z tożsamością użytkownika? Deklaracja sub identyfikuje użytkownika. Sprawdź, czy odpowiada oczekiwanemu ID.
Token odrzucony? Sprawdź deklarację aud (audience). Jeśli API oczekuje konkretnej audiencji, a token ma inną, zostanie odrzucony.
Ważne uwagi dotyczące bezpieczeństwa
- JWT nie są szyfrowane — każdy może zdekodować ładunek. Nie umieszczaj haseł, kluczy API ani innych sekretów w JWT.
- Zawsze weryfikuj podpisy po stronie serwera — dekoder pokazuje Ci, co token deklaruje, ale tylko weryfikacja podpisu udowadnia, że nie został zmieniony.
- Sprawdzaj wygaśnięcie — wygasłe tokeny zawsze muszą być odrzucane. Jeśli Twoja aplikacja akceptuje wygasłe tokeny, jest to luka bezpieczeństwa.
Najczęściej zadawane pytania
Czy mogę zweryfikować podpis JWT za pomocą dekodera?
Nie. Weryfikacja podpisu wymaga sekretu podpisującego lub klucza publicznego, przechowywanego na Twoim serwerze. Dekoder pokazuje, co jest w tokenie, ale weryfikacja kryptograficzna musi się odbywać na Twoim backendzie. Nigdy nie ufaj niezweryfikowanemu JWT w produkcji.
Czy bezpiecznie jest wkleić JWT do narzędzia online?
Tak, gdy narzędzie działa w Twojej przeglądarce. Dekodery w przeglądarce przetwarzają token lokalnie — nic nie jest wysyłane na serwer. Unikaj narzędzi, które wykonują żądania sieciowe z Twoim tokenem.
Czym jest deklaracja exp?
Deklaracja exp (expiration) to znacznik czasu Unix wskazujący, kiedy token wygasa. Po tej dacie token musi zostać odrzucony. Zawsze sprawdzaj tę deklarację, aby debugować problemy z uwierzytelnianiem.
Czy JWT mogą być szyfrowane?
Standardowe JWT (JWS) są podpisane, ale nie zaszyfrowane — każdy może zdekodować ładunek. Tokeny JWE (JSON Web Encryption) są szyfrowane, ale mniej powszechne. Nigdy nie umieszczaj wrażliwych danych (haseł, sekretów) w standardowym ładunku JWT.