Refresh tokens
Refresh token — долгоживущий токен для обновления короткоживущего access_token без повторного логина. Ключевой для UX и безопасности OAuth 2.0.
Зачем два токена
- Access token короткий (15 мин): украли → быстро протух
- Refresh token длинный (недели): хранится безопасно у клиента
- Каждые 15 мин — auto-refresh, юзер не замечает
Обмен
POST /token
grant_type=refresh_token
refresh_token=abc123
client_id=X
→ { access_token: "new", refresh_token: "новый!", expires_in: 900 }
Rotation (обязательно для public clients)
При каждом использовании refresh token — AS выдаёт новый refresh, старый инвалидирует. Плюсы:
- Утечка старого refresh → бесполезен после первого использования вором
- Detection: если старый refresh пришёл после ротации — сигнал о краже, все токены семьи отозвать
Reuse detection (Auth0 pattern)
- Refresh token A → выдаётся B, A инвалидирован.
- Если кто-то опять шлёт A → атака. Отзываем B, C, D... всю family.
- Юзеру: "переавторизуйся".
Хранение
| Клиент | Где хранить |
|---|---|
| Mobile | Keychain (iOS), Keystore (Android) |
| Server-side web | DB, session |
| SPA | HttpOnly cookie (best) или IndexedDB (не localStorage — XSS) |
| CLI | ~/.config/app/tokens (chmod 600) |
Sliding expiration
Refresh token имеет absolute и inactivity expiry:
- Absolute — например, 90 дней с выпуска. По истечении — точно логин
- Inactivity — 30 дней без использования → истёк
Revocation
RFC 7009 — POST /revoke. Юзер выходит → отзови refresh. AS должен уметь.