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 } - Rejestrowane claims: Zarezerwowane, ale opcjonalne claims, takie jak
-
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.