Sobes.tech
Junior

Kas ir JWT (JSON Web Token)?

sobes.tech AI

Atbilde no AI

JSON Web Token (JWT) — tas ir kompakts, URL drošs datu pārraides veids starp pusēm JSON formātā.

Darba principi:

  • Tokens sastāv no trim daļām, kas atdalītas ar punktiem (.): header.payload.signature.

  • Header (Galvene): Satur metadatus par tokenu, piemēram, tokena tipu (JWT) un paraksta algoritmu (piemēram, HS256, RS256).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload (Nesība): Satur "claims" - apgalvojumus vai informāciju, ko vēlamies nodot. Ir vairāki veidi:

    • Reģistrētie claims: Rezervēti, bet opcioni claims, piemēram, iss (izdevējs), exp (derīguma termiņš), sub (temats).
    • Publiskie claims: Definēti publiskai lietošanai, jāreģistrē IANA JSON Web Token Registry vai jābūt URI ar nosaukuma telpu, kas ir aizsargāta pret kolīzijām.
    • Privātie claims: Nejauši apgalvojumi, kas saskaņoti starp pusēm.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Paraksts: Izveidots, apvienojot kodētas galvenes un nesības ar slepeno atslēgu un paraksta algoritmu, kas norādīts galvenē. Tas nodrošina tokena integritāti - ja kāds mainīs galveni vai nesību, paraksts kļūs nederīgs.

    # Parauga paraksta izveide ar HS256
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Galvene)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Nesība)
    secret = 'your_secret_key'
    
    # Paraksts = HMACSHA256(Base64Url(Galvene) + "." + Base64Url(Nesība), slepenā atslēga)
    signature = hmac.new(
        secret.encode('utf-8'),
        (header_str + '.' + payload_str).encode('utf-8'),
        hashlib.sha256
    ).digest()
    
    # Kodēšana Base64Url
    import base64
    signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii')
    
    # Gala tokens: header_str + '.' + payload_str + '.' + signature_b64url
    

Pielietojums:

  • Autorizācija: Serveris izdod tokenu lietotājam pēc veiksmīgas autentifikācijas. Lietotājs nosūta šo tokenu ar katru pieprasījumu. Serveris pārbauda tokena derīgumu un atļauj piekļuvi resursiem.
  • Informācijas apmaiņa: Droša nelielu datu apmaiņa starp dažādiem pakalpojumiem.

Priekšrocības:

  • Kompaktums: Mazāk datu pārraidē salīdzinājumā ar XML.
  • Pašpietiekamība: Tokenā jau ir nepieciešamā informācija par lietotāju, kas samazina nepieciešamību piekļūt datu bāzei katrā pieprasījumā.
  • Stateless: Serverim nav jāuztur sesijas informācija savā pusē.
  • Kriptogrāfiska parakstīšana: Nodrošina datu integritāti.

Trūkumi:

  • Tokena atsaukšana nav iespējama: Pēc izdošanas tokens darbojas līdz derīguma termiņa beigām, ja nav ieviests melno sarakstu mehānisms.
  • Slepenās atslēgas glabāšana: Jāglabā droši.
  • Izmērs: Ar datu apjoma pieaugumu payload palielinās tokena izmērs.