Token sieciowy JSON — JSON Web Token
| Status | Proponowany standard |
|---|---|
| Opublikowane po raz pierwszy | 28 grudnia 2010 |
| Ostatnia wersja |
RFC 7519 maj 2015 |
| Organizacja | IETF |
| Skrót | JWT |
JSON Web Token ( JWT , wymawiane / dʒ ɒ 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
{
"alg": "HS256",
"typ": "JWT"
}
|
Identyfikuje, który algorytm jest używany do generowania podpisu
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. |
{
"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 ( |
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:
- Nigdy nie pozwól, aby sam nagłówek JWT sterował weryfikacją
- Poznaj algorytmy (unikaj uzależnienia od samego
algpola) - Użyj odpowiedniego rozmiaru klucza
Zobacz też
Bibliografia
Zewnętrzne linki
- RFC 7519
- jwt.io – wyspecjalizowana strona o JWT wraz z narzędziami i dokumentacją, utrzymywana przez Auth0
- Spring Boot JWT Auth – integracja uwierzytelniania JWT z frameworkiem Spring
- JWT Security – JWT Security e-Book PDF (język polski)
- Dlaczego potrzebujemy JWT we współczesnej sieci - szczegółowy artykuł na ten temat z pewnymi rozważaniami historycznymi