atomic-session-cookie-mechanism.md 2.4 KB

Session cookie — признак наличия refresh токена на клиенте

Контекст: При перезагрузке страницы фронтенд не знает, есть ли у него 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

if (!hasSessionCookie()) — ранний выход

В 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 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