JWT (JSON Web Token) to podpisany, samowystarczalny token w formacie JSON, który służy do potwierdzania tożsamości i przenoszenia danych między stronami — najczęściej w uwierzytelnianiu API. Standard opisuje RFC 7519. „Samowystarczalny” znaczy tyle, że token sam w sobie niesie potrzebne informacje (kto, do kiedy ważny), więc serwer nie musi trzymać sesji w bazie ani pamięci, żeby cię rozpoznać.
Token składa się z trzech części oddzielonych kropkami: header.payload.signature. Każda jest zakodowana w Base64url (uwaga: to kodowanie, nie szyfrowanie — payload da się odczytać). Header mówi, jakim algorytmem podpisano token (np. HS256 albo RS256). Payload zawiera tzw. claims, czyli pola w stylu sub (kto), exp (kiedy wygasa), iat (kiedy wydany). Signature to podpis kryptograficzny pierwszych dwóch części — dzięki niemu serwer wie, że nikt nie podmienił treści.
Schemat działania jest prosty: logujesz się, serwer generuje JWT i odsyła go klientowi. Od tej pory przy każdym żądaniu wysyłasz token w nagłówku Authorization: Bearer , a serwer tylko weryfikuje podpis i datę ważności. Żadnego odpytywania bazy o sesję — stąd JWT jest popularny w architekturach mikroserwisowych i bezstanowych API.
Przykład z praktyki
Najszybciej zobaczysz to na stronie jwt.io albo w bibliotece. W Node.js z paczką jsonwebtoken wygląda to tak:
const token = jwt.sign({ sub: 42 }, secret, { expiresIn: '15m' });
Po stronie odbiorcy: jwt.verify(token, secret) — jeśli podpis się nie zgadza albo token wygasł, leci wyjątek. Chcesz podejrzeć zawartość bez weryfikacji? Wklej token do dekodera lub: echo .
Częste błędy i mity
- „JWT jest zaszyfrowany” — nie. Payload to zwykły Base64url, każdy go odczyta. Nie wrzucaj tam haseł ani danych wrażliwych.
- Algorytm
none— klasyczna podatność: jeśli serwer akceptujealg: none, atakujący podaje token bez podpisu i przechodzi. Zawsze wymuszaj konkretny algorytm przy weryfikacji. - Brak
exp— token bez daty ważności żyje wiecznie. Skradziony = problem na zawsze. Dawaj krótki czas życia plus refresh token. - JWT nie da się łatwo unieważnić — skoro serwer nie trzyma stanu, wylogowanie „na już” wymaga blacklisty albo krótkiego
exp.
Pojęcia powiązane: OAuth 2.0, sesje i ciasteczka, Bearer token, refresh token, HMAC i podpis RSA, OpenID Connect, Base64url, RFC 7519.