← Назад ко всем вопросам

Как проверить, что JWT не подменили? Что именно валидируется (signature, exp, aud, iss)?

1️⃣ Как кратко ответить

Для проверки, что JWT не подменили, необходимо валидировать его подпись (signature) с использованием секретного ключа или публичного ключа в случае асимметричного шифрования. Также следует проверить срок действия токена (exp), аудиторию (aud) и издателя (iss), чтобы убедиться, что токен действителен, предназначен для вашего приложения и выпущен доверенным источником.

2️⃣ Подробное объяснение темы

JWT (JSON Web Token) — это компактный, URL-безопасный способ передачи информации между сторонами в виде JSON-объектов. Он часто используется для аутентификации и передачи информации о пользователе. Чтобы убедиться, что JWT не был подменен, необходимо выполнить несколько проверок.

Структура JWT

JWT состоит из трех частей, разделенных точками:

  1. Header (заголовок): содержит информацию о типе токена и алгоритме подписи.
  2. Payload (полезная нагрузка): содержит утверждения (claims) о пользователе и токене.
  3. Signature (подпись): используется для проверки подлинности отправителя и целостности сообщения.

Пример JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Проверка подписи (Signature)

Подпись создается с использованием заголовка и полезной нагрузки, которые кодируются в Base64Url, и секретного ключа (в случае симметричного шифрования) или приватного ключа (в случае асимметричного шифрования). Чтобы проверить, что JWT не подменили, необходимо:

  • Декодировать заголовок и полезную нагрузку.
  • Использовать тот же алгоритм и ключ, чтобы сгенерировать подпись.
  • Сравнить с подписью в токене. Если они совпадают, токен не был изменен.

Проверка срока действия (exp)

Поле exp в полезной нагрузке указывает на время истечения срока действия токена в формате Unix timestamp. Проверка заключается в том, чтобы убедиться, что текущее время меньше значения exp. Это гарантирует, что токен еще действителен.

Проверка аудитории (aud)

Поле aud указывает на аудиторию, для которой предназначен токен. Это может быть идентификатор вашего приложения. Проверка заключается в том, чтобы убедиться, что значение aud соответствует ожидаемому значению. Это предотвращает использование токена в неподходящих контекстах.

Проверка издателя (iss)

Поле iss указывает на издателя токена. Это может быть идентификатор сервера аутентификации. Проверка заключается в том, чтобы убедиться, что значение iss соответствует ожидаемому значению. Это гарантирует, что токен был выпущен доверенным источником.

Пример кода на Python с использованием библиотеки PyJWT

import jwt
from jwt import ExpiredSignatureError, InvalidAudienceError, InvalidIssuerError
​
# Секретный ключ для симметричного шифрования
secret_key = 'your-256-bit-secret'
​
# JWT, который нужно проверить
token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
​
try:
    # Декодирование и проверка токена
    decoded = jwt.decode(token, secret_key, algorithms=['HS256'], audience='your-audience', issuer='your-issuer')
    print("Токен действителен:", decoded)
except ExpiredSignatureError:
    print("Токен истек.")
except InvalidAudienceError:
    print("Неверная аудитория.")
except InvalidIssuerError:
    print("Неверный издатель.")
except jwt.InvalidTokenError:
    print("Неверный токен.")
​
# Комментарии к коду:
# 1. Импортируем библиотеку jwt и необходимые исключения.
# 2. Определяем секретный ключ, который использовался для создания подписи.
# 3. Определяем JWT, который нужно проверить.
# 4. Используем функцию decode для декодирования и проверки токена.
# 5. Указываем алгоритм, аудиторию и издателя, которые ожидаем.
# 6. Обрабатываем возможные исключения, чтобы определить, почему токен недействителен.

Этот код демонстрирует, как проверить JWT на подмену и валидировать его поля.

Тема: Безопасность и авторизация
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки