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

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

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

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

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

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

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

  1. Get Started with JSON Web Tokens. auth0.com. [dostęp 2022-06-16]. (ang.).
  2. JSON Web Token Introduction. jwt.io. [dostęp 2022-06-16]. (ang.).
  3. benmcollins/libjwt: JWT C Library. github.com. [dostęp 2022-06-17]. (ang.).
  4. liquidz/clj-jwt: Clojure library for JSON Web Token(JWT). github.com. [dostęp 2022-06-17]. (ang.).
  5. gschjetne/cljwt: A Common Lisp library for issuing and validating JSON Web Tokens. github.com. [dostęp 2022-06-17]. (ang.).
  6. deftomat/JustJWT: A JWT library for Dart.. github.com. [dostęp 2022-06-17]. (ang.).
  7. joken-elixir/joken: Elixir JWT library. github.com. [dostęp 2022-06-17]. (ang.).
  8. Repozytorium biblioteki jwt-go języka Go w serwisie GitHub. github.com. [dostęp 2022-06-17]. (ang.).
  9. jwt: JSON Web Token (JWT) decoding and encoding. hackage.haskell.org. [dostęp 2022-06-17]. (ang.).
  10. auth0/java-jwt: Java implementation of JSON Web Token (JWT). github.com. [dostęp 2022-06-17]. (ang.).
  11. 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.).
  12. SkyLothar/lua-resty-jwt: JWT For The Great Openresty. github.com. [dostęp 2022-06-17]. (ang.).
  13. 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.).
  14. lcobucci/jwt: A simple library to work with JSON Web Token and JSON Web Signature. github.com. [dostęp 2022-06-17]. (ang.).
  15. SP3269/posh-jwt: JWT (JSON Web Tokens) implementation in Powershell. github.com. [dostęp 2022-06-17]. (ang.).
  16. jpadilla/pyjwt: JSON Web Token implementation in Python. github.com. [dostęp 2022-06-17]. (ang.).
  17. jwt/ruby-jwt: A ruby implementation of the RFC 7519 OAuth JSON Web Token (JWT) standard.. github.com. [dostęp 2022-06-17]. (ang.).
  18. Keats/jsonwebtoken: JWT lib in rust. github.com. [dostęp 2022-06-17]. (ang.).
  19. 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.).
  20. kylef/JSONWebToken.swift: Swift implementation of JSON Web Token (JWT).. github.com. [dostęp 2022-06-17]. (ang.).
  21. jwt-dotnet/jwt: Jwt.Net, a JWT (JSON Web Token) implementation for .NET. github.com. [dostęp 2022-06-17]. (ang.).
  22. auth0/node-jsonwebtoken: JsonWebToken implementation for node.js. github.com. [dostęp 2022-06-17]. (ang.).

Linki zewnętrzne edytuj