5 min

Czym jest JWT? Przejrzysty przewodnik po JSON Web Tokenach

Dowiedz się, czym jest JWT (JSON Web Token), jak działają jego trzy części, gdzie się go używa i jakie są kluczowe porady bezpieczeństwa, by uniknąć typowych błędów z tokenami.

Czym jest JWT? Przejrzysty przewodnik po JSON Web Tokenach

JWT w prostych słowach

JWT (JSON Web Token) to zwarty, bezpieczny dla URL-a ciąg znaków, który reprezentuje pewien zestaw informacji (zazwyczaj o użytkowniku lub sesji) w formie, którą można przekazywać między systemami. Często zobaczysz go jako długą wartość zaczynającą się od czegoś w stylu eyJ..., wysyłaną w nagłówku HTTP, np. Authorization: Bearer \u003ctoken\u003e.

Po co w ogóle token?

Tradycyjne logowania często opierają się na sesjach po stronie serwera: po zalogowaniu serwer przechowuje dane sesji i daje przeglądarce cookie z ID sesji. Każde żądanie zawiera to cookie i serwer odczytuje sesję.

W uwierzytelnianiu opartym na tokenach serwer może uniknąć przechowywania stanu sesji dla każdego żądania. Zamiast tego klient trzyma token (np. JWT) i dołącza go do wywołań API. To popularne w przypadku API, ponieważ:

  • dobrze działa w wielu serwisach (API gateway, mikroserwisy)
  • pasuje do aplikacji mobilnych i SPA, które wywołują API bezpośrednio
  • redukuje potrzebę współdzielenia pamięci sesji między serwerami

Ważna uwaga: „bezstanowość” nie znaczy „brak żadnych kontroli po stronie serwera”. W praktyce wiele systemów nadal weryfikuje tokeny względem statusu użytkownika, rotacji kluczy lub mechanizmów unieważniania.

Uwierzytelnianie a autoryzacja (po ludzku)

  • Uwierzytelnianie odpowiada na pytanie: Kim jesteś? (logujesz się i udowadniasz tożsamość).
  • Autoryzacja odpowiada na pytanie: Co możesz zrobić? (możesz czytać faktury, edytować projekty, wejść na strony admina itp.).

JWT często zawierają dowód uwierzytelnienia (jesteś zalogowany) oraz podpowiedzi autoryzacyjne (role, uprawnienia, scope) — ale serwer nadal powinien egzekwować reguły autoryzacji.

Gdzie pojawiają się JWT

JWT często używa się jako access tokenów w:

  • API webowych
  • SPA
  • aplikacjach mobilnych
  • systemach wykorzystujących OAuth 2.0 lub OpenID Connect (OIDC)

Budowa JWT: header, payload i signature

JWT to zwarty ciąg złożony z trzech części, każda zakodowana Base64URL i oddzielona kropkami:

header.payload.signature

Przykład (ocenzurowany):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNzAwMDAwMDAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c…

1) Header

Header opisuje, jak token został utworzony — najważniejszym polem jest algorytm podpisu (np. HS256, RS256/ES256) i typ tokena.

Częste pola:

  • typ: często "JWT" (w praktyce często ignorowane)
  • alg: użyty algorytm podpisu
  • kid: identyfikator klucza pomagający weryfikatorowi wybrać właściwy klucz podczas rotacji

Uwaga bezpieczeństwa: nie ufaj headerowi bez sprawdzenia. Wprowadź allowlistę algorytmów, których faktycznie używasz, i nie akceptuj alg: "none".

2) Payload

Payload zawiera „claims” (pola) o użytkowniku i kontekście tokena: dla kogo jest, kto go wystawił i kiedy wygasa.

Ważne: JWT nie są domyślnie szyfrowane. Kodowanie Base64URL sprawia, że token jest bezpieczny w URL, ale nie ukrywa danych. Każdy, kto ma token, może odszyfrować header i payload.

Dlatego unikaj wkładania sekretów (haseł, kluczy API) lub wrażliwych danych osobowych do JWT.

3) Signature

Signature powstaje przez podpisanie header + payload kluczem:

  • HS256: podpis i weryfikacja za pomocą wspólnego sekretu
  • RS256/ES256: prywatny klucz podpisuje; publiczny klucz weryfikuje

Podpis zapewnia integralność: pozwala serwerowi sprawdzić, że token nie został zmieniony i został wydany przez zaufanego podpisującego. Nie zapewnia poufności.

