Сервис учётных данных и сессий для демо-окружения: хранение секретов Argon2id, короткоживущие access-токены, непрозрачные ротируемые refresh-токены и обнаружение повторного использования.
Запланирован · Рантайм бэкенда: Нет развёрнутого рантайма — стадия спецификации · Источник данных демо: Mock
Область применения
Бэкенд-кейс о хранении учётных данных, жизненном цикле сессий, RBAC и rate limiting для демо-окружения zolotoy.dev.
Не входит в область
Не корпоративный IAM.
Не социальный вход и не федеративная идентификация.
Не универсальный OAuth-сервер авторизации.
Инженерный фокус
Жизненный цикл сессий, ротация и обнаружение повторного использования, RBAC, rate limiting.
Жизненный цикл сессий, ротация и обнаружение повторного использования, RBAC, rate limiting.
Текущая реализация
Бэкенд-реализации пока нет. Демо-модуль отображает планируемые потоки на детерминированных моках; содержимое ниже — предлагаемая граница, а не работающая система.
Current
Бэкенд-реализации пока нет: сервис на стадии спецификации и в демо представлен только детерминированными MSW-сценариями.
Короткоживущие access-токены в памяти клиента; непрозрачные ротируемые refresh-токены в HttpOnly, Secure, SameSite cookie — никогда не в постоянном хранилище браузера.
Ротация refresh с отзывом семейства сессий и обнаружением повторного использования: предъявление уже ротированного refresh-токена отзывает всё семейство.
introspection токена / общий JWKS — контракт TBD: order → auth (план)
Целевой поток аутентификации: ротация cookie с обнаружением повторного использования.
Инженерные решения
Непрозрачные refresh-токены вместо JWT refresh
Целевой дизайн: refresh-токены — непрозрачные серверные записи, поэтому отзыв — это запись в БД, а не ожидание истечения. Access-токены короткоживущие, чтобы ограничить окно отзыва.
Обнаружение повторного использования отзывает семейство сессий
Целевой дизайн: повторно предъявленный refresh-токен трактуется как признак кражи. Отзывается всё семейство сессий, принуждая к повторному входу на каждом устройстве семейства.
Устойчивость к перебору учётных данных — контракт на форму ответа
Целевой дизайн: одинаковый текст ответа, сопоставимое время и одинаковые коды статуса для «нет такого пользователя» и «неверный пароль» в login и сбросе пароля.
Надёжность / сценарии отказа
Конкурентные refresh-запросы
Несколько параллельных refresh с одним токеном: ротацию выигрывает ровно один; остальные должны переиспользовать результат координатора, а не ротировать снова и срабатывать на reuse detection.
Повторно использованный refresh-токен
Ротация при каждом использовании означает, что повтор токена — сигнал кражи: отозвать семейство сессий, отказать в refresh и вернуть отличимую ошибку, чтобы клиент форсировал повторный вход.
Перебор учётных данных
Ответы login/register/reset не должны раскрывать существование аккаунта — одинаковый текст, статус и близкий профиль времени, включая стоимость хэша для несуществующих пользователей.
Политика при недоступности Redis
План: поиск сессии должен безопасно деградировать (отказ или чтение из основного хранилища), а не работать в открытом режиме; rate limiting не должен тихо исчезать при недоступности Redis.
Ограничения отзыва уже выпущенных JWT
Access-токены нельзя отозвать до истечения; отзыв действует только на refresh. Короткий TTL access и серверные проверки сессии для чувствительных операций ограничивают экспозицию.