JWT vs. uwierzytelnianie oparte na sesji
Poznaj różnice między uwierzytelnianiem opartym na sesji a uwierzytelnianiem JWT. Odkryj kompromisy, zalety i przypadki użycia, aby wybrać odpowiedni schemat uwierzytelniania dla swoich aplikacji.
Ogólnie rzecz biorąc, pierwszym krokiem w korzystaniu z aplikacji jest uwierzytelnianie, w którym użytkownik końcowy podaje swoje dane tożsamościowe, aby pomyślnie się zalogować. Po tym kroku system tożsamości (tzn. dostawca tożsamości, serwer uwierzytelniający itp.) wie, kim jest użytkownik i do jakich zasobów ma dostęp.
Ze względu na to, że 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 szkodzi doświadczeniu użytkownika.
Wejdźmy w temat uwierzytelniania opartego na sesji oraz uwierzytelniania JWT (JSON Web Tokens), dwóch popularnych metod utrzymywania stanu uwierzytelnienia. Każda z nich ma swoje unikalne zalety i kompromisy, a wybór między nimi zależy od specyficznych potrzeb Twojej aplikacji. Jeśli stoisz przed decyzją, który z nich wybrać, ten przewodnik jest tu, aby pomóc.
Co to jest uwierzytelnianie oparte na sesji?
Uwierzytelnianie oparte na sesji polega na tym, że serwer prowadzi rejestr stanu uwierzytelnienia użytkownika. Tworząc i zarządzając sesjami, serwer pozwala użytkownikom pozostać zalogowanymi i kontynuować interakcję z aplikacją bez konieczności ponownego wprowadzania danych uwierzytelniających przy każdym żądaniu.
Jak działa uwierzytelnianie oparte na sesji?
Tworzenie sesji
- Użytkownik uwierzytelnia się i podaje pewne dane uwierzytelniające (np. e-mail i hasło).
- Jeśli dane uwierzytelniające są prawidłowe, serwer tworzy trwały rejestr reprezentujący tę sesję. Sesja zawiera takie informacje jak losowy ciąg znaków, identyfikator użytkownika, czas rozpoczęcia sesji, czas wygaśnięcia sesji itp.
SessionID
jest przechowywany w bazie danych i zwracany do klienta użytkownika jako ciasteczko.
Walidacja sesji
- Proces może być uruchamiany ręcznie przez użytkownika (np. klikając zakładkę, odświeżając stronę) lub automatycznie przez klienta (np. podczas wczytywania strony początkowej lub za pomocą wywołań API z
SessionID
). - Każde kolejne wywołanie wysyła żądanie HTTP z klienta zawierające ciasteczko sesji do serwera.
- Serwer waliduje
SessionID
konsultując się z danymi sesji przechowywanymi na serwerze. - Jeśli jest ono prawidłowe, serwer przetwarza żądanie i autoryzuje użytkownika.
Jak unieważnić sesję?
Sesje mogą być unieważniane w czasie rzeczywistym, co jest przydatne w sytuacjach, gdy konieczne jest szybkie cofnięcie dostępu.
- Ręczne wylogowanie przez użytkowników: Serwer usuwa zapis sesji, skutecznie wylogowując użytkownika.
- Wymuszone wylogowanie przez administratorów: Administratorzy lub systemy mogą zakończyć konkretną sesję, usuwając ją z bazy danych. Na przykład podczas naruszenia bezpieczeństwa.
- Wygaśnięcie sesji: Sesje mogą automatycznie wygasać po ustalonym czasie nieaktywności lub stałym limicie czasowym.
Zalety uwierzytelniania opartego na sesji
- Proste i niezawodne: Zapis sesji zapewnia jasne, scentralizowane źródło, co umożliwia wysoki poziom zaufania i czyni decyzje autoryzacyjne bardziej niezawodnymi.
- Unieważnienie w czasie rzeczywistym: Usuwając lub unieważniając zapis sesji, można szybko cofnąć dostęp użytkownika.
Wady uwierzytelniania opartego na sesji
- Opóźnienia w systemach rozproszonych: Utrzymywanie danych sesji między wieloma serwerami zawsze wymaga synchronizacji magazynu sesji. Wprowadza to dodatkowe opóźnienie, ponieważ serwer musi sprawdzić magazyn sesji za każdym razem, gdy wykonuje się żądanie.
- Wysokie zużycie zasobów: Każda sesja zajmuje zasoby serwera, co wpływa na wydajność w miarę rozwoju bazy użytkowników.
- Ryzyko bezpieczeństwa: Kradzież sesji (poprzez skradzione ciasteczka sesji) może umożliwić nieautoryzowany dostęp do kont użytkowników.
- Ograniczone zastosowanie w API: Uwierzytelnianie oparte na sesji nie jest najlepsze dla aplikacji mobilnych. Przechowuje dane sesji na serwerze, co może zwiększać obciążenie i złożoność przy wielu użytkownikach. Ponadto korzysta z ciasteczek, które trudniej obsługiwać na urządzeniach mobilnych.
Czym jest uwierzytelnianie JWT?
JSON Web Tokens (JWTs) podchodzą do sprawy inaczej, umieszczając wszystkie istotne informacje o użytkowniku bezpośrednio w tokenie, używając obiektu JSON. W przeciwieństwie do metod opartych na sesji, JWT są bezwartościowe, co oznacza, że serwer nie zarządza zapisami 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, umożliwiając weryfikację, czy podpis nie został zmieniony.
Wydawanie JWT
- Klient wysyła dane uwierzytelniające do serwera uwierzytelniającego (uniwersalny dostawca tożsamości jest szczególnie korzystny dla zarządzania dostępem w wielu domenach).
- Po pomyślnym uwierzytelnieniu, serwer generuje JWT, który zawiera nagłówek, ładunek i podpis.
- AuthServer wysyła wydany token do Klienta. Klient przechowuje JWT (np. w ciasteczkach, localStorage lub sessionStorage).
Przepływy pracy oparte na sesji przebiegają w podobny sposób. Jednak po uwierzytelnieniu, informacje o użytkowniku są przechowywane na serwerze w ramach sesji, podczas gdy JWT opierają się na tokenach wysyłanych do klienta do przechowywania i późniejszego użycia.
Walidacja tokenu
- Dla kolejnych żądań API, klient wysyła JWT w nagłówku
Authorization
(Bearer <token>
). - Serwer weryfikuje podpis JWT za pomocą klucza tajnego lub publicznego i sprawdza jego roszczenia (np. wygaśnięcie, wydawcę).
- Jeśli token jest ważny, serwer przyznaje klientowi dostęp do żądanych zasobów.
Uwierzytelnianie oparte na sesji wymaga od serwera zapytania do magazynu sesji, co może być powolne, zwłaszcza jeśli opiera się na zewnętrznych lub scentralizowanych bazach danych. W przeciwieństwie do tego, uwierzytelnianie JWT jest bezwzględne, z wszystkimi niezbędnymi informacjami przechowywanymi w tokenie klienta i wykorzystującymi podpis, aby zapewnić bezpieczeństwo. To eliminuje potrzebę zarządzania sesjami, czyniąc ją szybszą i bardziej skalowalną, zwłaszcza w systemach rozproszonych.
Jak unieważnić JWT?
Po stronie klienta, wylogowanie zazwyczaj oznacza wyczyszczenie lokalnej sesji i usunięcie tokenów (ID, dostępu, odświeżania) z pamięci. Jednak w przypadku uwierzytelniania JWT, to jedynie lokalne wylogowanie użytkownika, pozostawiając scentralizowaną sesję na serwerze autoryzacyjnym nienaruszoną. W rezultacie, użytkownicy mogą nadal mieć 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 bardziej wyzwaniem niż uwierzytelnianie oparte na sesji, ponieważ JWT są stateless i nie mogą być unieważnione po wydaniu, chyba że wdrożone zostaną konkretne strategie. Powszechne metody to:
- Krótkie czasy wygaśnięcia: Ustaw krótki roszczenie
exp
(np. 15 minut) dla JWT. Po wygaśnięciu, użytkownik musi ponownie się uwierzytelnić. To minimalizuje ryzyko w przypadku, gdy token zostanie przejęty, ponieważ atakujący może go używać tylko przez ograniczony czas. Aby zachować płynne doświadczenie użytkownika, można użyć refresh token, aby zminimalizować niedogodności związane z ponownym uwierzytelnianiem. - Czarna lista tokenów: W krytycznych przypadkach (np. wylogowanie użytkownika, zmiany hasła), prowadź czarną listę unieważnionych tokenów. Serwer sprawdza przychodzące tokeny w odniesieniu do tej blokady i odrzuca wszelkie dopasowania. Chociaż jest to skuteczne, podejście to wymaga śledzenia unieważnionych tokenów, co stoi w sprzeczności z naturą bezwartościowych JWT i może stać się nieefektywne, jeśli lista zrobi się zbyt duża.
- Punkt końcowy unieważnienia: Wprowadź punkt końcowy unieważnienia na serwerze autoryzacyjnym, gdzie tokeny (np. tokeny odświeżania) mogą być unieważnione. Gdy token odświeżający zostanie unieważniony, jakiekolwiek tokeny dostępu wydane z jego użyciem nie będą już odnawiane. Ta metoda działa dobrze w przepływach OAuth2.
Zalety uwierzytelniania JWT
- Szybkie i bardziej informacyjne: Samodzielna natura JWT sprawia, że weryfikacja po stronie klienta jest szybsza i bardziej wydajna, bez potrzeby interakcji z serwerem. Mogą także zawierać niestandardowe roszczenia (np. role użytkowników lub inne istotne dane) w tokenie, umożliwiając serwerom określenie ról bez zapytań do bazy danych.
- Zwiększone bezpieczeństwo: JWT używają technik podpisywania i szyfrowania, co utrudnia ataki.
- Wsparcie międzydomenowe: JWT są idealne do Single Sign-On (SSO) i uwierzytelniania międzydomenowego. Pozwalają użytkownikom na uwierzytelnienie się w wielu domenach lub usługach przy użyciu tego samego tokenu.
- Przyjazność dla urządzeń mobilnych: JWT świetnie sprawdzają się w aplikacjach mobilnych, które potrzebują bezwzględnego uwierzytelniania. Tokeny można przechowywać po stronie klienta i wysyłać z każdym żądaniem, zwiększając wydajność i łatwość użycia.
Wady uwierzytelniania JWT
-
JWT nie są aktualizowane w czasie rzeczywistym
Po podpisaniu JWT nie można go unieważnić ani zaktualizować, i będzie uważany za ważny, dopóki podpis jest ważny i nie wygasł.
Jeśli uprawnienia dostępu użytkownika się zmienią (zazwyczaj zostaną zredukowane), użytkownik nadal będzie miał dostęp do zasobów do momentu wygaśnięcia JWT. Podobnie, jeśli JWT zawiera informacje o uprawnieniach opartych na rolach, nowy zakres uprawnień nie wejdzie w życie, dopóki stary JWT nie wygaśnie. Innymi słowy, JWT nie są odpowiednie do unieważniania w czasie rzeczywistym i użytkownicy mogą ustawić odpowiedni czas wygaśnięcia, aby złagodzić ten problem.
-
Dylemat wielu urządzeń i unieważnienia
Nie ma możliwości walidacji wszystkich wystawionych JWT przed ich wygaśnięciem, aby wdrożyć unieważnienie użytkownika 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, że to podejście stanie się niepraktyczne do prostych operacji unieważnienia użytkownika.
Niektóre dostawcy tożsamości mogą mieć gotowe rozwiązania dla tych problemów z JWT. Aby uzyskać więcej informacji, sprawdź „Najlepsze praktyki poprawy doświadczenia uwierzytelniania JWT.”
Jaka jest różnica między JWT a Sesją?
Sesje i JWT to dwa popularne podejścia do utrzymywania kontekstu uwierzytelnienia i autoryzacji w świecie bezstanowego HTTP. Chociaż oba podejścia mają swoje zalety i wady, oferują różne korzyści i ograniczenia.
Sesje zapewniają silniejsze gwarancje indywidualnej autoryzacji żądań i są prostsze do bezpiecznego wdrożenia. Jednak ich zależność od walidacji po stronie serwera w bazie danych wprowadza opóźnienie, które może negatywnie wpływać na doświadczenie użytkownika przy wysoce responsywnych aplikacjach.
Z kolei JWT są korzystne dla szybszej autoryzacji i interoperacyjności z zewnętrznymi aplikacjami, ale wymagają większego wysiłku programisty, aby rozwiązać złożoności związane z bezpieczeństwem. Na przykład, można użyć webhooków, aby powiadamiać klientów, gdy dostęp użytkownika zostaje cofnięty, aby klienci mogli wyczyścić pamięć podręczną JWT i wymusić ponowne uwierzytelnienie użytkownika.
Ponieważ uwierzytelnianie oparte na tokenach jest bardziej odpowiednie do skalowania z niektórymi swoimi zarządzalnymi wadami, jest przyjmowane przez coraz więcej nowoczesnych aplikacji.
Sesja vs. JWT: Wybór właściwej metody
Metoda uwierzytelnienia powinna dostosować się do architektury Twojej aplikacji i specyficznych potrzeb. Oto krótki przewodnik, który pomoże Ci zdecydować:
Kiedy używać uwierzytelniania opartego na sesji
Uwierzytelnianie oparte na sesji działa najlepiej, gdy potrzebujesz kontroli sesji w czasie rzeczywistym, scentralizowanego zarządzania lub skalowalność nie jest głównym problemem. Oto, gdzie się sprawdza:
-
Aplikacje internetowe z utrzymywanymi sesjami
Dla platform takich jak sklepy internetowe, sesje są niezbędne do śledzenia użytkowników, koszyków i preferencji podczas ich wizyty.
-
Aplikacje wymagające kontroli sesji w czasie rzeczywistym
Aplikacje takie jak usługi bankowe lub finansowe korzystają z kontroli dostępu do danych sesji kontrolowanych przez serwer, co zapewnia solidne zarządzanie dostępem i bezpieczeństwo.
-
Systemy z jednym serwerem lub mała skala
Narzędzia wewnętrzne lub aplikacje o małej skali, które nie wymagają dużej skalowalności, rozwijają się na prostym zarządzaniu sesjami dla łatwości użytkowania i niezawodności.
Kiedy używać uwierzytelniania JWT
Uwierzytelnianie JWT jest lepiej dostosowane do aplikacji, które priorytetowo traktują skalowalność, wydajność i systemy rozproszone. Jest szczególnie przydatne do bezwzględnych interakcji między klientami a serwerami. Rozważ uwierzytelnianie oparte na tokenach dla następujących:
-
Single Sign-On (SSO)
JWT idealnie nadaje się do Single Sign-On, umożliwiając użytkownikom jednokrotne uwierzytelnienie i bezproblemowe uzyskiwanie dostępu do wielu usług lub aplikacji za pomocą tego samego tokenu. Podziel się szczegółowym wyjaśnieniem na temat bezpiecznego chmurnego oprogramowania z OAuth 2.0 i OIDC, z formatem JWT zarówno dla tokenów dostępu jak i tokenów ID.
-
Aplikacje mobilne
Aplikacje mobilne często preferują JWT do uwierzytelniania, ponieważ tokeny mogą być bezpiecznie przechowywane na urządzeniu i wysyłane z każdym żądaniem API. Odkryj szybkie połączenie uwierzytelniania JWT dla Android / iOS.
-
Architektury mikrousługowe
W środowiskach mikroserwisów JWT pozwalają każdej usłudze niezależnie weryfikować token bez polegania na centralnym magazynie sesji, zapewniając skalowalność i wydajność.
-
Uwierzytelnianie międzydomenowe
JWT doskonale radzą sobie w scenariuszach obejmujących wiele domen lub subdomen (np.
api.example.com
,dashboard.example.com
, idocs.example.com
). W przeciwieństwie do ciasteczek, JWT umożliwiają uwierzytelnianie między domenami bez dodatkowych zależności. -
API i usługi internetowe
RESTful APIs 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-do-maszyna dla scenariuszy, w których Twoja aplikacja potrzebuje bezpośredniej komunikacji z zasobami.
Najlepsze praktyki poprawiające doświadczenie uwierzytelniania JWT
Uwierzytelnianie JWT jest świetnym narzędziem, ale może wiązać się z wyzwaniami, które wpływają na doświadczenie użytkownika. Logto oferuje proste i niezawodne rozwiązanie do pokonania tych przeszkód, czyniąc go doskonałą opcją dla bezpiecznego i efektywnego uwierzytelniania.
Radzenie sobie z problemami związanymi z wylogowaniem użytkownika z JWT
Jednym z powszechnych problemów z uwierzytelnianiem JWT jest zapewnienie właściwego doświadczenia wylogowania użytkownika. Logto upraszcza ten proces dzięki out-of-the-box SDK.
- Przez czyszczenie tokenów i lokalnych sesji po stronie klienta i przekierowywanie użytkowników do Logto's end session endpoint, łatwo można zakończyć sesje zarówno na aplikacji klienckiej, jak i serwerze.
- Dodatkowo, Logto obsługuje back-channel logout, umożliwiając AuthServer powiadamianie wszystkich aplikacji klienckich dzielących tę samą sesję, gdy użytkownik się wylogowuje.
To zapewnia spójne i bezpieczne zarządzanie sesjami w całym ekosystemie. Dowiedz się więcej o mechanizmach wylogowania i jak wdrożyć wylogowanie.
Radzenie sobie ze zmianami uprawnień użytkownika
Zarządzanie zmianami w czasie rzeczywistym uprawnień użytkowników za pomocą JWT może być również trudne. Ponieważ JWT są bezwartościowe z natury, wszelkie zaktualizowane uprawnienia lub role mogą nie obowiązywać, dopóki token nie wygaśnie. Logto oferuje strategie efektywnego zarządzania tym:
- W przypadku zmniejszenia uprawnień dla tego użytkownika: Użyj krótkich czasów wygaśnięcia tokenu dostępu lub dynamicznie weryfikuj uprawnienia za pomocą wywołania API.
- W przypadku dodawania nowych uprawnień dla tego użytkownika: Zaktualizuj AuthServer, aby uwzględnić nowe uprawnienia w zakresie i ponownie pozyskaj zgodę użytkowników, aby zastosować te zmiany.
Te rozwiązania pomagają utrzymać uprawnienia na bieżąco i zapewniać bezpieczniejszy i bardziej responsywny system. Dowiedz się więcej o zarządzaniu zmianami uprawnień użytkowników w czasie rzeczywistym.
Logto, które jest skalowalną strukturą zarządzania dostępem tożsamością, oferuje kompletne rozwiązanie tożsamościowe z wykorzystaniem zarówno usługi w chmurze, jak i wersji open-source dostępnej.