Token sieciowy JSON — JSON Web Token

Token sieciowy JSON
Status Proponowany standard
Opublikowane po raz pierwszy 28 grudnia 2010 ( 2010-12-28 )
Ostatnia wersja RFC  7519
maj 2015
Organizacja IETF
Skrót JWT

JSON Web Token ( JWT , wymawiane / ɒ t / , tak samo jak słowo „jot”) to proponowany standard internetowy do tworzenia danych z opcjonalnym podpisem i/lub opcjonalnym szyfrowaniem, którego ładunek przechowuje JSON, który potwierdza pewną liczbę roszczeń . Tokeny są podpisywane przy użyciu prywatnego klucza tajnego lub klucza publicznego/prywatnego .

Na przykład serwer może wygenerować token z oświadczeniem „zalogowany jako administrator” i przekazać go klientowi. Klient może następnie użyć tego tokena, aby udowodnić, że jest zalogowany jako administrator. Tokeny mogą być podpisane kluczem prywatnym jednej ze stron (zwykle serwera), dzięki czemu strona może następnie zweryfikować, czy token jest legalny. Jeśli druga strona, za pomocą odpowiednich i godnych zaufania środków, jest w posiadaniu odpowiedniego klucza publicznego, również jest w stanie zweryfikować legalność tokena. Te tokeny mają być zwarte, URL -safe, używane zwłaszcza w przeglądarki internetowej single-sign-on (SSO) kontekście. Oświadczenia JWT mogą zazwyczaj służyć do przekazywania tożsamości uwierzytelnionych użytkowników między dostawcą tożsamości a dostawcą usług lub dowolnego innego typu oświadczeń wymaganych przez procesy biznesowe.

JWT opiera się na innych standardach opartych na JSON : JSON Web Signature i JSON Web Encryption .

Struktura

nagłówek
{
  "alg": "HS256",
  "typ": "JWT"
}
Identyfikuje, który algorytm jest używany do generowania podpisu

HS256 wskazuje, że ten token jest podpisany przy użyciu HMAC-SHA256.

Typowe stosowane algorytmy kryptograficzne to HMAC z SHA-256 (HS256) i podpis RSA z SHA-256 (RS256). JWA (JSON Web Algorithms) RFC 7518 wprowadza o wiele więcej, zarówno dla uwierzytelniania, jak i szyfrowania.

Ładunek
{
  "loggedInAs": "admin",
  "iat": 1422779638
}
Zawiera zestaw oświadczeń. Specyfikacja JWT definiuje siedem Zarejestrowanych Nazw Oświadczeń, które są standardowymi polami zwykle zawartymi w tokenach. Oświadczenia niestandardowe są zwykle również uwzględniane, w zależności od przeznaczenia tokenu.

Ten przykład zawiera standardowe roszczenie Wydane w czasie ( iat) oraz roszczenie niestandardowe ( loggedInAs).

Podpis
HMAC_SHA256(
  secret,
  base64urlEncoding(header) + '.' +
  base64urlEncoding(payload)
)
Bezpiecznie weryfikuje token. Sygnatura jest obliczana przez zakodowanie nagłówka i ładunku przy użyciu Base64url Encoding RFC  4648 i połączenie ich razem z separatorem kropek . Ten ciąg jest następnie uruchamiany przez algorytm kryptograficzny określony w nagłówku, w tym przypadku HMAC-SHA256. Base64url Kodowanie jest podobna do base64 , ale używa różnych znaków innych niż alfanumeryczne i pomija wyściółkę.

Te trzy części są zakodowane oddzielnie przy użyciu Base64url Encoding RFC  4648 i połączone przy użyciu kropek w celu utworzenia tokena JWT:

const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature)

Powyższe dane oraz sekret „secretkey” tworzą token:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8ZynFmSrNjCpyW

Ten wynikowy token można łatwo przekazać do HTML i HTTP .

Posługiwać się

Podczas uwierzytelniania, gdy użytkownik pomyślnie zaloguje się przy użyciu swoich poświadczeń, zostanie zwrócony token sieciowy JSON, który musi zostać zapisany lokalnie (zwykle w magazynie lokalnym lub sesyjnym , ale można również używać plików cookie ), zamiast tradycyjnego podejścia polegającego na tworzeniu sesji na serwerze i zwrócenie pliku cookie. W przypadku procesów nienadzorowanych klient może również uwierzytelnić się bezpośrednio, generując i podpisując własny token JWT za pomocą wstępnie udostępnionego klucza tajnego i przesyłając go do usługi zgodnej z OAuth , na przykład:

POST /oauth2/token?
Content-type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=eyJhb...

Jeśli klient przejdzie poprawną asercję JWT, serwer wygeneruje access_token ważny do wykonywania wywołań do aplikacji i przekaże go z powrotem do klienta:

{
  "access_token": "eyJhb...",
  "token_type": "Bearer",
  "expires_in": 3600
}

Gdy klient chce uzyskać dostęp do chronionej trasy lub zasobu, agent użytkownika powinien wysłać token JWT, zwykle w Authorizationnagłówku przy użyciu Bearerschematu. Treść nagłówka może wyglądać tak:

Authorization: Bearer eyJhbGci...<snip>...yu5CSpyHI

