Что такое JWT refresh tokens и как правильно реализовать ротацию
JWT (JSON Web Tokens) стали стандартом для аутентификации в современных веб-приложениях. Они позволяют серверу выдавать клиенту токен, который подтверждает его личность, без постоянного обращения к базе данных.
Однако у короткоживущих токенов возникает проблема: как продлить сессию пользователя безопасно, не требуя повторного логина? Решение — refresh tokens.
В этой статье разберём, что такое refresh tokens, как они работают и как правильно реализовать их ротацию.
Access и Refresh токены: базовая концепция
- Access token — короткоживущий токен (5–15 минут), используемый для доступа к API.
- Refresh token — долгоживущий токен (например, 7–30 дней), который позволяет получить новый access token после истечения старого.
Ключевая идея: access token может быть недолговечным, чтобы минимизировать ущерб от его компрометации, а refresh token безопасно хранится и используется только для обновления.
В нашем блоге есть статья о том, как реализовать базовую аутентификацию по JWT в Node.js + Express.
Почему нужна ротация refresh токенов
Ротация — это процесс замены старого refresh token на новый при каждом использовании. Это предотвращает повторное использование токена в случае компрометации.
Проблемы без ротации:
- Если refresh token украден, злоумышленник может бесконечно получать новые access токены.
- Сессия пользователя становится уязвимой для атак «replay».
Ротация делает систему безопаснее, обеспечивая короткий срок жизни каждого refresh токена.
Принципы безопасной реализации
- Одноразовые refresh токены
Каждый токен должен использоваться только один раз. После обновления старый токен аннулируется. - Хранение на сервере
Сервер должен хранить информацию о действующих refresh токенах, чтобы проверять их действительность. - Привязка к клиенту
Токен можно привязывать к устройству или сессии, чтобы предотвращать использование на чужих устройствах. - Контроль времени жизни
Даже refresh token должен иметь ограниченный срок действия. - Защита от повторного использования (replay attacks)
Если токен использован повторно, сервер должен блокировать сессию и требовать повторной аутентификации.
Практическая схема работы
- Пользователь логинится и получает access token и refresh token.
- Клиент использует access token для API-запросов.
- Когда access token истекает, клиент отправляет refresh token на endpoint
/refresh. - Сервер проверяет refresh token:
- валиден ли он;
- не использован ли ранее;
- не просрочен ли.
- Если проверка прошла, сервер выдаёт новый access token и новый refresh token.
- Старый refresh token аннулируется.
Таким образом каждый refresh token живёт один цикл и больше не может быть использован.
Дополнительные меры безопасности
- Использовать HTTPS для всех запросов с токенами.
- Хранить refresh токены в httpOnly cookies или безопасном хранилище.
- Ограничивать количество попыток обновления токена, чтобы снизить риск brute-force.
- Вести аудит использования refresh токенов, чтобы быстро реагировать на подозрительную активность.
Итог
Refresh tokens и их ротация — важный инструмент безопасной аутентификации.
Правильная реализация позволяет:
- минимизировать ущерб при компрометации access token,
- продлить сессии пользователя без повторного логина,
- обеспечить контроль над активными сессиями и предотвратить повторное использование токенов.
Следуя этим принципам, можно построить надёжную и безопасную систему аутентификации с JWT.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний