Sobes.tech
Junior

Šta je JWT (JSON Web Token)?

sobes.tech АИ

Одговор од АИ

JSON Web Token (JWT) је компактни, безбедан за URL начин преноса података између страна у формату JSON.

Принципи рада:

  • Токен се састоји од три дела, одвојена тачкама (.): header.payload.signature.

  • Header (Заглавље): садржи метаинформације о токену, као што су тип токена (JWT) и коришћени алгоритам потписа (нпр., HS256, RS256).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload (Терет): садржи "claims" - изјаве или информације које желимо да пренесемо. Постоје различити типови:

    • Registered claims: Регистроване, али опционалне claims, као што су iss (издавач), exp (рок важења), sub (тема).
    • Public claims: Одређене за јавну употребу, морају бити регистроване у IANA JSON Web Token Registry или бити URI који садржи namespace, заштићен од сукоба.
    • Private claims: произвољне изјаве, договорене између страна.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Signature (Потпис): креира се комбинацијом кодиране заглавља и терета коришћењем тајног кључа и алгоритма наведеног у заглављу. Ово обезбеђује целост токена - ако неко промени заглавље или терет, потпис ће бити неважећи.

    # Пример креирања потписа са HS256
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Заглавље)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Терет)
    secret = 'your_secret_key'
    
    # Потпис = HMACSHA256(Base64Url(Заглавље) + "." + Base64Url(Терет), secret)
    signature = hmac.new(
        secret.encode('utf-8'),
        (header_str + '.' + payload_str).encode('utf-8'),
        hashlib.sha256
    ).digest()
    
    # Кодирање потписа у Base64Url
    import base64
    signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii')
    
    # Коначни токен: header_str + '.' + payload_str + '.' + signature_b64url
    

Примена:

  • Аутентикација: Сервер издаје токен кориснику након успешне аутентикације. Корисник шаље овај токен са сваким захтевом. Сервер проверава валидност токена и дозвољава приступ ресурсима.
  • Размена информација: Безбедан пренос малих количина података између различитих сервиса.

Предности:

  • Компактност: Мање података за пренос у поређењу са XML.
  • Самодовољност: У токену већ постоје потребне информације о кориснику, што смањује потребу за приступом бази података при сваком захтеву.
  • Stateless: Сервер не мора да чува информације о сесији.
  • Криптографски потпис: Обезбеђује целост података.

Недостаци:

  • Немогућност повлачења токена: Након издавања, токен важи до истека рока, ако није имплементиран механизам црних листа.
  • Складиштење тајног кључа: Тајни кључ мора бити безбедно чуван.
  • Величина: Са растом обима података у payload, расте и величина токена.