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

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łówekEdytuj

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"
}

ŁadunekEdytuj

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
}

SygnaturaEdytuj

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życieEdytuj

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.

ImplementacjeEdytuj

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].

PrzypisyEdytuj

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

Linki zewnętrzneEdytuj