Rozmiar tokena

Ponieważ JWT zawiera header i payload przy każdym żądaniu, większe tokeny to więcej transferu i narzutów. Trzymaj claims oszczędnie i preferuj identyfikatory zamiast dużych danych.

Payload i roszczenia: co możesz (i czego nie powinieneś) przechowywać

Ship JWT Auth Faster
Zbuduj aplikację chronioną JWT przez rozmowę, a potem dopracuj reguły weryfikacji w trybie planowania.

Claims zwykle dzielą się na dwie grupy: zarejestrowane (standardowe nazwy) i własne (pola aplikacji).

Popularne zarejestrowane claims

  • iss (issuer): kto stworzył token
  • sub (subject): o kim jest token (zazwyczaj ID użytkownika)
  • aud (audience): dla kogo jest token (np. konkretne API)
  • exp (expiration time): kiedy token powinien przestać być akceptowany
  • iat (issued at): kiedy token został utworzony
  • nbf (not before): token nie powinien być akceptowany przed tym czasem

Własne claims: trzymaj je małe

Dołącz tylko to, czego serwis odbierający naprawdę potrzebuje do podjęcia decyzji autoryzacyjnej.

Dobre przykłady:

  • stabilny wewnętrzny identyfikator użytkownika (user_id)
  • niewielki zestaw ról/uprawnień (tylko jeśli potrafisz je utrzymywać na bieżąco)
  • ID najemcy/organizacji w aplikacjach multi-tenant

Unikaj „wygodnych” claims, które duplikują dużo danych profilu. Zwiększają rozmiar tokena, szybko się starzeją i powiększają skutki wycieku.

Czego NIGDY nie umieszczać w payloadzie JWT

Ponieważ payload jest czytelny, nie przechowuj tam:

  • haseł, kluczy API, refresh tokenów ani innych sekretów
  • danych płatniczych, numerów dokumentów ani wrażliwych danych osobowych
  • niczego, czego nie chciałbyś zobaczyć w przeglądarce, proxy lub logach

Jeśli potrzebujesz wrażliwych informacji, trzymaj je po stronie serwera i w tokenie umieść tylko referencję (np. ID) — lub użyj szyfrowanego formatu tokena (JWE), gdy to odpowiednie.

Jak działa podpis (i co gwarantuje)

Podpisanie to nie szyfrowanie.

  • Podpis jest jak zapieczętowany list: każdy może go odczytać, ale można sprawdzić, czy został zmieniony.
  • Szyfrowanie jest jak zamknięcie listu w skrzyni z zamkiem: tylko ktoś z kluczem może odczytać.

Kiedy JWT jest wystawiany, serwer podpisuje zakodowany header + payload. Gdy token jest przedstawiony później, serwer przelicza podpis i porównuje go. Jeśli ktoś zmieni choćby jeden znak (np. "role":"user" na "role":"admin"), weryfikacja nie przejdzie i token zostanie odrzucony.

JWT vs OAuth, OpenID Connect i typy tokenów

JWT to format tokena. OAuth 2.0 i OpenID Connect (OIDC) to protokoły, które opisują, jak aplikacje żądają, wydają i używają tokenów.

OAuth 2.0 i access/refresh tokeny

OAuth 2.0 dotyczy głównie autoryzacji: pozwalania aplikacji na dostęp do API w imieniu użytkownika bez przekazywania hasła.

  • Access token: przedstawiany API, by udowodnić uprawnienia; może być JWT lub tokenem opaque
  • Refresh token: dłużej żyjący token używany do uzyskania nowych access tokenów

Access tokeny zwykle są krótkotrwałe (minuty). Krótkie życie ogranicza szkody w razie wycieku.

OpenID Connect (OIDC) i ID tokeny

OIDC dodaje uwierzytelnianie (kim jest użytkownik) do OAuth 2.0 i wprowadza ID token, który jest zwykle JWT.

  • ID token: dla aplikacji klienckiej do potwierdzenia tożsamości użytkownika
  • Access token: dla API do autoryzacji żądań

Zasada: nie używaj ID tokena do wywołań API.

Jeśli chcesz więcej kontekstu o praktycznych przepływach, zobacz /blog/jwt-authentication-flow.

Typowy przepływ uwierzytelniania JWT

Go From Build to Deploy
Wdróż i hostuj swoją aplikację opartą na JWT bezpośrednio, z obsługą niestandardowych domen.

Przykładowy flow wygląda tak:

1) Logowanie

Użytkownik loguje się (email/hasło, SSO itp.). Jeśli logowanie zakończy się sukcesem, serwer tworzy JWT (często access token) z niezbędnymi roszczeniami jak subject i expiration.

2) Wydanie tokena

Serwer podpisuje token i zwraca go klientowi (aplikacja web, mobilna lub inny serwis).

3) Wywołania API

Dla chronionych endpointów klient dołącza JWT w nagłówku Authorization:

Authorization: Bearer \u003cJWT\u003e

4) Weryfikacja

Zanim API obsłuży żądanie, zazwyczaj sprawdza:

  • podpis (integralność + zaufany issuer)
  • exp (czy nie wygasł)
  • iss (oczekiwany issuer)
  • aud (czy token jest przeznaczony dla tego API)

Jeśli wszystkie kontrole przejdą, API traktuje użytkownika jako uwierzytelnionego i stosuje reguły autoryzacji (np. uprawnienia do poziomu rekordu).

5) Krótka uwaga o dryfie zegarów

Ponieważ zegary systemowe driftują, wiele systemów dopuszcza niewielki clock skew przy weryfikacji roszczeń czasowych jak exp (i czasem nbf). Trzymaj ten przesunięcie małe, aby nie przedłużać niezamierzenie ważności tokena.

Gdzie bezpiecznie przechowywać JWT

Wybór miejsca przechowywania determinuje, co atakujący może ukraść i jak łatwo może odtworzyć żądanie przy użyciu tokena.

Aplikacje web: pamięć vs localStorage vs cookies

Przechowywanie w pamięci (często rekomendowane dla SPA) trzyma access token w stanie JS. Czyszczony po odświeżeniu strony, zmniejsza ryzyko „kradzieży później”, ale błąd XSS nadal może go odczytać podczas działania strony. Łącz to z krótkimi access tokenami i mechanizmem odnawiania.

localStorage/sessionStorage są wygodne, ale ryzykowne: każde XSS pozwala na exfiltrację tokenów z pamięci przeglądarki. Jeśli ich używasz, zapobieganie XSS jest obowiązkowe (CSP, escapowanie wyjścia, higiena zależności) i trzymaj tokeny krótko żyjące.

Bezpieczne cookies (często najbezpieczniejszy domyślny wybór dla webu) przechowują tokeny w ciasteczku HttpOnly, tak że JavaScript nie może ich odczytać — zmniejsza to wpływ kradzieży tokena przez XSS. Wadą jest ryzyko CSRF, bo przeglądarki automatycznie dołączają cookies.

Jeśli używasz cookies, ustaw:

  • HttpOnly
  • Secure (tylko HTTPS)
  • SameSite=Lax lub SameSite=Strict (niektóre cross-site flowy mogą wymagać SameSite=None; Secure)

Rozważ także tokeny CSRF dla żądań zmieniających stan.

Aplikacje mobilne: używaj bezpiecznego magazynu OS

Na iOS/Android przechowuj tokeny w bezpiecznym magazynie systemowym (Keychain / Keystore-backed storage). Unikaj zwykłych plików lub preferencji. Jeśli model zagrożeń obejmuje urządzenia z rootem/jailbreakiem, zakładaj, że ekstrakcja jest możliwa i polegaj na krótkotrwałych tokenach oraz kontrolach po stronie serwera.

Zasada najmniejszych uprawnień

Ogranicz możliwości tokena: używaj minimalnych scope'ów/claimów, trzymaj access tokeny krótkotrwałe i unikaj osadzania wrażliwych danych.

Typowe pułapki bezpieczeństwa JWT

JWT są wygodne, ale wiele incydentów wynika z przewidywalnych błędów. Traktuj JWT jak gotówkę: kto go zdobędzie, zwykle może go użyć.

1) Zbyt długie wygasanie

Jeśli token ważny jest dni lub tygodnie, wyciek daje atakującemu cały ten okres. Preferuj krótkotrwałe access tokeny (minuty) i odnawiaj je bezpiecznym mechanizmem. Jeśli potrzebujesz „zapamiętaj mnie”, zrób to za pomocą refresh tokenów i kontroli po stronie serwera.

2) Pomijanie sprawdzeń issuer i audience

Sam ważny podpis to za mało. Weryfikuj iss i aud, oraz waliduj roszczenia czasowe jak exp i nbf.

3) Ufanie zdekodowanemu payloadowi

