Fresh-подход в аутентификации строится вокруг идеи короткоживущих токенов доступа и обновления сессии без повторного ввода учетных данных. В JavaScript-приложениях этот паттерн применяется для снижения рисков компрометации, упрощения масштабирования и отказа от серверных сессий.
Ключевая особенность — токен, используемый для доступа к защищённым ресурсам, всегда «свежий», то есть имеет минимальное время жизни и регулярно обновляется.
Fresh-аутентификация почти всегда реализуется через пару токенов:
Access token
Refresh token
В JavaScript-экосистеме чаще всего access token — это JWT, а refresh token — либо JWT, либо случайная строка, сохранённая на сервере.
Минимизация ущерба при утечке Если access token украден, он перестаёт быть валидным через короткое время.
Отказ от серверных сессий Сервер не хранит состояние пользователя между запросами.
Горизонтальное масштабирование Любой экземпляр backend-сервиса может валидировать токен без shared-storage.
Чёткое разделение ответственности Access token — для API, refresh token — только для обновления сессии.
Клиент отправляет логин и пароль.
Сервер проверяет учетные данные.
Сервер выдаёт:
Refresh token сохраняется:
Access token сохраняется в памяти приложения.
Клиент отправляет HTTP-запрос.
В заголовке Authorization передаётся:
Bearer <access_token>Сервер:
Сервер не обращается к базе данных для проверки сессии.
Когда access token становится невалидным:
Сервер возвращает 401 Unauthorized.
Клиент автоматически инициирует запрос обновления.
Refresh token отправляется на отдельный endpoint.
Сервер:
Клиент повторяет исходный запрос.
Один из ключевых элементов Fresh-паттерна — ротация refresh token.
Принцип:
Это позволяет обнаруживать повторное использование токена — признак компрометации.
Типичный endpoint обновления:
Важно:
Рекомендуется:
Причина — защита от XSS.
На вебе:
httpOnly;secure;sameSite=strict или lax.На мобильных платформах:
Refresh token никогда не должен быть доступен JavaScript-коду браузера.
Типичная проблема Fresh-паттерна — несколько запросов одновременно
получают 401.
Решение:
Без этого возникает лавина refresh-запросов.
Fresh-аутентификация не означает отсутствие контроля.
Поддерживаются сценарии:
Реализация:
Access token при этом просто доживает свой TTL.
Access token должен содержать:
Запрещено:
JWT — это не хранилище состояния, а транспорт утверждений.
Если refresh token хранится в cookie:
refresh-эндпоинт подвержен CSRF;
используется:
sameSite;Access token в заголовке CSRF-уязвимым не является.
| Характеристика | Fresh | Cookie-сессии |
|---|---|---|
| Хранение состояния | Клиент | Сервер |
| Масштабирование | Простое | Требует shared-storage |
| TTL | Короткий | Длинный |
| Защита при утечке | Высокая | Низкая |
| Контроль | Через refresh | Через сервер |
Каждая из этих ошибок полностью нивелирует преимущества Fresh-паттерна.
SPA
SSR
Fresh-подход одинаково применим в обоих сценариях.
В современных JavaScript-приложениях Fresh-аутентификация используется:
Это не библиотека и не протокол, а архитектурный паттерн, объединяющий безопасность, производительность и масштабируемость.