Назад к вопросам
Junior
76
questionbank

Что такое JWT (JSON Web Token)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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, содержащим пространство имен, защищенное от коллизий.
    • Private claims: Произвольные утверждения, согласованные между сторонами.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Signature (Подпись): Создается путем комбинирования кодированных заголовка и нагрузки с использованием секрета и алгоритма, указанного в заголовке. Это обеспечивает целостность токена - если кто-то изменит заголовок или нагрузку, подпись будет недействительной.

    # Пример создания подписи с использованием HS256
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Header)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Payload)
    secret = 'your_secret_key'
    
    # Подпись = HMACSHA256(Base64Url(Header) + "." + Base64Url(Payload), 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 увеличивается размер токена.