Jest to mechanizm uwierzytelniania bezstanowego, ponieważ stan użytkownika nigdy nie jest zapisywany w pamięci serwera. Chronione trasy serwera będą sprawdzać, czy w nagłówku Authorization znajduje się prawidłowy token JWT, a jeśli jest obecny, użytkownik będzie mógł uzyskać dostęp do chronionych zasobów. Ponieważ tokeny JWT są samowystarczalne, dostępne są wszystkie niezbędne informacje, co zmniejsza potrzebę wielokrotnego wykonywania zapytań do bazy danych.

Pola standardowe

kod Nazwa opis
Standardowe pola roszczenia Internetowe wersje robocze definiują następujące standardowe pola („oświadczenia”), których można używać w zestawie oświadczeń JWT.
iss Emitent Identyfikuje zleceniodawcę, który wystawił token JWT.
sub Podmiot Identyfikuje podmiot JWT.
aud Publiczność Identyfikuje odbiorców, dla których przeznaczony jest token JWT. Każdy podmiot główny, który ma przetworzyć token JWT, musi identyfikować się z wartością w oświadczeniu odbiorców. Jeśli zleceniodawca przetwarzający roszczenie nie identyfikuje się z wartością w audroszczeniu, gdy to roszczenie jest obecne, wówczas token JWT musi zostać odrzucony.
exp Data ważności Określa czas wygaśnięcia, w którym i po którym token JWT nie może zostać przyjęty do przetwarzania. Wartość musi być NumericDate: liczbą całkowitą lub dziesiętną, reprezentującą sekundy po 1970-01-01 00:00:00Z .
nbf Nie przed Określa czas, w którym token JWT zacznie być przyjmowany do przetwarzania. Wartość musi być NumericDate.
iat Wydana w Określa czas wystawienia tokena JWT. Wartość musi być NumericDate.
jti Identyfikator JWT Unikalny identyfikator tokena z rozróżnianiem wielkości liter, nawet wśród różnych wydawców.
Często używane pola nagłówka Następujące pola są powszechnie używane w nagłówku JWT
typ Typ tokena Jeśli jest obecny, zaleca się ustawienie tego na JWT.
cty Typ zawartości Jeśli używane jest zagnieżdżone podpisywanie lub szyfrowanie, zaleca się ustawienie tej opcji na JWT; w przeciwnym razie pomiń to pole.
alg Algorytm kodu uwierzytelniania wiadomości Wystawca może dowolnie ustawić algorytm weryfikacji podpisu na tokenie. Jednak niektóre obsługiwane algorytmy są niepewne.
kid Identyfikator klucza Wskazówka wskazująca klucz, którego klient użył do wygenerowania podpisu tokena. Serwer dopasuje tę wartość do klucza w pliku, aby sprawdzić, czy podpis jest ważny, a token jest autentyczny.
x5c x.509 Łańcuch certyfikatów Łańcuch certyfikatów w formacie RFC4945 odpowiadający kluczowi prywatnemu użytemu do wygenerowania podpisu tokena. Serwer użyje tych informacji do sprawdzenia, czy podpis jest ważny, a token jest autentyczny.
x5u URL łańcucha certyfikatów x.509 Adres URL, pod którym serwer może pobrać łańcuch certyfikatów odpowiadający kluczowi prywatnemu użytemu do wygenerowania podpisu tokena. Serwer pobierze i użyje tych informacji, aby sprawdzić, czy podpis jest autentyczny.
crit Krytyczny Lista nagłówków, które muszą zostać zrozumiane przez serwer, aby zaakceptować token jako ważny
kod Nazwa opis

Realizacje

Implementacje JWT istnieją dla wielu języków i frameworków, w tym między innymi:

Luki

Tokeny internetowe JSON mogą zawierać stan sesji. Ale jeśli wymagania projektu zezwalają na unieważnianie sesji przed wygaśnięciem znacznika JWT, usługi nie mogą już ufać potwierdzeniom tokenu przez sam token. Aby sprawdzić, czy sesja przechowywana w tokenie nie została odwołana, należy sprawdzić asercje tokenu względem magazynu danych . To sprawia, że ​​tokeny nie są już bezstanowe, co podważa podstawową zaletę tokenów JWT.

Konsultant ds. bezpieczeństwa Tim McLean zgłosił luki w niektórych bibliotekach JWT, które wykorzystywały algpole do nieprawidłowego sprawdzania poprawności tokenów, najczęściej poprzez akceptację alg=nonetokena. Chociaż te luki zostały załatane, McLean zasugerował algcałkowite wycofanie tej dziedziny, aby zapobiec podobnym zamieszaniom w implementacji. Mimo alg=noneto na wolności wciąż znajdują się nowe luki w zabezpieczeniach, a przyczyną tego są cztery CVE złożone w okresie 2018-2021.

Przy odpowiednim projekcie programiści mogą wyeliminować luki w algorytmach, podejmując środki ostrożności:

  1. Nigdy nie pozwól, aby sam nagłówek JWT sterował weryfikacją
  2. Poznaj algorytmy (unikaj uzależnienia od samego algpola)
  3. Użyj odpowiedniego rozmiaru klucza

Zobacz też

Bibliografia

Zewnętrzne linki