• jwt
  • uwierzytelnianie
  • sesja
  • token
  • unieważnij jwt

JWT kontra uwierzytelnianie sesyjne

Poznaj różnice między uwierzytelnianiem sesyjnym a JWT. Zbadaj kompromisy, zalety i przypadki użycia, aby wybrać właściwy schemat uwierzytelniania dla swoich aplikacji.

Ran
Ran
Product & Design
Darcy Ye
Darcy Ye
Developer

Ogólnie rzecz biorąc, pierwszym krokiem podczas korzystania z aplikacji jest uwierzytelnianie, gdzie końcowy użytkownik podaje swoje dane identyfikacyjne, aby pomyślnie się zalogować. Po tym kroku system tożsamości (np. dostawca tożsamości, serwer uwierzytelniania itd.) wie, kim jest użytkownik i do jakich zasobów ma dostęp.

Ponieważ HTTP jest z natury bezstanowy, każde żądanie w sesji jest niezależne i nie pamięta informacji z poprzednich. Ponowne uwierzytelnianie użytkowników przy każdej akcji jest uciążliwe i obniża jakość korzystania z usługi.

Poznajmy autentykację opartą na sesji i autentykację JWT (JSON Web Tokens), dwie popularne metody utrzymywania stanu uwierzytelniania. Każda z nich ma unikalne zalety i kompromisy, a wybór między nimi zależy od konkretnych potrzeb aplikacji. Jeśli decydujesz się między nimi, ten przewodnik ma ci pomóc.

Czym jest uwierzytelnianie oparte na sesji?

Uwierzytelnianie oparte na sesji polega na tym, że serwer utrzymuje zapis stanu uwierzytelnienia użytkownika. Tworząc i zarządzając sesjami, serwer umożliwia użytkownikom pozostanie zalogowanym i dalsze interakcje z aplikacją bez konieczności ponownego wprowadzania danych przy każdym żądaniu.

Jak działa uwierzytelnianie oparte na sesji?

Tworzenie sesji

  1. Użytkownik uwierzytelnia się i podaje jakieś dane (np. adres e-mail i hasło).
  2. Jeśli dane są poprawne, serwer tworzy trwały zapis reprezentujący tę sesję. Sesja zawiera informacje takie jak przypadkowy ciąg znaków, identyfikator użytkownika, czas rozpoczęcia sesji, czas wygaśnięcia sesji itd.
  3. SessionID jest przechowywany w bazie danych i zwracany do klienta użytkownika jako ciasteczko.

Weryfikacja sesji

  1. Proces można uruchomić ręcznie przez użytkownika (np. klikając kartę, odświeżając stronę) lub automatycznie przez klienta (np. podczas początkowych załadowań strony lub poprzez wywołania API z SessionID).
  2. Każde kolejne wywołanie wysyła żądanie HTTP od klienta zawierające ciasteczko sesji do serwera.
  3. Serwer weryfikuje SessionID, konsultując się z danymi sesji przechowywanymi na serwerze.
  4. Jeśli jest ważny, serwer przetwarza żądanie i autoryzuje użytkownika.

Jak unieważnić sesję?

Sesje można unieważniać w czasie rzeczywistym, co jest przydatne w sytuacjach, gdy konieczne jest szybkie cofnięcie dostępu.

  • Ręczne wylogowanie użytkowników: Serwer usuwa zapis sesji, skutecznie wylogowując użytkownika.
  • Administratorzy wymuszają wylogowanie użytkowników: Administratorzy lub systemy mogą zakończyć określoną sesję, usuwając ją z bazy danych. Na przykład podczas incydentu naruszenia bezpieczeństwa.
  • Wygaśnięcie sesji: Sesje mogą automatycznie wygasać po określonym czasie bezczynności lub po ustalonym limicie czasowym.

Zalety uwierzytelniania opartego na sesji

  • Proste i niezawodne: Rekord sesji stanowi jasne, scentralizowane źródło, co pozwala na wysoki poziom zaufania i czyni decyzje autoryzacyjne bardziej niezawodnymi.
  • Unieważnienie w czasie rzeczywistym: Poprzez usunięcie lub unieważnienie zapisu sesji, dostęp użytkownika można szybko cofnąć.

Wady uwierzytelniania opartego na sesji

  • Opóźnienie w systemie rozproszonym: Utrzymywanie danych sesji na wielu serwerach zawsze wymaga synchronizacji przechowywania sesji. To wprowadza dodatkowe opóźnienie, ponieważ serwer musi sprawdzać przechowywanie sesji za każdym razem, kiedy występuje żądanie.
  • Wysokie zużycie zasobów: Każda sesja zużywa zasoby serwera, co wpływa na wydajność, gdy baza użytkowników się skaluje.
  • Ryzyko związane z bezpieczeństwem: Przejęcie sesji (przez kradzież ciasteczek sesji) może pozwolić nieautoryzowanym osobom na dostęp do kont użytkowników.
  • Ograniczone wykorzystanie dla API: Uwierzytelnianie oparte na sesji nie jest świetne dla aplikacji mobilnych. Przechowuje dane sesji na serwerze, co może zwiększać obciążenie i złożoność przy wielu użytkownikach. Na dodatek używa ciasteczek, które są trudniejsze do obsługi na urządzeniach mobilnych.

Czym jest uwierzytelnianie JWT?

JSON Web Tokens (JWT) przyjmuje inne podejście, osadzając wszystkie istotne informacje użytkownika bezpośrednio w tokenie, używając obiektu JSON. W przeciwieństwie do metod opartych na sesji, JWT są bezstanowe, co oznacza, że serwer nie zarządza rekordami uwierzytelnienia.

Jak działa uwierzytelnianie JWT?

JWT składa się z trzech części: nagłówka, ładunku i podpisu.

  • Nagłówek zawiera algorytm podpisu (np. HS256) i typ tokena (JWT).
  • Ładunek zawiera podstawowe roszczenia, takie jak tożsamość użytkownika, rola użytkownika i czas wygaśnięcia.
  • Podpis używa klucza do podpisania nagłówka i ładunku, co pozwala na weryfikację, czy podpis został naruszony.

image.png

Wydawanie JWT

  1. Klient przesyła dane użytkownika do serwera uwierzytelniania (Uniwersalny dostawca tożsamości jest szczególnie korzystny w zarządzaniu dostępem przez wiele domen.)
  2. Po pomyślnym uwierzytelnieniu, serwer generuje JWT, który zawiera nagłówek, ładunek i podpis.
  3. Serwer uwierzytelniania przesyła wydany token do klienta. Klient przechowuje JWT (np. w ciasteczkach, localStorage lub sessionStorage).

Przepływy oparte na sesjach podążają za podobnym procesem. Jednak po uwierzytelnieniu informacje użytkownika są przechowywane na serwerze w ramach sesji, podczas gdy JWT polegają na przesyłaniu tokenów do klienta do przechowywania i późniejszego użycia.

Weryfikacja tokenu

  1. Przy kolejnych żądaniach API klient wysyła JWT w nagłówku Authorization (Bearer <token>).
  2. Serwer weryfikuje podpis JWT, używając tajnego klucza lub klucza publicznego i sprawdza jego roszczenia (np. wygaśnięcie, wydawca).
  3. Jeśli token jest ważny, serwer udziela klientowi dostępu do żądanych zasobów.

Uwierzytelnianie oparte na sesji wymaga od serwera zapytania do przechowywania sesji, co może być wolne, szczególnie jeśli opiera się ono na zewnętrznych lub centralnych bazach danych. W przeciwieństwie do tego, uwierzytelnianie JWT jest bezstanowe, a wszystkie niezbędne informacje są przechowywane w tokenie klienta, wykorzystując podpis do zapewnienia bezpieczeństwa. To eliminuje potrzebę zarządzania sesjami, czyniąc je szybszym i bardziej skalowalnym, szczególnie w systemach rozproszonych.

Jak unieważnić JWT?

