Co to są tokeny internetowe JSON (JWT)? Dlaczego interfejsy API ich używają?

Co to są tokeny internetowe JSON (JWT)? Dlaczego interfejsy API ich używają?

Standard JSON Web Tokens (JWT) opisuje kompaktową metodę weryfikowalnego transferu danych. Każdy token zawiera podpis, który umożliwia stronie wydającej weryfikację integralności wiadomości.

W tym artykule dowiesz się, co zawiera framework JWT i jak możesz tworzyć własne tokeny niestandardowe. JWT to popularny sposób zabezpieczania interfejsów API i uwierzytelniania sesji użytkowników, ponieważ są one proste i samodzielne.

Jak działają JWT

Jednym z najczęstszych zadań w każdym interfejsie API jest weryfikacja, czy użytkownicy są tym, za kogo się podają. Uwierzytelnianie jest zwykle wykonywane, gdy klient dołącza klucz API do żądań wysyłanych do serwera. Klucz zawiera osadzone informacje, które identyfikują użytkownika. To wciąż pozostawia jedno duże pytanie: w jaki sposób serwer może zweryfikować, czy w ogóle wydał klucz?

JWTs wygodnie rozwiązują ten problem, używając klucza tajnego do podpisywania każdego tokena. Serwer może zweryfikować ważność tokena, próbując ponownie obliczyć złożony podpis przy użyciu jego prywatnego tajnego. Wszelkie zakłócenia spowodują niepowodzenie sprawdzenia.

Format JWT

JWT składają się z trzech oddzielnych komponentów:

  • Nagłówek — zawiera metadane dotyczące samego tokena, takie jak używany algorytm podpisu.
  • Ładunek — Ładunek tokena może być dowolnymi danymi związanymi z twoim systemem. Może zawierać identyfikator użytkownika i listę funkcji, z którymi użytkownik może wchodzić w interakcje.
  • Podpis – Podpis umożliwia w przyszłości weryfikację integralności tokena. Jest tworzony przez podpisanie nagłówka i ładunku przy użyciu tajnej wartości znanej tylko serwerowi.

Te trzy elementy są połączone kropkami, aby uzyskać token JWT:

header.payload.signature

Każda część jest zakodowana przy użyciu Base-64. Pełny token to ciąg tekstu, który można łatwo wykorzystać w środowiskach programistycznych i wysłać z żądaniami HTTP.

Utwórz token JWT

Kroki tworzenia tokena JWT można zaimplementować we wszystkich językach programowania. Ten przykład używa PHP, ale proces będzie podobny w twoim systemie.

Zacznij od stworzenia nagłówka. Zwykle obejmuje to dwa pola algi typ:

  • alg– Algorytm haszujący, który zostanie użyty do stworzenia podpisu. Zwykle jest to HMAC SHA256 ( HS256).
  • typ– Rodzaj wygenerowanego tokena. Powinno być JWT.

Oto JSON definiujący nagłówek:

Nagłówek JSON musi być zakodowany w Base64 w następujący sposób:

Następnie zdefiniuj ładunek tokena jako inny obiekt JSON. To zależy od aplikacji. Przykład zawiera informacje o koncie uwierzytelnionego użytkownika, a także informacje o samym tokenie. expi iatnbfpolami używanymi przez konwencję do określania czasu wygaśnięcia tokenu wystawionego w czasie i unieważnionego przed (początkowym) czasem. Ładunek musi być również zakodowany w Base64.

Pozostaje tylko stworzyć podpis. Aby to stworzyć, najpierw połącz nagłówek i ładunek w jeden ciąg znaków oddzielonych znakami .:

Następnie należy wygenerować unikalny klucz tajny, który będzie używany jako klucz podpisywania. Sekret musi być bezpiecznie przechowywany na serwerze i nigdy nie może być wysyłany do klientów. Ujawnienie tej wartości umożliwi każdemu tworzenie prawidłowych tokenów.

Proces kończy się przy użyciu klucza tajnego do podpisania połączonego nagłówka i ciągu ładunku przy użyciu algorytmu skrótu określonego w nagłówku. Sygnatura wyjściowa musi być zakodowana w Base64, podobnie jak inne składniki.