Dekodowanie to nie weryfikacja. Zawsze weryfikuj podpis po stronie serwera i egzekwuj uprawnienia po stronie serwera.

4) Zamieszanie z algorytmami i kluczami

  • Nie akceptuj dowolnego algorytmu, który deklaruje token. Stosuj allowlistę.
  • Nie mieszaj kluczy symetrycznych (HS256) z kluczami publiczno-prywatnymi (RS256/ES256).
  • Minimalizuj blast radius przez rozdzielenie kluczy między środowiskami i ich rotację.

5) Wycieki tokenów przez URL, logi i referrery

Unikaj umieszczania JWT w parametrach zapytania. Mogą trafić do historii przeglądarki, logów serwerów, narzędzi analitycznych i nagłówków referer.

Używaj Authorization: Bearer ... zamiast tego.

6) Brak planu rotacji kluczy i unieważniania

Zakładaj, że klucze i tokeny mogą wyciec. Rotuj klucze podpisujące, używaj kid by wspierać płynną rotację i miej strategię unieważniania (krótkie czasy życia + możliwość dezaktywacji kont/sesji). Dla wskazówek odnośnie przechowywania tokenów zobacz /blog/where-to-store-jwts-safely.

Kiedy używać JWT (a kiedy nie)

Design Claims With Confidence
Zaplanuj role, audience, issuer i zasady wygasania przed wygenerowaniem kodu.

JWT są użyteczne, ale nie zawsze najlepsze. Pytanie brzmi: czy skorzystasz na samodzielnym tokenie, który można zweryfikować bez odpytywania bazy danych przy każdym żądaniu.

Dobre zastosowania JWT

  • Bezustanowe API w skali: lokalna weryfikacja (podpis + expiry) bez odpytywania sesji przy każdym żądaniu
  • Wiele usług / mikroserwisy: wspólna weryfikacja i publiczne klucze
  • SPA i aplikacje mobilne: klienci wywołują API bezpośrednio
  • Krótkożyjące access tokeny: mniejsze skutki kradzieży

Kiedy JWT to słaby wybór

  • Wymagana jest natychmiastowa unieważnialność: sesje po stronie serwera są prostsze, jeśli potrzebujesz „wyloguj wszędzie teraz” bez dodatkowej infrastruktury
  • Musisz przechowywać wrażliwe dane: typowe JWT są podpisane, nie zaszyfrowane
  • Długożyjące tokeny: są wysokowartościowe i warto je ukraść

Kiedy prostsze ciasteczka sesyjne są lepsze

Dla tradycyjnych aplikacji renderowanych po stronie serwera, gdzie proste unieważnianie ma znaczenie, sesje po stronie serwera z HttpOnly cookies często są prostszym i bezpieczniejszym wyborem.

Szybka lista kontrolna decyzji

Wybierz JWT, jeśli potrzebujesz bezstanowej weryfikacji między usługami i możesz trzymać tokeny krótkotrwałe.

Unikaj JWT, jeśli potrzebujesz natychmiastowego unieważniania, planujesz przechowywać wrażliwe dane w tokenie, lub możesz użyć ciasteczek sesyjnych bez problemów.

Praktyczna lista kontrolna i FAQ

Lista weryfikacji (co sprawdzać za każdym razem)

  1. Podpis jest ważny

Weryfikuj używając właściwego klucza i oczekiwanego algorytmu. Odrzucaj nieprawidłowe podpisy — bez wyjątków.

  1. exp (wygaśnięcie)

Upewnij się, że token nie wygasł.

  1. nbf (not before)

Jeśli obecne, upewnij się, że token nie jest używany zbyt wcześnie.

  1. aud (audience)

Potwierdź, że token był przeznaczony dla Twojego API/serwisu.

  1. iss (issuer)

Potwierdź, że token pochodzi od oczekiwanego issuer.

  1. Kontrole sanitarne (zalecane)

Waliduj format tokena, egzekwuj maksymalny rozmiar i odrzucaj nieoczekiwane typy roszczeń, aby zmniejszyć liczbę błędów brzegowych.

Wybór HS256 vs RS256/ES256

  • HS256 (klucz symetryczny): jeden wspólny sekret podpisuje i weryfikuje.

    • Dobre do: jednej aplikacji/API kontrolowanej przez jeden zespół.
    • Uwaga: każdy weryfikator mający sekret może też wystawiać tokeny.
  • RS256 / ES256 (klucze asymetryczne): prywatny klucz podpisuje; publiczny weryfikuje.

    • Dobre do: wielu serwisów weryfikujących tokeny; dystrybucji klucza publicznego bez umożliwienia podpisywania.
    • Uwaga operacyjna: rotacja jest często bezpieczniejsza, bo tylko podpisujący trzyma prywatny klucz.

