# CSRF-защита для API с cookie-based аутентификацией **Контекст:** PhotoPlaces использует HttpOnly cookie для refresh token. Без CSRF-защиты state-changing запросы (POST/PATCH/DELETE) уязвимы к атакам через `
` и `` теги. ## Суть **SameSite=Strict** — браузер не отправляет куку при запросах с других сайтов, даже при top-level navigation. В production для refresh token установлен `SameSite=Strict`. Дополнительно требуется CSRF-токен для всех state-changing запросов, так как SameSite=Strict блокирует и легитимные cross-site переходы. ## Реализация в проекте ```go sameSite := http.SameSiteLaxMode if h.isProd { sameSite = http.SameSiteStrictMode } cookie := &http.Cookie{ Name: refreshTokenCookieName, Value: token, Path: "/", HttpOnly: true, Secure: h.isProd, SameSite: sameSite, ... } ``` Файл: `backend/internal/handlers/auth.go:150-161` ## Альтернативы | Подход | Плюсы | Минусы | |--------|-------|--------| | SameSite=Strict | Просто, ничего не менять на фронте | Ломает OAuth/редиректы | | CSRF-токен (Double Submit Cookie) | Гибко, OWASP recommended | Нужен middleware, состояние на клиенте | | Origin проверка + SameSite=Lax | Совместимо с редиректами | Слабее Strict | ## Связанные заметки - [[backend-auth-security]] - [[frontend-api-client]] - [[MOC-security-patterns]] #security #csrf #cookies #auth #best-practice