Sobes.tech
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
    }
    
  • 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.