Masz teraz tytuł, ładunek i podpis jako oddzielne komponenty tekstowe. Połącz je wszystkie razem z .ogranicznikami, aby utworzyć token JWT do wysłania do klienta:

Walidacja przychodzących JWT

Aplikacja kliencka może określić funkcje dostępne dla użytkownika, dekodując ładunek tokena. Oto przykład JavaScript:

Osoba atakująca może zrozumieć, że te dane są zwykłym tekstem i wyglądają na łatwe do zmodyfikowania. Mogą spróbować przekonać serwer, że mają funkcję bonusową, zmieniając ładunek tokena w swoim następnym żądaniu:

Odpowiedź na pytanie, w jaki sposób serwer broni się przed tymi atakami, leży w metodzie użytej do wygenerowania podpisu. Wartość podpisu uwzględnia nagłówek i ładunek tokena. Zmiana ładunku, jak w tym przykładzie, oznacza, że ​​podpis nie jest już ważny.

Kod serwera sprawdza poprawność przychodzących tokenów JWT przez ponowne obliczenie ich podpisów. Token został sfałszowany, jeśli podpis wysłany przez klienta nie zgadza się z wartością wygenerowaną na serwerze.

Atakujący nie może wygenerować ważnego tokena bez dostępu do sekretu serwera. Oznacza to również, że przypadkowa utrata – lub celowa rotacja – sekretu spowoduje natychmiastowe unieważnienie wszystkich wcześniej wydanych tokenów.

W rzeczywistej sytuacji kod uwierzytelniający musi również sprawdzić wygaśnięcie i znaczniki czasu „nie wcześniej” w ładunku tokena. Służą do określenia, czy sesja użytkownika jest ważna.

Kiedy używać JWT

JWT są często używane do uwierzytelniania API, ponieważ są łatwe do wdrożenia na serwerze, łatwe w użyciu na kliencie i łatwe do przesyłania między granicami sieci. Pomimo swojej prostoty mają dobre zabezpieczenia, ponieważ każdy token jest podpisany przy użyciu klucza prywatnego serwera.

JWT jest mechanizmem bezstanowym, więc nie musisz rejestrować informacji o wystawionych tokenach na swoim serwerze. Informacje o kliencie reprezentującym token JWT można uzyskać z ładunku tokenu zamiast wyszukiwania w bazie danych. Tej informacji można zaufać po zweryfikowaniu podpisu tokena.

Korzystanie z JWT jest dobrym wyborem, gdy musisz wymieniać informacje między dwiema stronami bez ryzyka ingerencji. Istnieją jednak słabe punkty, o których należy pamiętać: cały system zostanie naruszony, jeśli klucz prywatny serwera zostanie ujawniony lub kod weryfikacyjny podpisu jest błędny. Z tego powodu wielu programistów woli używać biblioteki open source do implementacji generowania i sprawdzania poprawności JWT. Opcje są dostępne dla wszystkich popularnych języków programowania. Eliminują ryzyko przeoczenia podczas samodzielnej weryfikacji tokenów.

Streszczenie

Standard JWT to format wymiany danych, który obejmuje wbudowane sprawdzanie integralności. JWT są powszechnie używane do zabezpieczania komunikacji między serwerami API a aplikacjami klienckimi. Serwer może ufać tokenom przychodzącym, jeśli może odtworzyć ich podpisy. Pozwala to na bezpieczne wykonywanie akcji z wykorzystaniem informacji uzyskanych z ładunku tokena.

JWT są wygodne, ale mają pewne wady. Zakodowana w Base64 tekstowa reprezentacja tokenu JWT może szybko stać się duża, jeśli masz więcej niż kilka pól ładunku. Może to stać się niedopuszczalnym obciążeniem, gdy klient musi wysłać token JWT z każdym żądaniem.

Bezpaństwowość tokenów JWT jest również kolejną potencjalną wadą: raz wystawione tokeny są niezmienne i muszą być używane bez zmian aż do wygaśnięcia. Klienci, którzy używają ładunków JWT do określania uprawnień użytkownika lub licencjonowanych funkcji, będą musieli otrzymać nowy token z zaplecza po każdej zmianie ich przypisania.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *