Token internetowy JSON
Skrót | JWT |
---|---|
Status | Proponowany standard |
Opublikowane po raz pierwszy | 28 grudnia 2010 |
Ostatnia wersja |
RFC 7519 maj 2015 r |
Organizacja | IETF |
Komisja | IEGS |
Autorski |
|
Normy bazowe |
|
Domena | Wymiana danych |
Strona internetowa |
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 zawiera JSON potwierdzający pewną liczbę roszczeń . Tokeny są podpisywane przy użyciu klucza prywatnego lub klucza publicznego/prywatnego .
Na przykład serwer może wygenerować token z żądaniem „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), aby każda strona mogła później zweryfikować, czy token jest legalny. Jeśli druga strona, za pomocą odpowiednich i godnych zaufania środków, jest w posiadaniu odpowiedniego klucza publicznego, ona również jest w stanie zweryfikować legalność tokena. Tokeny , aby były kompaktowe, bezpieczne dla adresów URL i użyteczne zwłaszcza w kontekst pojedynczego logowania (SSO) w przeglądarce internetowej . 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
- Określa, 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) oraz podpis RSA z SHA-256 (RS256). JWA (JSON Web Algorithms) RFC 7518 wprowadza znacznie więcej zarówno do uwierzytelniania, jak i szyfrowania.
{ "alg" : "HS256" , "typ" : "JWT" }
- Ładunek
- Zawiera zestaw roszczeń. Specyfikacja JWT definiuje siedem zarejestrowanych nazw roszczeń, które są standardowe pola powszechnie zawarte w tokenach. W zależności od celu tokena zwykle uwzględniane są również oświadczenia niestandardowe.
- Ten przykład ma standardowe oświadczenie wystawione w czasie (
iat
) i oświadczenie niestandardowe (zalogowane
). { "loggedInAs" : "admin" , "iat" : 1422779638 }
- Podpis
- Bezpiecznie sprawdza poprawność tokena. Podpis jest obliczany przez kodowanie nagłówka i ładunku przy użyciu Base64url Encoding RFC 4648 i połączenie tych dwóch razem z separatorem okresu. Ciąg ten jest następnie przepuszczany przez algorytm kryptograficzny określony w nagłówku. W tym przykładzie zastosowano algorytm HMAC-SHA256 ze wspólnym kluczem tajnym (zdefiniowano również algorytmy klucza publicznego). Kodowanie Base64url jest podobne do base64 , ale wykorzystuje inne znaki niealfanumeryczne i pomija dopełnienie.
HMAC_SHA256 ( tajne , base64urlEncoding ( nagłówek ) + '.' + base64urlEncoding ( ładunek ) )
Te trzy części są kodowane oddzielnie przy użyciu kodowania Base64url RFC 4648 i łączone przy użyciu kropek w celu utworzenia JWT:
const token = base64urlEncoding ( nagłówek ) + '.' + base64urlEncoding ( ładunek ) + '.' + base64urlEncoding ( podpis )
Powyższe dane oraz sekret "secretkey" tworzą token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
Wynikowy token można łatwo przekazać do HTML i HTTP .
Używać
Podczas uwierzytelniania, gdy użytkownik pomyślnie zaloguje się przy użyciu swoich poświadczeń, token JSON Web Token zostanie zwrócony i musi zostać zapisany lokalnie (zwykle w pamięci lokalnej lub w pamięci sesji , ale można również użyć 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ą współdzielonego klucza tajnego i przekazując go do usługi OAuth w następujący sposób:
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 przekaże prawidłową asercję JWT, serwer wygeneruje token dostępu 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 nagłówku HTTP autoryzacji
przy użyciu schematu okaziciela
. Zawartość nagłówka może wyglądać następująco:
Autoryzacja: posiadacz eyJhbGci ...<snip>... yu5CSpyHI
Jest to mechanizm uwierzytelniania bezstanowego, ponieważ stan użytkownika nigdy nie jest zapisywany w pamięci serwera. Chronione trasy serwera sprawdzą, czy w nagłówku autoryzacji znajduje się prawidłowy token JWT, a jeśli jest on obecny, użytkownik uzyska dostęp do chronionych zasobów. Ponieważ tokeny JWT są samowystarczalne, dostępne są wszystkie niezbędne informacje, co zmniejsza potrzebę wielokrotnego wysyłania zapytań do bazy danych.
Standardowe pola
Kod | Nazwa | Opis |
---|---|---|
Standardowe pola roszczeń | Internetowe wersje robocze definiują następujące standardowe pola („oświadczenia”), których można użyć w zestawie oświadczeń JWT. | |
jest
|
Emitent | Identyfikuje podmiot, który wystawił token JWT. |
pod
|
Temat | Identyfikuje temat JWT. |
dźwięk
|
Publiczność | Identyfikuje odbiorców, dla których jest przeznaczony token JWT. Każdy zleceniodawca, który ma przetworzyć token JWT, musi identyfikować się z wartością w żądaniu odbiorców. Jeśli podmiot przetwarzający roszczenie nie identyfikuje się z wartością w aud , gdy to roszczenie jest obecne, JWT musi zostać odrzucony. |
do potęgi
|
Data ważności | Określa czas wygaśnięcia, po którym token JWT nie może zostać zaakceptowany do przetwarzania. Wartość musi być typu 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ć akceptowany do przetwarzania. Wartość musi być typu NumericDate. |
iat
|
Wydana w | Identyfikuje czas wystawienia tokenu JWT. Wartość musi być typu NumericDate. |
jti
|
Identyfikator JWT | Unikalny identyfikator tokena uwzględniający wielkość liter, nawet wśród różnych emitentów. |
Często używane pola nagłówka | Następujące pola są często używane w nagłówku JWT | |
typ
|
Typ tokena | Jeśli jest obecny, musi być ustawiony na zarejestrowany typ nośnika IANA . |
cty
|
Typ zawartości | Jeśli używane jest zagnieżdżone podpisywanie lub szyfrowanie, zaleca się ustawienie JWT ; w przeciwnym razie pomiń to pole. |
alg
|
Algorytm kodu uwierzytelniającego wiadomość | Wystawca może dowolnie ustawić algorytm weryfikacji podpisu na tokenie. Jednak niektóre obsługiwane algorytmy są niepewne. |
dziecko
|
Identyfikator klucza | Wskazówka wskazująca, którego klucza użył klient do wygenerowania podpisu tokenu. Serwer dopasuje tę wartość do klucza w pliku, aby zweryfikować, 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żywanemu do generowania podpisu tokena. Serwer użyje tych informacji do sprawdzenia, czy podpis jest ważny, a token jest autentyczny. |
x5u
|
Adres 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 do zweryfikowania autentyczności podpisu. |
krytykować
|
Krytyczny | Lista nagłówków, które serwer musi zrozumieć, aby zaakceptować token jako ważny |
Kod | Nazwa | Opis |
Implementacje
Implementacje JWT istnieją dla wielu języków i platform, w tym między innymi:
Luki w zabezpieczeniach
Tokeny internetowe JSON mogą zawierać stan sesji. Ale jeśli wymagania projektu zezwalają na unieważnienie sesji przed wygaśnięciem tokena JWT, usługi nie mogą już ufać potwierdzeniom tokena na podstawie samego tokena. Aby zweryfikować, czy sesja przechowywana w tokenie nie została odwołana, potwierdzenia tokenu muszą zostać porównane z magazynem danych . To sprawia, że tokeny nie są już bezstanowe, co podważa podstawową zaletę JWT.
Konsultant ds. bezpieczeństwa Tim McLean zgłosił luki w zabezpieczeniach niektórych bibliotek JWT, które używały pola alg
do nieprawidłowego sprawdzania poprawności tokenów, najczęściej poprzez akceptację tokena alg=none
. Chociaż te luki zostały załatane, McLean zasugerował całkowite wycofanie alg
, aby zapobiec podobnym zamieszaniu w implementacji. Mimo to nadal wykrywane są nowe luki alg=none , a cztery
CVE zgłoszone w latach 2018-2021 miały tę przyczynę.
Dzięki odpowiedniemu projektowi programiści mogą wyeliminować luki w zabezpieczeniach algorytmu, podejmując środki ostrożności:
- Nigdy nie pozwól, aby sam nagłówek JWT kierował weryfikacją
- Znajomość algorytmów (unikaj zależności od samego pola
alg
) - Użyj odpowiedniego rozmiaru klucza
Zobacz też
- Klucz API
- Token dostępu
- Podstawowe uwierzytelnianie dostępu
- Uwierzytelnianie dostępu szyfrowanego
- Tożsamość oparta na oświadczeniach
- Nagłówek HTTP
- JÓZ
- Zwięzła binarna reprezentacja obiektów ( CBOR )