Какие настройки безопасности есть у куки и что делают HttpOnly и Secure
Что проверяют
Знаете ли вы, от чего конкретно защищает каждый флаг, и не путаете ли XSS с CSRF. Ответ «HttpOnly нужен для безопасности» ничего не стоит. Следом обычно спрашивают, где хранить токен авторизации и почему SameSite не закрывает CSRF целиком.
Как отвечать
Пройдите по атрибутам Set-Cookie:
HttpOnly: куку не видно из JavaScript черезdocument.cookie. Это защита не от XSS вообще, а от кражи значения: чужой скрипт всё ещё может дёргать ваш API от имени пользователя, потому что браузер приложит куку сам;Secure: кука уходит только по HTTPS. Исключение оставлено дляlocalhost, чтобы не мешать разработке;SameSite: по умолчанию в Chrome этоLax, кука не уходит на кросс-сайтовый POST, но идёт при обычном переходе по ссылке.Strictотрезает и переходы,Noneразрешает всё и обязательно требуетSecure, иначе браузер просто отбросит куку;DomainиPath: указанныйDomainрасширяет куку на все поддомены, поэтому дыра на любом из них становится вашей. Не указывайтеDomain, если он не нужен;ExpiresиMax-Age: без них кука живёт до закрытия браузера;- префиксы
__Host-и__Secure-: за правилами следит сам браузер.__Host-требуетSecureиPath=/и запрещаетDomain, то есть поддомен не сможет подменить вашу куку; Partitioned: отдельное хранилище куки под каждый сайт верхнего уровня, нужно встраиваемым виджетам.
Рецепт для сессии: Set-Cookie: __Host-session=...; HttpOnly; Secure; SameSite=Lax; Path=/. Плюс смена идентификатора сессии при входе и отдельный CSRF-токен либо проверка заголовка Origin на изменяющих запросах.
Где спотыкаются
Кладут JWT в localStorage, потому что «так удобнее читать имя пользователя». Любой сторонний скрипт на странице прочитает оттуда токен, а HttpOnly-кука такого не позволит.
Ставят SameSite=None без Secure и теряют куку молча: в консоли предупреждение, в проде неработающая авторизация внутри чужого iframe.
Считают, что SameSite=Lax заменяет защиту от CSRF. Он не закрывает меняющие состояние GET-запросы, атаки с соседнего поддомена и старые клиенты, так что токен на изменяющих запросах остаётся нужен.