JSON Web Token
JSON Web Token, JWT – otwarty standard przemysłowy, definiujący sposób wymiany danych komputerowych między określonymi stronami za pośrednictwem dokumentów JSON. Został zaproponowany w maju 2015 przez stowarzyszenie IETF w dokumencie RFC 7519 ↓. Na jego główne zastosowania wskazano proces uwierzytelniania użytkownika oraz bezpiecznej wymiany informacji[1].
Struktura tokenu[2]
[edytuj | edytuj kod]Tokeny JWT tworzone są z trzech niezależnych części składowych oddzielanych znakiem kropki:
nagłówek.ładunek.podpis
Zawartości poszczególnych części w tokenie są kodowane według standardu RFC 4648 ↓ (Base64Url), które posłużą do utworzenia właściwego tokenu.
Nagłówek
[edytuj | edytuj kod]Nagłówek jest osobnym dokumentem JSON, informującym o typie przekazywanego tokenu (pole typ
, w tym przypadku: JWT) oraz o zastosowanym algorytmie szyfrowania asymetrycznego (pole alg
), takimi jak HMAC, RSA czy ECDSA.
Na przykład, dla tokenu typu JWT, szyfrowanego algorytmem HMAC-SHA256, nagłówek będzie zawierał poniższy dokument:
{
"alg": "HS256",
"typ": "JWT"
}
Ładunek
[edytuj | edytuj kod]Główną częścią JWT jest przekazywany ładunek (tzw. payload). W postaci dokumentu JSON dostarcza dane, które jedna ze stron chce przekazać.
Przykładowo, przekazując dane sesji określonego zalogowanego użytkownika, zawierające jego identyfikator logowania oraz uprawnienia w witrynie internetowej, mogłyby wyglądać następująco:
{
"login": "John_Doe",
"isAdmin": true
}
Sygnatura
[edytuj | edytuj kod]Sygnatura (nazywana również podpisem) jest używany do weryfikacji autentyczności utworzonego tokenu JWT. Jest tworzony i szyfrowany wybranym algorytmem na podstawie zakodowanego nagłówka i ładunku tokenu z opcjonalnym kluczem szyfrowania.
Użycie
[edytuj | edytuj kod]Podczas procesu autoryzacji użytkownika z użyciem JWT, przy poprawnym jego zalogowaniu jest zwracany wygenerowany token, który zostaje przechowany w danych lokalnych przeglądarki internetowej – na przykład w pamięci lokalnej, pamięci sesji lub pliku cookie, zamiast klasycznego przechowywania identyfikatora sesji.
Kiedy użytkownik witryny chce uzyskać dostęp do zasobu z ograniczonym dostępem, podczas wykonywania takiego żądania dodawany jest dodatkowy nagłówek Authorization
:
Authorization: Bearer <token>
Serwer otrzymujący wartość w nagłówku nie przechowuje go w pamięci, by porównać ze sobą ciągi znaków – zamiast tego sprawdza, czy posiada prawidłową sygnaturę używaną przez serwer i na podstawie ich zgodności przyznaje dostęp używając zawartości ładunku tokenu.
Implementacje
[edytuj | edytuj kod]JWT posiada znaczną liczbę gotowych implementacji standardu. Pojawiły się m.in. dla języków C[3], Clojure[4], Common Lisp[5], Dart[6], Elixir[7], Go[8], Haskell[9], Java[10], JavaScript[11], Lua[12], Perl[13], PHP[14], PowerShell[15], Python[16], Ruby[17], Rust[18], Scala[19] czy Swift[20], a także dla takich środowisk uruchomieniowych, jak .NET[21] czy Node.js[22].
Przypisy
[edytuj | edytuj kod]- ↑ Get Started with JSON Web Tokens. auth0.com. [dostęp 2022-06-16]. (ang.).
- ↑ JSON Web Token Introduction. jwt.io. [dostęp 2022-06-16]. (ang.).
- ↑ benmcollins/libjwt: JWT C Library. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ liquidz/clj-jwt: Clojure library for JSON Web Token(JWT). github.com. [dostęp 2022-06-17]. (ang.).
- ↑ gschjetne/cljwt: A Common Lisp library for issuing and validating JSON Web Tokens. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ deftomat/JustJWT: A JWT library for Dart.. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ joken-elixir/joken: Elixir JWT library. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ Repozytorium biblioteki jwt-go języka Go w serwisie GitHub. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ jwt: JSON Web Token (JWT) decoding and encoding. hackage.haskell.org. [dostęp 2022-06-17]. (ang.).
- ↑ auth0/java-jwt: Java implementation of JSON Web Token (JWT). github.com. [dostęp 2022-06-17]. (ang.).
- ↑ kjur/jsrsasign: The 'jsrsasign' (RSA-Sign JavaScript Library) is an opensource free cryptography library supporting RSA/RSAPSS/ECDSA/DSA signing/validation, ASN.1, PKCS#1/5/8 private/public key, X.509 certificate, CRL, OCSP, CMS SignedData, TimeStamp, CAdES and JSON Web Signature/Token in pure JavaScript.. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ SkyLothar/lua-resty-jwt: JWT For The Great Openresty. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ Crypt::JWT - JSON Web Token (JWT, JWS, JWE) as defined by RFC7519, RFC7515, RFC7516. metacpan.org, 2021-11-28. [dostęp 2022-06-17]. (ang.).
- ↑ lcobucci/jwt: A simple library to work with JSON Web Token and JSON Web Signature. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ SP3269/posh-jwt: JWT (JSON Web Tokens) implementation in Powershell. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ jpadilla/pyjwt: JSON Web Token implementation in Python. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ jwt/ruby-jwt: A ruby implementation of the RFC 7519 OAuth JSON Web Token (JWT) standard.. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ Keats/jsonwebtoken: JWT lib in rust. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ jwt-scala/jwt-scala: JWT support for Scala. Bonus extensions for Play, Play JSON, Json4s, Circe, uPickle, Spray and Argonaut. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ kylef/JSONWebToken.swift: Swift implementation of JSON Web Token (JWT).. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ jwt-dotnet/jwt: Jwt.Net, a JWT (JSON Web Token) implementation for .NET. github.com. [dostęp 2022-06-17]. (ang.).
- ↑ auth0/node-jsonwebtoken: JsonWebToken implementation for node.js. github.com. [dostęp 2022-06-17]. (ang.).
Linki zewnętrzne
[edytuj | edytuj kod]- jwt.io – witryna poświęcona informacjom oraz narzędziami związanymi z JWT.
- J. Bradley , N. Sakimura , JSON Web Token (JWT), RFC 7519, IETF, maj 2015, DOI: 10.17487/RFC7519, ISSN 2070-1721, OCLC 943595667 (ang.).
- S. Josefsson , The Base16, Base32, and Base64 Data Encodings, RFC 4648, IETF, październik 2006, DOI: 10.17487/RFC4648, ISSN 2070-1721, OCLC 943595667 (ang.).