Sobes.tech
Junior

Mi az a JWT (JSON Web Token)?

sobes.tech MI

Válasz az MI-től

A JSON Web Token (JWT) kompakt, URL-biztonságos módja az adatok továbbításának két fél között JSON formátumban.

Működési elvek:

  • A token három részből áll, pontokkal elválasztva (.): header.payload.signature.

  • Fejléc (Header): Metaadatokat tartalmaz a tokenről, például a token típusát (JWT) és az aláírási algoritmust (pl. HS256, RS256).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload (Tartalom): "claims" - állításokat vagy információkat tartalmaz, amelyeket továbbítani szeretnénk. Több típusuk is van:

    • Regisztrált claims: Foglalt, de opcionális claims, mint például iss (kiadó), exp (lejárati idő), sub (téma).
    • Nyilvános claims: Nyilvános használatra meghatározottak, regisztrálni kell az IANA JSON Web Token Registry-ben vagy URI-t kell tartalmazni, amely névteret véd a konfliktusoktól.
    • Privát claims: Szabadon megállapított állítások, amelyek a felek között egyeznek meg.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Aláírás (Signature): A kódolt fejléc és tartalom kombinálásával, titkos kulcs és a fejlécben megadott algoritmus használatával jön létre. Ez biztosítja a token integritását - ha valaki megváltoztatja a fejlécet vagy a tartalmat, az aláírás érvénytelen lesz.

    # Aláírás létrehozásának példája HS256 használatával
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Header)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Payload)
    secret = 'your_secret_key'
    
    # Aláírás = HMACSHA256(Base64Url(Header) + "." + Base64Url(Payload), secret)
    signature = hmac.new(
        secret.encode('utf-8'),
        (header_str + '.' + payload_str).encode('utf-8'),
        hashlib.sha256
    ).digest()
    
    # Aláírás kódolása Base64Url-be
    import base64
    signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii')
    
    # Végső token: header_str + '.' + payload_str + '.' + signature_b64url
    

Alkalmazás:

  • Hitelesítés: A szerver a sikeres azonosítás után adja ki a tokent a felhasználónak. A felhasználó minden kérésnél elküldi ezt a tokent. A szerver ellenőrzi a token érvényességét és engedélyezi a hozzáférést.
  • Információcsere: Biztonságos adatátvitel különböző szolgáltatások között.

Előnyök:

  • Kompakt: Kevesebb adat a továbbításhoz, mint XML esetén.
  • Önálló: A token már tartalmazza a felhasználó szükséges adatait, csökkentve a adatbázis elérésének szükségességét minden kérésnél.
  • Stateless: A szerver nem kell, hogy tárolja a munkamenet információkat.
  • Kriptográfiai aláírás: Biztosítja az adatok integritását.

Hátrányok:

  • Nem lehet visszavonni a tokent: A kiadás után a token az érvényességi idő végéig érvényes, kivéve, ha blacklist mechanizmust valósítanak meg.
  • Titkos kulcs tárolása: A titkos kulcsot biztonságosan kell tárolni.
  • Méret: A payload adatmennyiség növekedésével a token mérete is nő.