Sobes.tech
Junior

Mis on JWT (JSON Web Token)?

sobes.tech AI

Vastus AI-lt

JSON Web Token (JWT) on kompaktne, URL-i turvaline viis andmete vahetamiseks osapoolte vahel JSON-formaadis.

Tööpõhimõtted:

  • Token koosneb kolmest osast, mis on eraldatud punktidega (.): header.payload.signature.

  • Header (Päis): Sisaldab metaandmeid tokeni kohta, näiteks tokeni tüüp (JWT) ja kasutatud allkirjastamise algoritm (näiteks HS256, RS256).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload (Sisu): Sisaldab "claims" - väiteid või teavet, mida soovime edastada. On erinevat tüüpi:

    • Registreeritud claims: Reserveeritud, kuid valikulised claims, näiteks iss (väljaandja), exp (kehtivusaeg), sub (teema).
    • Avalikud claims: Määratletud avalikuks kasutamiseks, peavad olema registreeritud IANA JSON Web Token Registrys või olema URI, mis sisaldab nimelahendust, mis on kaitstud kokkulangevuste eest.
    • Privaatsed claims: Juhuslikud väited, mis on osapoolte vahel kooskõlastatud.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Allkiri: Loobutakse kombineerides kodeeritud päise ja sisu koos salajase võtme ja päise algoritmiga, mis on märgitud päises. See tagab tokeni terviklikkuse - kui keegi muudab päise või sisu, muutub allkiri kehtetuks.

    # Näide allkirja loomise kohta HS256 kasutades
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Päis)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Nesõn)
    secret = 'your_secret_key'
    
    # Allkiri = HMACSHA256(Base64Url(Päis) + "." + Base64Url(Nesõn), salajane)
    signature = hmac.new(
        secret.encode('utf-8'),
        (header_str + '.' + payload_str).encode('utf-8'),
        hashlib.sha256
    ).digest()
    
    # Kodeerimine Base64Url
    import base64
    signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii')
    
    # Lõplik token: header_str + '.' + payload_str + '.' + signature_b64url
    

Rakendused:

  • Autentimine: Server väljastab tokeni kasutajale pärast edukat autentimist. Kasutaja saadab selle tokeni iga päringuga. Server kontrollib tokeni kehtivust ja lubab juurdepääsu ressurssidele.
  • Teabe vahetamine: Turvaline väikeste andmemahtude edastamine erinevate teenuste vahel.

Eelised:

  • Kompaktsus: Vähem andmeid edastamiseks võrreldes XML-iga.
  • Iseseisvus: Tokenis juba sisaldub vajalik teave kasutaja kohta, mis vähendab vajadust andmebaidile iga päringu puhul pöördumiseks.
  • Stateless: Server ei pea hoidma seansi teavet oma poolel.
  • Krüptograafiline allkiri: Tagab andmete terviklikkuse.

Puudused:

  • Tokeni tühistamine pole võimalik: Pärast väljastamist kehtib token kuni selle kehtivusaja lõpuni, kui pole rakendatud musta nimekirja mehhanismi.
  • Saladuse hoidmine: Salajane võti peab olema turvaliselt hoitud.
  • Suurus: Datu maht payload suureneb, kui andmete maht suureneb.