Для чего используется атрибут SameSite у cookie?

Ответ

Атрибут SameSite управляет тем, отправляются ли cookie с кросс-сайтовыми (cross-site) запросами. Это важный механизм защиты от атак типа межсайтовой подделки запроса (CSRF) и утечки конфиденциальных данных.

Значения атрибута:

  • Strict: Cookie отправляются только в контексте того же сайта (точно совпадающий домен). Не отправляются при переходе по ссылке с другого сайта. Максимальная безопасность, но может нарушить UX (например, после входа по ссылке из почты пользователь окажется неавторизованным).
  • Lax (значение по умолчанию в современных браузерах): Cookie отправляются при безопасных методах запроса (GET) и во время навигационных переходов (например, переход по ссылке). Блокирует отправку cookie в кросс-сайтовых POST-запросах, что предотвращает большинство CSRF-атак.
  • None: Cookie отправляются при любых кросс-сайтовых запросах. Обязательно требует установки флага Secure (передача только по HTTPS). Используется для функциональности, требующей кросс-доменного взаимодействия (например, виджеты, аутентификация в iframe).

Пример установки в Node.js с Express:

// Установка сессионной куки с SameSite=Lax
res.cookie('sessionId', 'abc123', {
  httpOnly: true,   // Защита от доступа через JavaScript (XSS)
  secure: process.env.NODE_ENV === 'production', // Только по HTTPS в продакшене
  sameSite: 'lax',  // Баланс безопасности и удобства
  maxAge: 24 * 60 * 60 * 1000 // Срок жизни 1 день
});

Ответ 18+ 🔞

Да ты посмотри, какая хитрая жопа эти куки придумала! Ну сидят они в браузере, тихие такие, а потом — бац! — и лезут куда не надо, на левые сайты, всю твою сессию проёбывают. Это ж пиздопроебибна ситуация, когда какой-нибудь полупидор со стороннего ресурса запрос от твоего имени слать начинает. Так вот, чтобы этого не было, и впендюрили атрибут SameSite.

Короче, на что он влияет:

  • Strict: Самый строгий режим. Кука — как собака на цепи: никуда со своего двора (домена) не убежит. Даже если ты по ссылке с почты перешёл, она не отправится. Безопасность — овердохуища, но пользователь может охуеть, когда его после такого перехода разлогинит. Эдакий принцип «доверия ебать ноль».
  • Lax (сейчас по умолчанию везде): Умный компромисс. Кука не будет соваться в чужие POST-запросы (основной вектор для CSRF-атак), но при этом если пользователь просто по ссылке перешёл (GET-запрос), она отправится. Почти всю хуйню отсекает, и люди не орут.
  • None: Полный распиздяйский режим. «Лети, кука, лети!» — отправляется вообще везде. Но за такое вольнодумство обязательно нужен флаг Secure, то есть только по HTTPS. Без него браузер тебе просто хуй с горы покажет и куку проигнорит. Нужно это редко, для каких-нибудь виджетов, встроенных в другие сайты.

Вот как это в коде выглядит, чтоб ты не бздел:

// Ставим сессионную куку с умными настройками
res.cookie('sessionId', 'abc123', {
  httpOnly: true,   // Чтобы какой-нибудь мартышлюшка через JS её не стырил
  secure: process.env.NODE_ENV === 'production', // В продакшене — только HTTPS, ясен хуй
  sameSite: 'lax',  // Золотая середина, чтоб и волка (CSRF) нахуй послать, и пользователя не обидеть
  maxAge: 24 * 60 * 60 * 1000 // Живёт сутки
});

Вот и вся магия. Главное — не забывай про secure для SameSite=None, а то будет тебе, чувак, не хиросима, а настоящий нигерсраки в продакшене.