Po stronie klienta, wylogowanie zazwyczaj oznacza czyszczenie lokalnej sesji i usunięcie tokenów (ID, access, refresh token) z przechowywania. Jednakże w przypadku uwierzytelniania JWT, to jedynie wylogowuje użytkownika lokalnie, pozostawiając centralizowaną sesję na serwerze autoryzacji nienaruszoną. W rezultacie użytkownicy mogą nadal uzyskiwać dostęp do innych aplikacji w ramach tej samej sesji, dopóki token nie wygaśnie lub nie zostanie ręcznie zakończony.

Unieważnienie JWT (JSON Web Token) jest trudniejsze niż w przypadku uwierzytelniania opartego na sesji, ponieważ JWT są bezstanowe i nie mogą być unieważniane po wydaniu, chyba że zostaną wdrożone konkretne strategie. Do powszechnych metod należą:

  • Krótki czas wygaśnięcia: Ustaw krótkie roszczenie exp (np. 15 minut) dla JWT. Po wygaśnięciu użytkownik musi ponownie się uwierzytelnić. Minimalizuje to ryzyko, jeśli token zostanie skompromitowany, ponieważ napastnik może go używać tylko przez ograniczony czas. Aby zapewnić użytkownikom płynne działanie, można użyć refresh token, aby zminimalizować niedogodności związane z ponownym uwierzytelnianiem.
  • Lista zablokowanych tokenów: W krytycznych przypadkach (np. wylogowanie użytkownika, zmiany hasła) zachowaj listę zablokowanych tokenów. Serwer sprawdza przychodzące tokeny względem tej listy i odrzuca wszelkie dopasowania. Choć skuteczna, ta metoda wymaga śledzenia unieważnionych tokenów, co jest przeciwieństwem bezstanowego charakteru JWT i może stać się niewydajne, jeśli lista zbyt się rozrośnie.
  • Punkt końcowy unieważnienia: Wprowadź punkt końcowy unieważnienia na serwerze autoryzacji, gdzie tokeny (np. tokeny odświeżające) mogą być unieważniane. Gdy token odświeżający zostanie unieważniony, żadne tokeny dostępowe wydane z jego użyciem nie będą już odnawiane. Ta metoda działa dobrze w przepływach OAuth2.

Zalety uwierzytelniania JWT

  • Szybsze i bardziej informatywne: Bezstanowa natura JWT sprawia, że weryfikacja po stronie klienta jest szybsza i bardziej wydajna, bez potrzeby interakcji z serwerem. Mogą również zawierać niestandardowe roszczenia (np. role użytkownika lub inne istotne dane) w ramach tokenu, umożliwiając serwerom ustalenie ról bez zapytań do bazy danych.
  • Zwiększone bezpieczeństwo: JWT używają technik podpisu i szyfrowania, co utrudnia ataki.
  • Wsparcie dla wielu domen: JWT doskonale sprawdzają się w jednolitym logowaniu (SSO) i uwierzytelnianiu międzydomenowym. Umożliwiają użytkownikom uwierzytelnianie na wielu domenach lub usługach z tym samym tokenem.
  • Przyjazne dla urządzeń mobilnych: JWT świetnie sprawdzają się w aplikacjach mobilnych, które potrzebują bezstanowego uwierzytelniania. Tokeny mogą być przechowywane po stronie klienta i przesyłane z każdym żądaniem, co zwiększa wydajność i łatwość użytkowania.

Wady uwierzytelniania JWT

  • JWT nie jest aktualizowany w czasie rzeczywistym

    Po podpisaniu JWT, nie można go unieważnić ani zaktualizować, i będzie uznawany za ważny, dopóki podpis jest ważny i nie wygasł.

    Jeśli zmieni się dostęp użytkownika (zazwyczaj zostanie obniżony), użytkownik będzie nadal miał dostęp do usuniętych zasobów, dopóki JWT nie wygaśnie. Podobnie, jeśli JWT zawiera informacje o autoryzacji opartej na rolach, nowy zakres autoryzacji nie wejdzie w życie, dopóki stary JWT nie wygaśnie. Innymi słowy, JWT nie są odpowiednie do unieważniania w czasie rzeczywistym, a użytkownicy mogą ustawić odpowiedni czas wygaśnięcia, aby złagodzić ten problem.

  • Dylemat wielourządzeniowy i unieważnieniowy

    Nie ma możliwości zweryfikowania wszystkich wydanych JWT przed ich wygaśnięciem w celu unieważnienia użytkowania na wszystkich urządzeniach. Chociaż teoretycznie można unieważnić klucz podpisu, aby unieważnić JWT, unieważni to również wszystkie JWT używające tego klucza, a proces obsługi kluczy pamięci podręcznej sprawiłby, że ta metoda byłaby niepraktyczna do prostych operacji unieważnieniowych użytkownika.

