Что такое JWT и как он работает
JWT состоит из трёх частей: header, payload и signature. Header содержит информацию о типе токена и алгоритме подписи. Payload хранит данные пользователя и метаданные. Signature — это криптографическая подпись, вычисленная с помощью ключа для подтверждения подлинности токена.
В практике Sayt.uz JWT в основном используется для API-аутентификации и stateless-сессий. Токен хранится на стороне клиента и передаётся в каждом запросе через Authorization header. Сервер проверяет токен и определяет права пользователя.
Выбор алгоритма подписи
JWT поддерживает несколько алгоритмов подписи: HS256, HS512, RS256, ES256 и другие. HS256 — симметричный алгоритм, один и тот же секретный ключ используется и для подписи, и для проверки. RS256 — асимметричный, подпись осуществляется приватным ключом, а проверка — публичным.
В практике Sayt.uz для микросервисной архитектуры рекомендуется RS256, так как несколько сервисов могут проверять токен через публичный ключ, но право подписи остаётся только у одного. Для монолитных приложений HS256 достаточно и работает быстрее.
Ротация секрета и управление ключами
Секретный ключ — не простой пароль, а случайное значение длиной не менее 256 бит. Никогда не храните его в коде, загружайте через environment variable или secret manager (HashiCorp Vault, AWS Secrets Manager). Ключ рекомендуется менять каждые 90 дней.
Чтобы при ротации токены, подписанные старым ключом, не перестали работать сразу, применяется key versioning. В header токена сохраняется поле kid (key ID), и сервер, храня несколько ключей, выбирает нужный по kid. Старый ключ безопасно удаляется после истечения срока всех токенов.
Expiration и refresh токены
Срок действия access token должен быть коротким — обычно от 15 минут до 1 часа. Это ограничивает ущерб от украденного токена. Чтобы пользователь не входил заново каждые 15 минут, применяется механизм refresh token. Refresh token живёт дольше (7-30 дней) и используется только для получения нового access token.
В практике Sayt.uz refresh token хранится в httpOnly cookie, что защищает от XSS-атак. При каждом refresh старый токен отзывается и выдаётся новый (rotation). Если отозванный токен используется повторно — это признак кражи, и все сессии принудительно закрываются.
Распространённые атаки
Самая известная атака — none algorithm: злоумышленник меняет поле alg в header на none и отправляет токен без подписи. Старые библиотеки JWT принимали такое. Современные защищены, но всегда обновляйте библиотеку и применяйте правило whitelist алгоритмов.
Другая проблема — algorithm confusion: если сервер принимает и RS256, и HS256, злоумышленник может использовать публичный ключ как секрет HS256 и подделать токен. Решение — задавать ровно один алгоритм на каждый endpoint. Для снижения риска brute force секретный ключ должен быть длинным и случайным.
Практика Sayt.uz
На Sayt.uz конфигурация JWT следующая: access token 30 минут, refresh token 7 дней, алгоритм подписи RS256, секретный ключ в AWS Secrets Manager, ротация раз в 90 дней. Каждая неудачная проверка логируется, и при обнаружении аномалии администратор получает уведомление. Blacklist токенов хранится в Redis и пополняется сразу при logout.