Вопрос или проблема
Кросс-доменные AJAX-запросы с использованием Fetch с учетными данными: ‘include’ и куки, установленной с SameSite=None, не отправляются в Firefox.
Я пытаюсь сделать межсайтовый AJAX-запрос с помощью fetch с attacker.local на defender.local, и я хочу, чтобы этот запрос включал куки, которые установлены на defender.local.
Я следовал этому руководству: https://stackoverflow.com/a/67001424
https://defender.local установил куки с помощью этого заголовка:
Set-Cookie: secure-cookie=secure-cookie-value; Max-Age=86400; Domain=.defender.local; Path=/; Expires=Сб, 21 Сен 2024 16:50:02 GMT; Secure; SameSite=None
Мой запрос fetch (с attacker.local) выполнен с помощью:
fetch('https://defender.local', {
method: 'post',
credentials: 'include',
});
defender.local отвечает с этими заголовками:
Access-Control-Allow-Origin: https://attacker.local
Access-Control-Allow-Credentials: true
Выполняя этот запрос в Chrome v129, куки включены, но не в Firefox v130.
Почему куки не включены в POST-запрос на Firefox?
Firefox защищает пользователей от межсайтовых запросов, которые могли бы использовать куки назначения, запрещая куки в таких межсайтовых запросах, когда включена Защита от отслеживания:
При отключенной Защите от отслеживания Firefox отправит куки:
Ответ или решение
Ваша проблема заключается в том, что Firefox защищает своих пользователей от потенциальных угроз, связанных с кросс-доменными запросами, что может объяснить отсутствие отправки cookie в вашем запросе. Давайте подробнее рассмотрим это.
-
Настройка Cookie: Вы указали, что cookie на
defender.local
настроены с заголовком:Set-Cookie: secure-cookie=secure-cookie-value; Max-Age=86400; Domain=.defender.local; Path=/; Expires=Sat, 21 Sep 2024 16:50:02 GMT; Secure; SameSite=None
Это означает, что cookie соответствует требованию безопасности, так как установлены флаги
Secure
иSameSite=None
. -
Запрос с использованием Fetch API: Ваш запрос выглядит следующим образом:
fetch('https://defender.local', { method: 'post', credentials: 'include', });
-
CORS и заголовки ответа: Вы правильно указали заголовки ответа сервера:
Access-Control-Allow-Origin: https://attacker.local Access-Control-Allow-Credentials: true
Это означает, что сервер допускает кросс-доменные запросы от
attacker.local
и поддерживает передачу учетных данных. -
Enhanced Tracking Protection в Firefox: Основная причина, по которой cookie не отправляется в Firefox, связана с функцией «Улучшенной защиты от отслеживания» (Enhanced Tracking Protection). Эта функция блокирует кросс-доменные запросы, использующие cookie, что может объяснить поведение, которое вы наблюдаете.
- Если «Улучшенная защита от отслеживания» включена, Firefox не отправит cookie при кросс-доменных запросах, даже если все заголовки настроены правильно.
- Чтобы проверить это, вы можете отключить «Улучшенную защиту от отслеживания» в настройках Firefox для вашего сайта.
Для этого перейдите в настройки конфиденциальности и безопасности Firefox и убедитесь, что уровень защиты стоит на «Стандартный» или «Настроенный», где отключены параметры, касающиеся блокировки кросс-доменных cookie.
- Вывод: Невозможность отправки cookie в запросах из Firefox может быть связана с политикой конфиденциальности браузера, а не с неправильной настройкой вашего кода или сервера. Рекомендуется проверить настройки браузера, а также протестировать работу вашего приложения в режиме инкогнито (где обычно отключена «Улучшенная защита от отслеживания») или в другом браузере.
Если вы хотите, чтобы поведение было одинаковым в разных браузерах, вам нужно учитывать настройки приватности пользователей и рекомендовать пользователям браузеров, которые могут блокировать такие запросы.