Dekoder JWT

Wklej JWT (trzy części zakodowane w base64url oddzielone kropkami), a dekoder pokaże nagłówek, ładunek i podpis, zdekodowane i ładnie sformatowane, wraz z wykrytym algorytmem, wygaśnięciem tokenu w twoim czasie lokalnym oraz tym, czy nbf (not-before), iat (issued-at) i exp (expiry) są spójne. Opcjonalna weryfikacja podpisu, jeśli masz sekret lub klucz publiczny.

Jak zdekodować JWT

  1. 1

    Wklej token

    Trzy ciągi base64url oddzielone `.` (nagłówek.ładunek.podpis).

  2. 2

    Odczytaj zdekodowany nagłówek

    Algorytm, typ, identyfikator klucza (`kid`). Algorytm mówi, jakiego typu klucza potrzebujesz do weryfikacji.

  3. 3

    Odczytaj ładunek

    Standardowe oświadczenia (`iss`, `sub`, `aud`, `exp`, `iat`, `nbf`, `jti`) plus dowolne niestandardowe oświadczenia, które wydaje twoja aplikacja.

  4. 4

    Zweryfikuj (opcjonalnie)

    Podaj sekret HMAC (dla HS256/384/512) lub klucz publiczny (dla RS256, ES256 itp.), by potwierdzić, że podpis jest prawidłowy.

Anatomia JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNjAwMDAwMDAwfQ
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Każdy segment jest zakodowany w base64url (nie standardowym base64). Nagłówek to JSON taki jak {"alg":"HS256","typ":"JWT"}, ładunek to JSON taki jak {"sub":"1234567890","name":"Alice","iat":1600000000}, a podpis to podpis HMAC lub RSA header.payload.

Standardowe oświadczenia (RFC 7519)

Oświadczenie Nazwa Uwagi
iss Wydawca Kto wystawił token
sub Podmiot Kogo dotyczy token
aud Odbiorca Dla kogo jest token
exp Czas wygaśnięcia Znacznik czasu Unix; odrzucany po tym czasie
nbf Nie przed Znacznik czasu Unix; odrzucany przed tym czasem
iat Wystawiony o Znacznik czasu Unix utworzenia tokenu
jti Identyfikator JWT Unikalny identyfikator dla list unieważnień

Obsługiwane algorytmy

Wartość alg Typ klucza
HS256/HS384/HS512 Współdzielony sekret HMAC
RS256/RS384/RS512 Klucz publiczny RSA
ES256/ES384 Klucz publiczny ECDSA
PS256/PS384 Klucz publiczny RSA-PSS
EdDSA / Ed25519 Krzywa Edwardsa
none Nigdy temu nie ufaj, niepodpisane tokeny

Pułapka alg: none

Wczesne biblioteki JWT dopuszczały tokeny "alg": "none" i naiwnie akceptowały je jako prawidłowe. Zawsze:

  • Twórz białą listę algorytmów akceptowanych przez twoją aplikację.
  • Odrzucaj alg: none bezwarunkowo.
  • Odrzucaj alg: HS256, gdy twój kod weryfikacyjny oczekuje RS256 (atak „pomylenia algorytmów”).

Czym JWT NIE jest

  • Nie jest zaszyfrowany. Nagłówek i ładunek są zakodowane w base64, co trywialnie się dekoduje. Nigdy nie umieszczaj sekretów w JWT bez opakowania go w JWE.
  • Domyślnie nie da się go unieważnić. Po wydaniu JWT jest prawidłowy aż do exp. Do unieważnienia potrzebujesz czarnej listy albo krótkiego wygaśnięcia + tokenów odświeżania.
  • Nie jest zamiennikiem ciasteczka sesji w każdym przypadku użycia. Tokeny nieprzejrzyste przechowywane po stronie serwera są często prostsze i bezpieczniejsze.

Typowe błędy

  • Ufanie nagłówkowi. kid i alg pochodzą z samego tokenu. Skompromitowany serwer może ustawić je dowolnie; zawsze waliduj względem stałej listy.
  • Ignorowanie odchylenia nbf i iat. Dryf zegara oznacza, że iat > now może się zdarzyć. Pozwól na mały zapas (30-60s).
  • Logowanie całych JWT. Ładunek często zawiera identyfikatory użytkowników, e-maile, uprawnienia, dane osobowe, które nie powinny trafiać do stdout.
  • Używanie HS256 ze słabym sekretem. 16-znakowy sekret da się złamać brutalnie w kilka minut. Użyj co najmniej 256 bitów losowej entropii.

Najczęściej zadawane pytania

Nie. Dekodowanie odbywa się w twojej przeglądarce. Token pozostaje lokalny, to ważne, bo JWT często zawierają dane sesji, identyfikatory użytkowników i uprawnienia.

Tak. Jeśli wkleisz współdzielony sekret HMAC lub klucz publiczny zakodowany w PEM, weryfikacja odbywa się w twojej przeglądarce. Klucz nigdy nie opuszcza twojej maszyny.

Oznacza, że token jest niepodpisany. Nigdy nie akceptuj takich tokenów na produkcji, można je trywialnie sfałszować. Kilka głośnych CVE dotyczyło właśnie bibliotek, które domyślnie akceptowały alg: none.

Podpisywanie JWT dowodzi autentyczności, a nie poufności. Nagłówek i ładunek są zakodowane w base64url, co jest odwracalne. Dla tajności użyj JWE (JSON Web Encryption) wokół JWT albo unikaj umieszczania wrażliwych danych w ładunku.

Powiązane narzędzia

Narzędzie jest dostępne w innych językach