atomic-csrf-protection.md 1.8 KB

CSRF-защита для API с cookie-based аутентификацией

Контекст: PhotoPlaces использует HttpOnly cookie для refresh token. Без CSRF-защиты state-changing запросы (POST/PATCH/DELETE) уязвимы к атакам через <form> и <img> теги.

Суть

SameSite=Strict — браузер не отправляет куку при запросах с других сайтов, даже при top-level navigation. В production для refresh token установлен SameSite=Strict.

Дополнительно требуется CSRF-токен для всех state-changing запросов, так как SameSite=Strict блокирует и легитимные cross-site переходы.

Реализация в проекте

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