Token JWT — co to jest, z czego się składa i jak go bezpiecznie używać
Nagłówek, treść i podpis, pola exp, iat i sub, różnica między podpisem a szyfrowaniem oraz najczęstsze błędy przy logowaniu z użyciem JWT. Przewodnik dla programistów aplikacji internetowych.
JWT (JSON Web Token) to sposób przekazywania informacji o użytkowniku między serwerem a aplikacją. Najczęściej służy do logowania: po podaniu hasła serwer wydaje token, a aplikacja dołącza go do kolejnych zapytań (zwykle w nagłówku Authorization: Bearer …).
Budowa tokenu
Token to trzy części oddzielone kropkami: nagłówek.treść.podpis. Dwie pierwsze to JSON zakodowany w Base64URL (odmiana Base64 bez znaków + i /).
- Nagłówek — algorytm podpisu, np.
{"alg":"HS256","typ":"JWT"}. - Treść (payload) — tzw. claims: kto (sub), kiedy wydano (iat), do kiedy ważny (exp), dla kogo (aud), kto wydał (iss) i dowolne dane aplikacji, np. rola.
- Podpis — wyliczony z nagłówka i treści przy użyciu sekretu (HS256) albo klucza prywatnego (RS256, ES256). Pozwala wykryć każdą zmianę tokenu.
Pola czasu (exp, iat, nbf) to znaczniki Unix — liczba sekund od 1970 r. Zamienisz je na datę w konwerterze czasu Unix.
Podpisany to nie znaczy zaszyfrowany
Najważniejsza rzecz do zapamiętania: treść zwykłego JWT może przeczytać każdy, kto ma token — wystarczy zdekodować Base64. Podpis chroni przed zmianą, nie przed odczytaniem. Dlatego w tokenie nie umieszcza się haseł, numerów PESEL ani innych poufnych danych.
Zawartość tokenu i daty ważności sprawdzisz w dekoderze JWT — działa lokalnie, token nie jest nigdzie wysyłany. Mimo to nie wklejaj nigdzie tokenów produkcyjnych, które są jeszcze ważne: kto ma token, ten może działać jako dany użytkownik.
Dobre praktyki
- Krótki czas ważności tokenu dostępowego (np. 5–15 minut) i osobny token odświeżający przechowywany bezpieczniej.
- Weryfikuj podpis i algorytm po stronie serwera — nie ufaj polu
algz samego tokenu; odrzucaj"alg":"none". - Sprawdzaj exp, iss i aud przy każdym zapytaniu.
- Silny sekret dla HS256 (losowy, co najmniej 256 bitów) albo klucze asymetryczne, gdy token weryfikuje wiele usług.
- Przechowywanie w przeglądarce — ciasteczko z flagami HttpOnly, Secure i SameSite jest odporniejsze na kradzież przez złośliwe skrypty niż localStorage.
- Wylogowanie — JWT jest ważny do wygaśnięcia, nawet po wylogowaniu; jeśli trzeba go unieważnić wcześniej, potrzebna jest lista zablokowanych tokenów lub krótki czas życia.
JWT czy sesja?
Klasyczna sesja (identyfikator w ciasteczku, dane na serwerze) jest prostsza i łatwiej ją unieważnić — dla zwykłej strony z logowaniem często wystarcza. JWT sprawdza się, gdy wiele niezależnych usług (API, aplikacja mobilna, mikroserwisy) musi weryfikować użytkownika bez wspólnej bazy sesji.
Treść tokenu łatwiej czytać po sformatowaniu — użyj formatowania JSON, a pojedyncze fragmenty zdekodujesz dekoderem Base64.
Narzędzia do tego poradnika
JWTuwierzytelnianieAPIbezpieczeństwoBase64tokeny