• auth
  • authentication
  • oauth
  • oidc
  • identity

Dlaczego JWT w większości usług OAuth 2.0

Ten artykuł wyjaśnia, dlaczego JWT jest szeroko stosowany jako format tokenów dostępu w OAuth 2.0, podkreślając jego zalety i ograniczenia.

Yijun
Yijun
Developer

OAuth 2.0 jest dziś powszechnie używany. Jako podstawowy framework dla usług autoryzacyjnych, jednym z głównych zadań OAuth 2.0 jest wydawanie tokenów dostępu dla użytkowników. Zauważyliśmy, że wielu dostawców usług OAuth na rynku wydaje tokeny dostępu w formacie JWT.

W tym artykule przedstawimy, czym jest JWT i dlaczego jest szeroko stosowany jako format tokenów dostępu wydawanych przez OAuth 2.0.

Wprowadzenie do JWT

JWT oznacza JSON Web Token i jest zdefiniowany przez RFC 7519 w następujący sposób:

JSON Web Token (JWT) jest kompaktowym, bezpiecznym dla URL-ów środkiem do reprezentowania roszczeń przenoszonych między dwiema stronami.

Definicja ta jasno wskazuje, że JWT jest tokenem używanym do przekazywania roszczeń między różnymi stronami.

Ponieważ JWT są przekazywane między wieloma stronami, są podpisane, aby zapewnić integralność i autentyczność danych.

Podpisany JWT ma następujący format:

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

Oto przykład rzeczywistego JWT:

Możesz spróbować go parsować na stronie https://jwt.io:

Dekodowanie JWT na jwt.io

Jak pokazano na obrazku, sekcja header JWT zawiera informacje o użytym algorytmie podpisującym oraz typie tokenu. Sekcja payload zawiera roszczenia przenoszone przez JWT, a signature służy do weryfikacji integralności JWT.

Skoro już wiemy, czym jest JWT i jakie znaczenie mają jego różne części, wyjaśnijmy, dlaczego wiele usług autoryzacyjnych OAuth wybiera JWT jako swój token dostępu.

Zalety korzystania z JWT

Kluczowe różnice między JWT a tradycyjnymi, losowo generowanymi tokenami opartymi na ciągach znaków polegają na tym, że JWT mogą przenosić informacje i mogą być weryfikowane przez dekodowanie. Te różnice przynoszą dwie znaczące zalety:

  • Efektywność zasobów: JWT mogą przenosić informacje o użytkowniku lub sesji, eliminując potrzebę częstych zapytań do bazy danych. Ta efektywność może zmniejszyć zużycie zasobów usług.
  • Poprawiona dostępność i skalowalność: JWT zmniejszają zależność od zarządzania stanem po stronie serwera. Dzięki temu usługi mogą być bardziej bezstanowe, co zwiększa ich dostępność i skalowalność.

Podczas korzystania z tradycyjnych tokenów opartych na losowych ciągach, typowy proces weryfikacji i uwierzytelniania wygląda następująco:

Jak pokazano na diagramie, gdy system ma wielu użytkowników i wiele różnych Serwerów Zasobów, może to prowadzić do licznych żądań weryfikacji tokenu do Serwera Autoryzacji.

Z czasem, gdy system się rozwija, Serwer Autoryzacji może łatwo stać się wąskim gardłem, stanowiąc wyzwanie dla ogólnej dostępności usługi.

Jednak kiedy wprowadzane są JWT, proces weryfikacji zmienia się na:

Dzięki funkcji JWT umożliwiającej weryfikację poprzez dekodowanie, Serwer Zasobów może zweryfikować integralność JWT i wydobyć z nich informacje o użytkowniku bez potrzeby interakcji z Serwerem Autoryzacji (Szczegóły na temat dekodowania i weryfikacji JWT można znaleźć w dokumentacji Logto).

Ograniczenia JWT

Chociaż JWT oferują znaczne korzyści w nowoczesnych architekturach oprogramowania, mają również ograniczenia, które należy wziąć pod uwagę.

Łatwo wyśledzona zawartość ładunku

Jak wspomniano wcześniej, JWT składa się z trzech części: header, payload, i signature. Jak te komponenty są generowane? Weźmy dla przykładu JWT z poprzedniego przykładu i zademonstrujmy proces generowania JWT:

Jak pokazano w powyższym kodzie, nagłówek i ładunek JWT są po prostu zakodowane jako ciągi base64.

Oznacza to, że ktoś, kto ma dostęp do tokenu, może łatwo dekodować ciąg base64 ładunku JWT i uzyskać dostęp do przenoszonych przez niego informacji. Z drugiej strony, stosunkowo łatwo jest sfałszować ładunek i zastąpić oryginalny ładunek JWT zmanipulowaną wersją.

