0026 — Единая защита Auth-токенов в runtime-логах¶
- Дата: 2026-08-25.
- Статус: Принято пользователем; локальная реализация получила
ACCEPTED_FOR_HANDOFF. - Ответственный: владелец проекта.
- Дополняет решения 0019 и 0025.
Контекст¶
Preflight DEV deploy обнаружил, что verification/reset token мог попасть в Fastify
request log, Caddy access log, process/error log или Referer same-origin запроса.
Первое локальное исправление сохраняло различие между DEV и legacy STAGE, чтобы не
менять общий edge runtime без отдельного решения.
Владелец уточнил правило: runtime-логика, не предназначенная для production и не нужная тестам или инструментам полноценной разработки, не должна существовать как самостоятельный DEV-функционал. Защита Auth-токенов является production security invariant, а DEV служит первым контуром её проверки.
Решение¶
- Защита привязывается к роли
product app runtime, а не к домену, зоне или имени среды, и обязательна для DEV, STAGE и PROD. - Product App возвращает глобальный
Referrer-Policy: no-referrer. Это не позволяет URL вида/reset-password?token=...перейти вRefererassets/API same-origin запросов. - Edge access log полностью пропускает только известные sensitive routes:
/api/v1/auth/verify-email,/api/v1/auth/reset-password,/api/v1/auth/reset-password/*и/reset-password. - Остальные Auth routes не исключаются: наблюдаемость sign-up/sign-in/recovery сохраняется без записи токена.
- Edge и app Caddy редактируют token в request URI и
Refererдо сериализации process/error logs, включая upstream fail-path и percent-encoded представления букв имени query-параметра, которые Auth parser декодирует вtoken. - Fastify request serializer редактирует query/path token до записи, сохраняя
несекретный request context; semantic-equivalent encoded query keys получают ту
же защиту, что буквальный
token=. - Новая форма token, route или callback считается изменением security contract и требует одновременного обновления matcher, regression tests и live marker gate.
Область по runtime-контурам¶
dev.skuaro.topимпортирует contract сейчас как DEV App.skuaro.topимпортирует contract только пока фактически обслуживает legacy STAGE App.- При реализации решения 0019 contract переносится с
skuaro.topнаlk.skuaro.top; STAGE Site не наследует App contract автоматически. - Будущий
lk.skuaro.comобязан применять тот же App contract в production. - Site и Docs могут иметь собственную referrer policy; это решение её не выбирает.
Последствия¶
- Security-поведение App одинаково во всех средах; различаться могут домены, credentials, данные, log sink/retention и уровень диагностических сообщений.
- Внутренняя referrer-based аналитика Product App недоступна. CSRF-защита не должна
зависеть от
Refererи сохраняет отдельные проверкиOrigin, cookies и серверные guards. log_skipуменьшает edge forensic visibility только для четырёх sensitive групп; redacted API context остаётся доступным.- Локальная проверка не доказывает deployed runtime. До принятия deploy обязательны success/fail-path marker search в edge access/process, app process и API logs.
Границы¶
Решение не выбирает production email provider, не меняет Better Auth, Auth policy, данные, permissions, Site/Docs headers, общую PII logging policy или deploy-процесс. Git, server, DNS, DEV/STAGE/PROD runtime меняются только по отдельным разрешениям.
Откат или замена¶
Ослабление защиты App, возврат strict-origin-when-cross-origin, расширение или
сужение sensitive routes и замена Caddy logging contract требуют security review и
нового решения владельца. Техническая замена Caddy допустима только при сохранении
эквивалентной защиты всех четырёх слоёв.