Контекст: 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 |
#security #csrf #cookies #auth #best-practice