Chociaż prawdą jest, że ładunek JWT można względnie łatwo sfałszować, należy zauważyć, że część podpisu JWT nie może być zastąpiona sfałszowaną treścią, ponieważ wymaga klucza podpisującego. Dlatego bez poprawnego podpisu JWT nie może przejść walidacji.

Dlatego podczas korzystania z JWT ważne jest, aby pamiętać o następujących kwestiach:

  1. Zawsze używaj SSL: Aby upewnić się, że informacje JWT nie zostaną ujawnione podczas transmisji, konieczne jest użycie SSL (Secure Sockets Layer) lub jego następcy, TLS (Transport Layer Security), aby zaszyfrować dane w tranzycie.
  2. Unikaj przechowywania danych wrażliwych: Nie zaleca się przechowywania danych wrażliwych w ładunku JWT. Jak wspomniano wcześniej, ładunek można łatwo dekodować i powinien on zawierać głównie niewrażliwe, odpowiednie roszczenia.
  3. Weryfikuj JWT: Przed poleganiem na informacjach zawartych w JWT, upewnij się, że przeszło ono ważny i bezpieczny proces weryfikacji, w tym weryfikację podpisu i sprawdzenie wygaśnięcia tokenu. Pomaga to zapobiegać używaniu zmanipulowanych lub nieautoryzowanych tokenów.

Trudności z unieważnianiem

Zazwyczaj tokeny dostępu mają czas wygaśnięcia. Jeśli token dostępu jest reprezentowany jako losowe ciągi bez żadnych informacji, możemy sprawdzić, czy token został unieważniony podczas każdej weryfikacji na Serwerze Autoryzacji.

Jeśli chodzi o JWT, ze względu na to, że JWT zawierają w sobie informacje o wygaśnięciu i fakt, że weryfikacja JWT nie polega na Serwerze Autoryzacji, raz wydany przez Serwer Autoryzacji token dostępu w formacie JWT staje się niemożliwe do zmiany jego stanu podczas użytkowania.

Po naturalnym wygaśnięciu tokenu JWT możemy uzyskać nowy JWT z serwera autoryzacji za pomocą tokenu odświeżającego (możesz odnieść się do bloga Logto w celu uzyskania informacji o tokenach odświeżających).

Jednak w pewnych sytuacjach, takich jak cofnięcie autoryzacji przez użytkownika lub zmiana hasła, i konieczność unieważnienia już wydanego, ale jeszcze nie wygasłego tokenu, nie ma dostępnego prostego rozwiązania.

Istnieją dwa powszechne podejścia do łagodzenia skutków unieważniania tokenu w połowie:

  1. Ustal krótszy czas wygaśnięcia dla tokenu dostępu i polegaj na mechanizmie odświeżania tokenu, aby szybko odświeżyć status tokenu.

Ponieważ token dostępu ma krótszy czas wygaśnięcia, gdy użytkownik odkryje, że token dostępu wygasł, może poprosić o nowy token dostępu za pomocą tokenu odświeżającego z usługi autoryzacji. Dzięki temu status tokenu po stronie użytkownika może się synchronizować z backendem tak szybko, jak to możliwe. Jednak podejście to wiąże się z dodatkowymi nakładami, które użytkownicy muszą wziąć pod uwagę.

  1. Utrzymuj listę unieważnień dla tokenów dostępu i sprawdzaj, czy token znajduje się na liście podczas każdej weryfikacji.

Metoda ta ma pewne ograniczenia. Jedną z zalet JWT jest to, że nie wymagają one przechowywania informacji o stanie na serwerze, a JWT są zazwyczaj bezstanowe. Jednak utrzymywanie listy unieważnień wymaga efektywnego przechowywania i konserwacji, polegając na dodatkowych mechanizmach przechowywania. To zasadniczo poświęca zalety JWT i potencjalnie prowadzi do problemów z wydajnością. Dlatego mechanizm unieważniania tokenów musi być wdrożony przez deweloperów w sposób odpowiedni dla ich konkretnego przypadku użycia.

Podsumowanie

W tym artykule przedstawiliśmy krótkie wprowadzenie do JWT, podkreślając jego zalety i ograniczenia. Teraz powinieneś mieć głębsze zrozumienie JWT i scenariuszy, w których jest on powszechnie używany. Chociaż JWT ma swoje wyzwania, korzyści z jego użycia jako formatu tokenu w usługach OAuth 2.0 znacznie przewyższają jego wady.

Logto, jako szybko rozwijająca się usługa uwierzytelniania tożsamości, również wykorzystuje JWT jako format swoich tokenów dostępowych. Ściśle przestrzega różnych protokołów autoryzacji i uwierzytelniania, co czyni go wyjątkowo łatwym do zintegrowania usługą uwierzytelniania tożsamości w twoich produktach. Logto oficjalnie uruchomił swoją usługę SaaS, i możesz wypróbować ją za darmo już dziś.