# Session cookie — признак наличия refresh токена на клиенте **Контекст:** При перезагрузке страницы фронтенд не знает, есть ли у него refresh-токен (httpOnly cookie). Без этого признака каждый page load вызывал `/auth/refresh`, который возвращал 400 при отсутствии cookie. ## Суть Введена не-httpOnly cookie `session=1` (срок 30 дней, SameSite=Lax), которая устанавливается фронтендом после логина/регистрации/обновления сессии. Она не содержит секретных данных — только флаг наличия сессии. ### Схема работы ```mermaid 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 ``` ### if (!hasSessionCookie()) — ранний выход В `useAuth.tsx`: ```ts 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 cookie - `cb8a501` — session cookie set by frontend JS (same origin), not backend (cross-domain) ## Связанные заметки - [[frontend-api-client]] — API клиент - [[atomic-fetch-retry-infinite-loop]] — retry loop fix - [[atomic-refresh-token-race-condition]] — race condition на refresh #frontend #auth #cookie #session #optimization