TGViewer
Кодерские работы 👾 Кодерские работы 👾 @coderw0rker · 104 subscribers
Post #221 42
⚙️ Реализация Refresh Token


📦 Для хранения сессии я использую класс UserSession (1). В нём лежит вся ключевая информация: хэш токена, данные об устройстве, статус сессии и т.д.

🔑 При регистрации или авторизации запрос уходит в UserSessionService, где метод CreateSessionAsync (2) генерирует первичную пару access и refresh токенов.

🚦 Дальше каждый входящий запрос обрабатывается отдельным middleware - TokenRefreshMiddleware (3).

💡 И здесь кроется отличие от прошлого поста. Там клиент сам ловит ошибку 401 и отправляет повторный запрос на рефреш с фронта. Я решил избавить фронтенд от этой рутины: middleware сам достаёт оба токена из cookies и проверяет их прямо на бэкенде.

🔄 Если access_token истёк, вызывается метод RefreshSessionAsync (4) у UserSessionService, который и запускает процесс ротации.

⚙️ Вся логика ротации разделена на три возможных исхода:

🚨 1. Invalid

Токен не подошёл ни под текущий хэш, ни под предыдущий. Тут же срабатывает Token Reuse Detection (детект повторного использования старого токена). Мы отзываем сессию и блокируем доступ, защищая аккаунт от взлома.

✅ 2. ValidCurrent

Стандартная успешная ротация. Текущий токен переносится в PreviousTokenHash, генерируется новый секрет и обновляется срок жизни сессии.

⏳ 3. ValidGracePeriod

Тот самый исход, о котором я не говорил в прошлый раз, но без которого на практике сессия сломается.

❓ Зачем нужен Grace Period?
Когда пользователь открывает страницу, браузер может одновременно отправить 3-4 параллельных запроса. Первый запрос прилетает на бэк, успешно ротирует токен и обновляет куку. Но остальные запросы уже находятся в пути, и у них всё ещё старый refresh токен.

💀 Без Grace Period сервер посчитал бы эти параллельные запросы атакой (Invalid), и пользователя бы просто выкинуло из системы на ровном месте.

🛡 Благодаря короткому окну (буквально пара секунд) бэкенд разрешает использовать старый токен из PreviousTokenHash и спокойно отдаёт данные, не ломая активную сессию.

👌 На этом механизм ротации завершён.

👾 Полезное наблюдение: генерировать refresh токен в формате <SessionId>.<Secret>. Это позволяет при проверке моментально находить сессию по Id, а затем сверять хэш секрета.
  • 🔥 2
  • 💋 1
More from @coderw0rker
  1. Oct 1, 2026👨‍💻 Вышло завести OLED экранчик, запустил на нём Game of Life, хех.
  2. Sep 28, 2026🥰 Мои малютки пришли, приятно удивила упаковка, думал будет пластиковый пакет, а тут конт…
  3. Sep 27, 2026✍️ А вот и сам код)
  4. Sep 26, 2026🔐 Refresh Token Rotation 👨‍💻 Расскажу вам немного про механизм ротации токенов. В моём…
  5. Sep 24, 2026👋 Есть кто живой? 😅 Как-то незаметно пролетел почти весь сентябрь, а последний пост был…
  6. Aug 5, 2026👨‍💻 А вот собственно и сам веб-сервис: прокинул туннель через Cloudflare, есть вероятнос…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →