Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → JWT аутентификация: практика

JWT аутентификация: создание и проверка токенов

JWT аутентификация: структура токена, создание, проверка подписи, срок действия и безопасное хранение.

Прямой ответ

JWT аутентификация использует подписанный токен для подтверждения личности, поэтому проверка выполняется без обращения к базе данных.

Компонент Что содержит
Header Алгоритм подписи и тип токена
Payload Claims: субъект, срок действия, издатель
Signature Подпись, подтверждающая целостность
import jwt
import datetime

secret = "your-secret-key"
payload = {
    "sub": "user123",
    "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1),
    "iss": "api.example.com"
}
token = jwt.encode(payload, secret, algorithm="HS256")

Подпись подтверждает целостность токена, поэтому изменение payload обнаруживается при проверке. Об OAuth 2.0 — в статье про OAuth 2.0 практику.

Структура токена, создание и проверка

JWT токен состоит из трёх частей, поэтому проверка подписи подтверждает, что токен не был изменён.

Header. Содержит алгоритм подписи и тип токена, поэтому проверка выполняется с правильным алгоритмом.

Payload. Содержит claims: субъект, срок действия, издатель, поэтому информация о пользователе доступна без обращения к базе.

Signature. Подпись подтверждает целостность токена, поэтому изменение payload обнаруживается при проверке.

Практическое следствие: отсутствие проверки подписи позволяет злоумышленнику изменить payload, поэтому аутентификация не выполняется.

Отдельный аспект — срок действия. Токен с истёкшим сроком не принимается, поэтому компрометация ограничивается сроком действия.

Три признака некорректной реализации JWT.

Отсутствие проверки подписи. Изменение payload не обнаруживается, поэтому аутентификация не выполняется.

Отсутствие срока действия. Токен действует неопределённый срок, поэтому компрометация не ограничивается.

Хранение секрета в коде. Секрет попадает в систему контроля версий, поэтому доступ к нему не ограничивается.

О методах аутентификации — в статье про методы аутентификации API; о JWT и OAuth — в статье про JWT и OAuth.

Проверка claims и диагностика

Проверка claims при аутентификации подтверждает валидность токена, поэтому несанкционированный доступ prevented.

Проверка субъекта. Проверка субъекта подтверждает, что токен принадлежит пользователю, поэтому несанкционированный доступ prevented.

Проверка срока действия. Токен с истёкшим сроком не принимается, поэтому компрометация ограничивается сроком действия.

Фиксация в логе. Запись аутентификации позволяет определить, когда и кем был использован токен при диагностике.

Практическое следствие: отсутствие проверки claims приводит к тому, что токен с некорректными claims принимается.

Практика: настройка JWT аутентификации

1. Проверяйте подпись токена. Проверка подписи подтверждает, что токен не был изменён.

2. Устанавливайте срок действия. Токен с истёкшим сроком не принимается, поэтому компрометация ограничивается.

3. Не храните секрет в коде. Секрет в коде попадает в систему контроля версий, поэтому доступ к нему не ограничивается.

4. Используйте защищённое хранилище для секрета. Доступ к секрету ограничивается настройкой прав.

5. Проверяйте claims при аутентификации. Проверка субъекта, срока действия и издателя подтверждает валидность токена.

6. Фиксируйте аутентификацию в логе. Запись аутентификации позволяет определить, когда и кем был использован токен.

7. Используйте refresh tokens для продления. Refresh token позволяет получить новый access token без повторной аутентификации.

Рекомендации:

  1. Не пропускайте проверку подписи. Отсутствие проверки позволяет злоумышленнику изменить payload.
  2. Учитывайте срок действия при настройке. Токен с истёкшим сроком не принимается, поэтому компрометация ограничивается.
  3. Сопоставляйте claims с пользователем. Проверка субъекта подтверждает, что токен принадлежит пользователю.
  4. Фиксируйте аутентификацию в ошибке. Признак в записи ошибки позволяет определить, когда был использован токен.
  5. Пересматриваем срок действия при изменении требований. Новый срок требует настройки.

Практический сценарий: токен с истёкшим сроком был принят

Контекст: токен с истёкшим сроком был принят, поэтому компрометация не ограничивалась.

  1. Диагностика. Проверка показала, что срок действия токена не проверялся при аутентификации. Токен с истёкшим сроком был принят, поэтому компрометация не ограничивалась.
  2. Причина. Проверка срока действия не выполнялась, поэтому токен с истёкшим сроком принимался.
  3. Действия. (а) Добавили проверку срока действия, чтобы токен с истёкшим сроком отклонялся; (б) настроили проверку подписи, чтобы изменение payload обнаруживалось; (в) перенесли секрет в защищённое хранилище, чтобы доступ к нему ограничивался; (г) добавили фиксацию аутентификации в логе для диагностики; (д) настроили refresh tokens для продления без повторной аутентификации.
  4. Результат. Токен с истёкшим сроком отклоняется, поэтому компрометация ограничивается сроком действия.

Вывод: отсутствие проверки срока действия приводит к тому, что токен с истёкшим сроком принимается. Проверка срока действия и подписи обеспечивает, что компрометация ограничивается сроком действия токена.

Практический сценарий: токен с истёкшим сроком был принят

Контекст: токен с истёкшим сроком был принят, поэтому компрометация не ограничивалась.

  1. Диагностика. Проверка показала, что срок действия токена не проверялся при аутентификации. Токен с истёкшим сроком был принят, поэтому компрометация не ограничивалась.
  2. Причина. Проверка срока действия не выполнялась, поэтому токен с истёкшим сроком принимался.
  3. Действия. (а) Добавили проверку срока действия, чтобы токен с истёкшим сроком отклонялся; (б) настроили проверку подписи, чтобы изменение payload обнаруживалось; (в) перенесли секрет в защищённое хранилище, чтобы доступ к нему ограничивался; (г) добавили фиксацию аутентификации в логе для диагностики; (д) настроили refresh tokens для продления без повторной аутентификации.
  4. Результат. Токен с истёкшим сроком отклоняется, поэтому компрометация ограничивается сроком действия.

Вывод: отсутствие проверки срока действия приводит к тому, что токен с истёкшим сроком принимается. Проверка срока действия и подписи обеспечивает, что компрометация ограничивается сроком действия токена.

FAQ

Что такое JWT аутентификация? Метод аутентификации, использующий подписанный токен для подтверждения личности. Проверка выполняется без обращения к базе данных.

Как проверяется подпись токена? Проверка подписи выполняется с секретом, поэтому изменение payload обнаруживается. Отсутствие проверки позволяет злоумышленнику изменить payload.

Зачем нужен срок действия токена? Токен с истёкшим сроком не принимается, поэтому компрометация ограничивается сроком действия. Отсутствие срока действия позволяет токену действовать неопределённый срок.

Как безопасно хранить секрет? В защищённом хранилище с ограниченным доступом. Секрет в коде попадает в систему контроля версий, поэтому доступ к нему не ограничивается.

Источники: JWT.io, RFC 7519, FastAPI OAuth2 JWT — ссылки в шапке.