Niektórzy dostawcy tożsamości mogą mieć wbudowane rozwiązania dla tych problemów z JWT. Aby uzyskać więcej informacji, sprawdź „Najlepsze praktyki ulepszania doświadczeń z uwierzytelnianiem JWT.”

Czym różnią się JWT i sesja?

Sesje i JWT to dwa popularne podejścia do utrwalania kontekstu uwierzytelniania i autoryzacji w bezstanowym świecie HTTP. Chociaż obie metody mają swoje zalety i wady, oferują różne korzyści i ograniczenia.

Sesje zapewniają silniejsze gwarancje dla autoryzacji poszczególnych żądań i są prostsze do bezpiecznego wdrożenia. Jednakże, ich zależność od walidacji baz danych po stronie serwera wprowadza opóźnienia, które mogą negatywnie wpłynąć na komfort użytkowania w aplikacjach wymagających wysokiej responsywności.

Z drugiej strony, JWT mają przewagę w szybszej autoryzacji i interoperacyjności z aplikacjami zewnętrznymi, ale wymagają więcej pracy programisty, aby rozwiązać złożoność związaną z bezpieczeństwem. Na przykład możemy używać webhooków do powiadamiania klientów, kiedy dostęp użytkownika zostanie cofnięty, aby klienci mogli wyczyścić zapisany JWT i wymusić ponowne uwierzytelnienie.

Ponieważ uwierzytelnianie oparte na tokenach jest bardziej odpowiednie do skalowania, mimo że ma wady dające się zarządzać, jest ono wykorzystywane przez coraz więcej nowoczesnych aplikacji.

Sesja kontra JWT: Wybór odpowiedniej metody

Twoja metoda uwierzytelniania powinna odpowiadać architekturze aplikacji i jej specyficznym potrzebom. Oto krótki przewodnik, który pomoże ci podjąć decyzję:

Kiedy używać uwierzytelniania opartego na sesji

Uwierzytelnianie oparte na sesji najlepiej działa, gdy potrzebujesz kontroli sesji w czasie rzeczywistym, potrzebujesz scentralizowanego zarządzania, lub skalowalność nie jest najważniejszym aspektem. Oto, gdzie się wyróżnia:

  • Aplikacje internetowe z trwałymi sesjami

    Dla platform takich jak sklepy internetowe sesje są niezbędne, aby śledzić użytkowników, koszyki i preferencje podczas ich wizyty.

  • Aplikacje wymagające kontroli sesji w czasie rzeczywistym

    Takie jak aplikacje bankowe lub usługi finansowe, które korzystają z danych sesji kontrolowanych przez serwer, zapewniając solidne zarządzanie dostępem i bezpieczeństwem.

  • Systemy z pojedynczym serwerem lub małej skali

    Narzędzia wewnętrzne lub aplikacje małej skali bez dużych potrzeb skalowalności korzystają z prostego zarządzania sesjami dla łatwości użycia i niezawodności.

Kiedy używać uwierzytelniania JWT

Uwierzytelnianie JWT jest lepsze dla aplikacji, które stawiają na skalowalność, wydajność i systemy rozproszone. Jest szczególnie użyteczne dla bezstanowych interakcji między klientami a serwerami. Rozważ uwierzytelnianie oparte na tokenach dla:

  • Jednolite logowanie (SSO)

    JWT są idealne do jednolitego logowania, umożliwiając użytkownikom jednorazowe uwierzytelnienie i płynne uzyskiwanie dostępu do wielu usług lub aplikacji używając tego samego tokenu. Podziel się szczegółowym wyjaśnieniem na temat bezpiecznych aplikacji w chmurze z użyciem OAuth 2.0 i OIDC, z formatem JWT dla obu tokenów dostępu i tokenów ID.

  • Aplikacje mobilne

    Aplikacje mobilne często preferują JWT do uwierzytelniania, ponieważ tokeny mogą być bezpiecznie przechowywane na urządzeniu i przesyłane z każdym żądaniem API. Poznaj szybkie wdrożenie uwierzytelniania JWT dla Androida / iOS.

  • Architektury mikrousług

    W środowiskach mikrousług JWT pozwalają każdej usłudze niezależnie weryfikować token bez polegania na centralnym przechowywaniu sesji, zapewniając skalowalność i wydajność.

  • Uwierzytelnianie międzydomenowe

    JWT świetnie sprawdzają się w scenariuszach obejmujących wiele domen lub subdomen (np. api.example.com, dashboard.example.com, i docs.example.com). W przeciwieństwie do ciasteczek JWT pozwalają na uwierzytelnianie między domenami bez dodatkowych zależności.

  • API i usługi internetowe

    RESTful API i usługi internetowe często używają JWT do uwierzytelniania, ponieważ są lekkie, przenośne i eliminują potrzebę zarządzania sesjami po stronie serwera. Dowiedz się więcej o uwierzytelnianiu maszyna-maszyna w scenariuszach, w których twoja aplikacja musi bezpośrednio komunikować się z zasobami.

Najlepsze praktyki ulepszające doświadczenia z uwierzytelnianiem JWT

Uwierzytelnianie JWT to świetne narzędzie, ale może wiązać się z wyzwaniami wpływającymi na doświadczenia użytkownika. Logto oferuje łatwe i niezawodne rozwiązania do pokonywania tych przeszkód, czyniąc je najlepszym wyborem dla bezpiecznego i wydajnego uwierzytelniania.

Radzenie sobie z problemami wylogowywania użytkowników z JWT

Jednym z częstych problemów z uwierzytelnianiem JWT jest zapewnienie poprawnego doświadczenia wylogowywania użytkowników. Logto upraszcza ten proces dzięki swojemu gotowemu SDK.

  • Poprzez czyszczenie tokenów i lokalnych sesji po stronie klienta oraz przekierowanie użytkowników do Logto's end session endpoint, można z łatwością zakończyć sesje zarówno w aplikacji klienta, jak i na serwerze.
  • Dodatkowo, Logto obsługuje wylogowanie tylnego kanału, umożliwiając serwerowi uwierzytelniania powiadamianie wszystkich aplikacji klienta współdzielących tę samą sesję podczas wylogowania użytkownika.

To zapewnia spójną i bezpieczną kontrolę sesji w całym twoim ekosystemie. Dowiedz się więcej o radzeniu sobie z wylogowywaniem.

Obsługa zmian uprawnień użytkownika

Zarządzanie zmianami uprawnień użytkownika w czasie rzeczywistym z JWT może być również skomplikowane. Ponieważ JWT są z założenia bezstanowe, wszelkie zaktualizowane uprawnienia lub role mogą nie zostać uwzględnione, dopóki token nie wygaśnie. Logto oferuje strategie, aby skutecznie to obsłużyć:

  • Dla obniżenia uprawnień tego użytkownika: Użyj krótkich czasów wygaśnięcia tokenów dostępu lub dynamicznie weryfikuj uprawnienia przez wywołanie API.
  • Dla dodania nowych uprawnień dla tego użytkownika: Zaktualizuj serwer uwierzytelniania, aby uwzględnić nowy zakres uprawnień i ponownie uzyskać zgodę użytkowników, aby zastosować te zmiany.

Te rozwiązania pomagają utrzymać aktualność uprawnień i zapewniają bezpieczniejszy, bardziej responsywny system. Dowiedz się więcej o obsłudze zmian uprawnień.

Logto, który jest skalowanym infrastrukturą zarządzania dostęp do tożsamości, oferuje pełne rozwiązanie tożsamościowe z chmurową usługą i wersją open-source dostępne.