Делали ли вы ротацию refresh токенов
Что проверяют
Понимаете ли вы, зачем refresh токен меняют при каждом использовании и что делать, если старый токен пришёл повторно. Следом обычно спрашивают про гонку: два параллельных запроса с одним токеном, и как вы это решали в Go.
Как отвечать
Отвечайте от своего проекта, опираясь на такой каркас:
- схема: на каждый
/refreshвыдаётся новая пара, старый refresh помечается использованным. Для публичных клиентов так рекомендует OAuth 2.0 Security BCP (RFC 9700); - reuse detection: если пришёл уже использованный токен, его украли или клиент сломан. Отзывается вся цепочка (family) этой сессии, пользователь входит заново;
- хранение: refresh делают непрозрачной случайной строкой из
crypto/rand(в Go 1.24 появился готовыйrand.Text()), в базе держат только SHA-256 хэш сfamily_id,expires_at,used_at. JWT для refresh избыточен: состояние на сервере всё равно нужно; - атомарность: пометка одним запросом
UPDATE ... SET used_at = now() WHERE token_hash = $1 AND used_at IS NULL RETURNING ..., иначе два параллельных запроса оба получат новую пару; - grace period: несколько секунд, в течение которых повторное предъявление от того же клиента не считается атакой. Без него пользователи с двумя вкладками вылетают из сессии.
Access токен остаётся коротким JWT на несколько минут, подписанным через golang-jwt/jwt/v5, а refresh в браузере живёт в cookie с HttpOnly, Secure и SameSite.
Нужны ваши подробности: какой был клиент, какая база, как ловили гонку. Если ротацию вы сами не писали, скажите прямо: токены выдавал Keycloak или другой провайдер, ротацию включали настройкой. Честное «не делал, но сделал бы так» звучит лучше выдуманной истории.
Где спотыкаются
Выдают новый refresh, а старый продолжает работать до истечения срока. Это не ротация, а ещё один токен, и украденный старый остаётся годным.
Хранят refresh токены в открытом виде или в map в памяти процесса без мьютекса. Первое сливает все сессии при утечке базы, второе ловит data race и ломается на втором инстансе сервиса.
Рассказывают, что «безопасность выросла в разы», без механизма и цифр. Интервьюер спросит, как это измеряли, и ответа не будет.