Ответ
Использование пары токенов — access и refresh — это стандартный паттерн для повышения безопасности сессий в современных веб-приложениях, особенно при использовании JWT или OAuth 2.0.
Роли токенов
-
Access Token (токен доступа)
- Назначение: Предоставляет доступ к защищенным ресурсам (API-эндпоинтам).
- Срок жизни: Очень короткий (от 5 до 15 минут).
- Передача: Отправляется с каждым запросом в заголовке
Authorization.
-
Refresh Token (токен обновления)
- Назначение: Используется для получения новой пары
accessиrefreshтокенов после истечения срока действия старого access токена. - Срок жизни: Длительный (дни, недели, месяцы).
- Хранение: Хранится в безопасном месте (например, в
httpOnlycookie), чтобы минимизировать риск кражи через XSS-атаки.
- Назначение: Используется для получения новой пары
Почему это безопасно?
Основная цель — минимизировать ущерб от утечки access токена. Если злоумышленник перехватит его, он сможет использовать его только в течение очень короткого времени. Refresh токен не передается при каждом запросе, что значительно снижает вероятность его компрометации.
Схема работы
- Пользователь вводит логин и пароль.
- Сервер аутентификации проверяет данные и возвращает пару:
access_tokenиrefresh_token. - Клиент сохраняет токены и использует
access_tokenдля всех последующих запросов к API. - Когда
access_tokenистекает, API возвращает ошибку401 Unauthorized. - Клиент отправляет
refresh_tokenна специальный эндпоинт (/refresh). - Сервер проверяет
refresh_tokenи, если он валиден, выпускает новую пару токенов. - Клиент обновляет свои токены и повторяет исходный запрос с новым
access_token.
Ответ 18+ 🔞
Слушай, а вот эта вся хуйня с access и refresh токенами — это вообще гениально, если вдуматься. Ну представь, ты как пользователь заходишь в приложение, и тебе выдают две штуки: один билетик на пять минут, а другой — типа годовой абонемент. И оба, блядь, криптографически подписаны, чтобы их не подделать.
Access Token — это как разовый пропуск в закрытый клуб. Ты его предъявляешь охране (серверу) и заходишь. Но действует он, сука, овердохуища мало — минут 15, не больше. И если какой-то мудак его у тебя украдёт (перехватит в сети), то он сможет по нему походить от твоего имени только эти 15 минут. Потом — пиздец, билетик сгорел.
А вот Refresh Token — это уже твой паспорт, который ты дома в сейфе держишь. Ты его с собой не таскаешь, не светишь при каждом запросе. Он живёт долго — недели, месяцы. И нужен он только для одного: когда твой короткий access токен протух, ты приходишь с этим refresh токеном в специальное окошко и говоришь: «Мужик, дай мне, пожалуйста, новый пропуск и, заодно, обнови мой паспорт на следующий год». И если refresh токен валидный — тебе выдают свежую парочку.
И вся эта, блядь, махинация нужна, чтобы не заставлять пользователя каждый раз логиниться заново. Удобно, да? Но безопасность при этом не страдает. Потому что даже если у тебя украдут access токен — злоумышленнику мало что светит. А refresh токен украсть в разы сложнее, потому что он по сети не болтается.
Вот как это выглядит в коде, если очень грубо:
- Логин (получаем всё)
POST /auth/login Body: { "username": "user", "password": "pass" }
Response: { "access_token": "eyJhbGciOiJIUz...", "refresh_token": "eyJhbGciOiJIUz...", "expires_in": 900 }
2. **Работаем с доступом (используем access)**
```http
GET /api/protected-data
Authorization: Bearer eyJhbGciOiJIUz...
- Access протух — получаем новый (используем refresh)
POST /auth/refresh Body: { "refresh_token": "eyJhbGciOiJIUz..." }
Response: { "access_token": "НОВЫЙ_ТОКЕН...", "refresh_token": "НОВЫЙ_РЕФРЕШ...", "expires_in": 900 }
И так по кругу. Главное — refresh токен хранить как зеницу ока: в `httpOnly` куках, чтобы даже фронтенд-скрипты до него не дотянулись. А access токен можно и в памяти клиента держать — всё равно он скоро сдохнет.
Вот и вся магия, ёпта. Красиво, безопасно, и пользователя не ебут постоянными вводами пароля. Гениально, блядь, и просто.