Sobes.tech
Junior

JWT (JSON Web Token) чист?

sobes.tech AI

Ҷавоб аз AI

Токенът 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, размерът на токена се увеличава.