Zasada: jeśli więcej niż jeden niezależny system musi weryfikować tokeny (albo nie ufasz każdemu weryfikatorowi), preferuj RS256/ES256.

Monitorowanie i logowanie (bez wycieków tokenów)

  • Nie loguj surowych tokenów (nagłówków, ciasteczek, parametrów query).
  • Jeśli potrzebujesz korelacji, loguj odcisk tokena (np. hash) lub bezpieczne metadane (iss, aud, identyfikator użytkownika tylko jeśli polityka na to pozwala).
  • Obserwuj anomalie: nieudane podpisy, skoki w liczbie wygasłych tokenów, nietypowe audience/issuer i podejrzane wzorce odnawiania.

FAQ

Czy JWT są szyfrowane?

Nie domyślnie. Większość JWT jest podpisana, nie szyfrowana, co oznacza, że zawartość można odczytać przez każdego, kto ma token. Użyj JWE lub trzymaj wrażliwe dane poza JWT.

Czy mogę unieważnić JWT?

Niełatwo, jeśli polegasz wyłącznie na samodzielnych access tokenach. Typowe podejścia to krótkotrwałe access tokeny, deny-listy dla wysokiego ryzyka lub refresh tokeny z rotacją.

Jak długo powinno trwać exp?

Tak krótko, jak na to pozwala UX i architektura. Wiele API używa minut dla access tokenów i łączy to z refresh tokenami dla dłuższych sesji.

Szybsze budowanie aplikacji chronionych JWT z Koder.ai

Jeśli implementujesz uwierzytelnianie JWT w nowym API lub SPA, dużo pracy jest powtarzalne: podłączanie middleware, walidacja iss/aud/exp, ustawianie flag ciasteczek i wyłączanie logowania tokenów.

Z Koder.ai możesz szybko stworzyć aplikację web (React), serwisy backendowe (Go + PostgreSQL) lub aplikację mobilną Flutter przez chatowy workflow — potem iterować w trybie planowania, używać snapshotów i rollbacku przy dopracowywaniu bezpieczeństwa oraz eksportować kod źródłowy, gdy jesteś gotowy. To praktyczny sposób przyspieszający budowę przepływów autoryzacji JWT, zachowując kontrolę nad logiką weryfikacji, strategią rotacji kluczy i ustawieniami wdrożenia/hostingu (w tym niestandardowe domeny).

Często zadawane pytania

What is a JWT, and where do I usually send it?

JWT (JSON Web Token) to zwarty, bezpieczny dla URL-a ciąg znaków, który przenosi roszczenia (pola z danymi) i może być weryfikowany przez serwer. Zwykle wysyła się go w żądaniach API za pomocą:

  • Authorization: Bearer \u003ctoken\u003e

Główna idea: serwer może zweryfikować integralność tokena (dzięki podpisowi) bez konieczności posiadania rekordu sesji dla każdego żądania.

How is JWT authentication different from server sessions?

Uwierzytelnianie sesyjne zwykle przechowuje stan po stronie serwera (rekord sesji identyfikowany przez cookie/ID sesji). W uwierzytelnianiu opartym na JWT klient przedstawia podpisany token przy każdym żądaniu, a API go weryfikuje.

JWT są popularne w przypadku API i architektur wieloserwisowych, ponieważ weryfikacja może odbywać się lokalnie, zmniejszając potrzebę współdzielenia przechowywania sesji.

„Bezustanowość” nadal często oznacza pewne kontrole po stronie serwera, takie jak listy unieważnień, sprawdzenie statusu użytkownika lub obsługa rotacji kluczy.

What are the three parts of a JWT (header, payload, signature)?

JWT składa się z trzech części kodowanych Base64URL i oddzielonych kropkami:

  • header.payload.signature

Header opisuje sposób podpisania, payload zawiera roszczenia (np. sub, exp, aud), a signature pozwala serwerowi wykryć modyfikacje.

Is a JWT encrypted, and can people read what’s inside?

Nie. Standardowe JWT są zwykle podpisane, a nie szyfrowane.

  • Podpis dowodzi integralności (nie zostały zmienione) i autentyczności (wydane przez zaufany podpisujący).
  • Każdy, kto ma token, może odszyfrować Base64URL header i payload i przeczytać ich zawartość.

