Контекст: При перезагрузке страницы фронтенд не знает, есть ли у него refresh-токен (httpOnly cookie). Без этого признака каждый page load вызывал /auth/refresh, который возвращал 400 при отсутствии cookie.
Введена не-httpOnly cookie session=1 (срок 30 дней, SameSite=Lax), которая устанавливается фронтендом после логина/регистрации/обновления сессии. Она не содержит секретных данных — только флаг наличия сессии.
sequenceDiagram
participant Client as Браузер
participant App as Фронтенд
participant API as Бэкенд
Note over Client,API: Логин
Client->>API: POST /auth/login
API->>Client: refresh_token (httpOnly) + session=1 (JS)
Note over Client: document.cookie = "session=1"
Note over Client,API: Page reload
App->>Client: hasSessionCookie() → true
App->>API: POST /auth/refresh (cookie refresh_token)
API->>App: new access_token
В useAuth.tsx:
if (!hasSessionCookie()) {
setIsLoading(false)
return
}
Это предотвращает лишний вызов /auth/refresh у гостей (нет cookie → нет сессии → не пытаемся восстановить).
| Функция | Файл | Назначение |
|---|---|---|
hasSessionCookie() |
lib/api.ts:19-22 |
Проверяет наличие session cookie |
setSessionCookie() |
lib/api.ts:24-26 |
Устанавливает cookie на 30 дней |
clearSessionCookie() |
lib/api.ts:28-30 |
Удаляет cookie при logout |
7052a25 — suppress 400 on /auth/refresh for guests via session cookiecb8a501 — session cookie set by frontend JS (same origin), not backend (cross-domain)#frontend #auth #cookie #session #optimization