Junior
Čo je JWT (JSON Web Token)?
sobes.tech AI
Odpoveď od AI
JSON Web Token (JWT) je kompaktni, URL-bezpečen način za prenos podataka između strana u JSON formatu.
Principi rada:
-
Token se sastoji od tri dela, odvojenih tačkama (
.):header.payload.signature. -
Header (Zaglavlje): Sadrži metapodatke o tokenu, kao što su tip tokena (JWT) i korišćeni algoritam potpisa (npr., HS256, RS256).
{ "alg": "HS256", "typ": "JWT" } -
Payload (Teret): Sadrži "claims" - tvrdnje ili informacije koje želimo da prenesemo. Postoje različiti tipovi:
- Registered claims: Registrovane, ali opcionalne claims, kao što su
iss(izdavalac),exp(vreme isteka),sub(tema). - Public claims: Određene za javnu upotrebu, moraju biti registrovane u IANA JSON Web Token Registry ili biti URI koji sadrži namespace, zaštićen od sukoba.
- Private claims: proizvoljne tvrdnje, dogovorene između strana.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } - Registered claims: Registrovane, ali opcionalne claims, kao što su
-
Signature (Potpis): Kreira se kombinovanjem kodirane zaglavlja i tereta korišćenjem tajnog ključa i algoritma navedenog u zaglavlju. Ovo obezbeđuje celokupnost tokena - ako neko promeni zaglavlje ili teret, potpis će biti nevažeći.
# Primer za kreiranje potpisa sa HS256 import hmac, hashlib header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Zaglavlje) payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Teret) secret = 'your_secret_key' # Potpis = HMACSHA256(Base64Url(Zaglavlje) + "." + Base64Url(Teret), secret) signature = hmac.new( secret.encode('utf-8'), (header_str + '.' + payload_str).encode('utf-8'), hashlib.sha256 ).digest() # Kodiranje potpisa u Base64Url import base64 signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii') # Konačni token: header_str + '.' + payload_str + '.' + signature_b64url
Primena:
- Autentikacija: Server izdaje token korisniku nakon uspešne autentikacije. Korisnik šalje ovaj token sa svakim zahtevom. Server proverava validnost tokena i dozvoljava pristup resursima.
- Razmena informacija: Siguran prenos malih količina podataka između različitih servisa.
Prednosti:
- Kompaktnost: Manje podataka za prenos u poređenju sa XML.
- Samodovolјnost: U tokenu već postoje potrebne informacije o korisniku, što smanjuje potrebu za pristupom bazi podataka pri svakom zahtevu.
- Stateless: Server ne mora da čuva informacije o sesiji.
- Kriptografski potpis: Obezbeđuje celovitost podataka.
Nedostaci:
- Nije moguće opozvati token: Nakon izdavanja, token važi do isteka roka njegovog trajanja, osim ako nije implementiran mehanizam crnih lista.
- Čuvanje tajnog ključa: Tajni ključ mora biti sigurno čuvan.
- Veličina: Sa rastom obima podataka u
payload, veličina tokena se povećava.