Jeśli potrzebujesz poufności, rozważ JWE (zaszyfrowane tokeny) lub trzymaj wrażliwe dane po stronie serwera i umieszczaj w tokenie tylko identyfikator.

What does the JWT signature guarantee—and what doesn’t it guarantee?

Podpis pozwala serwerowi zweryfikować, że token nie został zmieniony i został wydany przez podmiot posiadający klucz podpisujący.

Nie gwarantuje on jednak:

  • ukrycia zawartości payloadu
  • tego, że użytkownik nadal jest aktywny (chyba że to dodatkowo sprawdzisz)
  • automatycznego unieważnienia tokenów przed exp

Traktuj token jak poświadczenie: jeśli wycieknie, zwykle można go użyć do autoryzacji do czasu wygaśnięcia.

What are `alg` and `kid` in the JWT header, and why do they matter?

alg informuje weryfikatora, jakiego algorytmu użyto (np. HS256 vs RS256). kid to identyfikator klucza, który pomaga dobrać właściwy klucz podczas rotacji.

Zasady bezpieczeństwa:

  • Stosuj allowlistę oczekiwanych algorytmów; nie akceptuj dowolnych wartości alg.
  • Nigdy nie akceptuj alg: "none".
  • Nie pozwól, by niezweryfikowany kid prowadził do niebezpiecznego zachowania przy wyszukiwaniu klucza.
Which JWT claims should I include in the payload?

Zacznij od standardowych zarejestrowanych roszczeń i ogranicz własne do minimum.

Częste zarejestrowane roszczenia:

  • iss (issuer)
  • sub (subject / identyfikator użytkownika)
  • aud (audience / docelowe API)
  • exp (expiration)
  • iat (issued at)
  • nbf (not before)

Unikaj umieszczania sekretów lub wrażliwych danych osobowych w payloadzie, bo są one czytelne w przypadku ujawnienia tokena.

How do JWT, OAuth 2.0, and OpenID Connect relate (access tokens vs ID tokens)?

JWT to format tokena; OAuth 2.0 i OpenID Connect to protokoły.

Typowe mapowanie:

  • Access token: do wywołań API (może być JWT lub tokenem nieprzezroczystym — opaque).
  • ID token (OIDC): dla aplikacji klienckiej do potwierdzenia tożsamości (zwykle JWT).
  • Refresh token: do otrzymywania nowych access tokenów (często opaque; traktuj jako wysoce wrażliwy).

Ważne: nie używaj ID tokena do wywołań API tylko dlatego, że wygląda jak JWT access token.

Where should I store JWTs safely in a browser app?

Dla aplikacji przeglądarkowych typowe opcje to:

  • W pamięci (in-memory): rekomendowane dla SPA — token trzymany w stanie JS. Czyści się przy odświeżeniu strony; zmniejsza ryzyko „wyjęcia później”, ale XSS może odczytać go podczas działania strony. Połącz z krótkimi access tokenami i flowem refresh.
  • localStorage/sessionStorage: łatwe, ale ryzykowne — XSS może wydobyć tokeny. Jeśli ich używasz, zapobiegaj XSS (CSP, poprawne escapowanie, higiena zależności) i stosuj krótkie żywotności tokenów.
  • HttpOnly Secure cookies: często najbezpieczniejsze dla webu, bo JS nie ma dostępu do ciasteczka — zmniejsza to skutki kradzieży przez XSS. W zamian musisz chronić się przed CSRF, bo przeglądarka automatycznie dołącza ciasteczka.

Jeśli używasz cookies, ustaw:

  • HttpOnly
  • Secure (HTTPS tylko)
  • SameSite=Lax lub SameSite=Strict (niektóre cross-site flowy mogą wymagać SameSite=None; Secure)

Rozważ też tokeny CSRF dla żądań zmieniających stan.

What checks should my API perform when validating a JWT?

Co najmniej zweryfikuj:

  • podpis (poprawny klucz i allowlistowany algorytm)
  • exp (nie wygasł)
  • iss (oczekiwany issuer)
  • aud (przeznaczony dla Twojego API)
  • nbf (jeśli obecny)

Dodaj praktyczne zabezpieczenia:

  • narzuć maksymalny rozmiar tokena
  • odrzucaj nieoczekiwane typy roszczeń
  • pozwól na niewielki clock skew, by uniknąć problemów z dryfem czasów systemów

Related posts