[Bug] Refresh cookie без срока жизни: после закрытия PWA/браузера нужен повторный вход #123

Closed
opened 2026-10-23 07:18:38 +03:00 by codex-bot · 0 comments
Owner

Problem

refresh_token cookie выставляется без Max-Age/Expires (src/modules/auth/presentation/auth.controller.ts cookieOptions()), поэтому браузер считает её сессионной и удаляет при закрытии браузера/PWA. Серверная Session и refresh JWT при этом живут 7 дней. PWA обновляется только после закрытия всех окон (registerType: "prompt"), поэтому пользователь после каждого релиза вводит логин и пароль заново.

Expected Behavior

Refresh cookie переживает перезапуск браузера/PWA в пределах срока Session и продлевается при каждой ротации.

Scope

In scope

  • maxAge в cookieOptions(), значение из единой константы REFRESH_TTL_MS (auth.service.ts), общей с expiresAt Session.
  • Обновление HTTP-тестов cookie policy в test/app.e2e-spec.ts (сейчас они запрещают Max-Age).

Out of scope

  • Изменение срока жизни (остаётся 7 дней), grace/replay history, межвкладочная синхронизация.
  • Поведение фронтенда при 5xx/сетевой ошибке refresh (отдельная Issue во frontend).

Acceptance Criteria

  • Cookie при register/login/refresh содержит Max-Age, равный REFRESH_TTL_MS / 1000 (604800).
  • Остальные атрибуты не меняются: HttpOnly, SameSite=Lax, Path=/api/v1/auth, без Domain, Secure кроме development.
  • Logout и очистка cookie по-прежнему удаляют её (Expires в прошлом, без положительного Max-Age).
  • Срок cookie и Session.expiresAt определяются одной константой.

Verification

npm run test:e2e (app.e2e-spec.ts) и npm run verify.

Traceability

Связано с #61 (тест cookie policy).

## Problem `refresh_token` cookie выставляется без `Max-Age`/`Expires` (`src/modules/auth/presentation/auth.controller.ts` `cookieOptions()`), поэтому браузер считает её сессионной и удаляет при закрытии браузера/PWA. Серверная Session и refresh JWT при этом живут 7 дней. PWA обновляется только после закрытия всех окон (`registerType: "prompt"`), поэтому пользователь после каждого релиза вводит логин и пароль заново. ## Expected Behavior Refresh cookie переживает перезапуск браузера/PWA в пределах срока Session и продлевается при каждой ротации. ## Scope ### In scope - `maxAge` в `cookieOptions()`, значение из единой константы `REFRESH_TTL_MS` (auth.service.ts), общей с `expiresAt` Session. - Обновление HTTP-тестов cookie policy в `test/app.e2e-spec.ts` (сейчас они запрещают `Max-Age`). ### Out of scope - Изменение срока жизни (остаётся 7 дней), grace/replay history, межвкладочная синхронизация. - Поведение фронтенда при 5xx/сетевой ошибке refresh (отдельная Issue во frontend). ## Acceptance Criteria - [ ] Cookie при register/login/refresh содержит `Max-Age`, равный `REFRESH_TTL_MS / 1000` (604800). - [ ] Остальные атрибуты не меняются: HttpOnly, SameSite=Lax, Path=/api/v1/auth, без Domain, Secure кроме development. - [ ] Logout и очистка cookie по-прежнему удаляют её (Expires в прошлом, без положительного Max-Age). - [ ] Срок cookie и `Session.expiresAt` определяются одной константой. ## Verification `npm run test:e2e` (app.e2e-spec.ts) и `npm run verify`. ## Traceability Связано с #61 (тест cookie policy).
codex-bot added the Kind/Bug
Priority
Medium
3
labels 2026-10-23 07:18:38 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/backend#123