Sobes.tech
Junior
196

Czym jest JWT (JSON Web Token)?

Odpowiedź od AI

sobes.tech AI

JSON Web Token (JWT) to kompaktowy, bezpieczny sposób przesyłania danych między stronami w formacie JSON.

Zasady działania:

  • Token składa się z trzech części, oddzielonych kropkami (.): header.payload.signature.

  • Nagłówek (Header): Zawiera metadane o tokenie, takie jak typ tokenu (JWT) i używany algorytm podpisu (np. HS256, RS256).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Ładunek (Payload): Zawiera "claims" - twierdzenia lub informacje, które chcemy przekazać. Istnieje kilka typów:

    • Rejestrowane claims: Zarezerwowane, ale opcjonalne claims, takie jak iss (wydawca), exp (czas wygaśnięcia), sub (temat).
    • Public claims: Definiowane do użytku publicznego, muszą być zarejestrowane w rejestrze JSON Web Token IANA lub być URI zawierającym przestrzeń nazw chronioną przed kolizjami.
    • Prywatne claims: Dowolne twierdzenia uzgodnione między stronami.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Podpis (Signature): Tworzony przez połączenie zakodowanego nagłówka i ładunku z użyciem sekretu i algorytmu określonego w nagłówku. Zapewnia integralność tokena; jeśli ktoś zmieni nagłówek lub ładunek, podpis będzie nieważny.

    # Przykład tworzenia podpisu z użyciem HS256
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Nagłówek)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Ładunek)
    secret = 'your_secret_key'
    
    # Podpis = HMACSHA256(Base64Url(Nagłówek) + "." + Base64Url(Ładunek), secret)
    signature = hmac.new(
        secret.encode('utf-8'),
        (header_str + '.' + payload_str).encode('utf-8'),
        hashlib.sha256
    ).digest()
    
    # Kodowanie podpisu w Base64Url
    import base64
    signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii')
    
    # Ostateczny token: header_str + '.' + payload_str + '.' + signature_b64url
    

Zastosowania:

  • Autoryzacja: Serwer wydaje token użytkownikowi po pomyślnym uwierzytelnieniu. Użytkownik wysyła ten token przy każdym żądaniu. Serwer sprawdza ważność tokena i zezwala na dostęp do zasobów.
  • Wymiana informacji: Bezpieczny przesył małych ilości danych między różnymi usługami.

Zalety:

  • Kompaktowy: Mniej danych do przesłania w porównaniu do XML.
  • Samodzielny: Token zawiera już niezbędne informacje o użytkowniku, co zmniejsza konieczność odwoływania się do bazy danych przy każdym żądaniu.
  • Bezstanowy: Serwer nie musi przechowywać informacji o sesji po swojej stronie.
  • Podpis kryptograficzny: Zapewnia integralność danych.

Wady:

  • Nie można unieważnić tokena: Po wydaniu token jest ważny do czasu wygaśnięcia, chyba że zaimplementuje się mechanizm list czarnych.
  • Przechowywanie sekretu: Sekretny klucz musi być przechowywany w bezpieczny sposób.
  • Rozmiar: Wraz ze wzrostem danych w payload, rozmiar tokena rośnie.