pavelkarinin
@pavelkarinin
Full Stack Web Developer

Больной вопрос: принятие cookie при кросс-доменных запросах?

Перелопатив множество спецификаций и "рекомендации" не могу прийти к конечному понимаю для выполнения простой задачи:
Есть домен first.com, клиентский сценарий которого отправляет методом POST запрос (XMLHttpRequest) на домен second.com:

var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://second.com/some_path', true);
xhr.onloadend = function() { ... };
xhr.send(request_body);

в ответ на этот запрос сервер second.com должен прислать cookie, которые в дальнейшем будут нужны только домену second.com. При этом сервер second.com отправляет следующие заголовки:

Access-Control-Allow-Origin: https://first.com
Access-Control-Allow-Methods: POST, OPTIONS, HEAD

Замечу (в моем случае) нет необходимости передавать значения этих присланных cookies в сценарий first.com или вообще куда-либо, они просто должны быть проставлены для second.com, к тому же (в моем случае) присылаются cookies с флагом HttpOnly.
Вопрос вот в чем:
  1. Будут ли приняты/установлены домену second.com эти присланные в ответ cookie, т.е. сохранятся ли они при последующих запросах в сторону second.com?
  2. Может нужны дополнительные заголовки при отправке запроса на second.com и/или дополнительные заголовки в ответе от сервера?

Этот вопрос я задаю не только для себя, а как я понял и для многих других, на Тостере есть подобные вопросы, но нет внятных ответов или я их не нашел (что скорее всего).
  • Вопрос задан
  • 1017 просмотров
Решения вопроса 1
pavelkarinin
@pavelkarinin Автор вопроса
Full Stack Web Developer
Буквально перед публикацией проекта, отвечаю себе (а может и другим, в том числе dimonchik2013) на собственный вопрос. Когда я задавался этим вопросом, у меня физически не было возможности проверить свои предположения, поскольку на тот момент только продумывались разные нюансы. Сложность вопроса заключалась по большей части в том, что браузеры по-разному ведут себя со сторонними куки + личные настройки пользователей. И по сей день нет единого рецепта для 100% простановки куки при кросс-доменных запросах, хотя некоторые подвижки есть (но это отдельная тема).

Вопрос был решён комбинированием уже имеющихся практик решения данной проблемы, а именно так: на странице first.com размещаем пустой и невидимый iframe, в него загружаем страницу с домена second.com, которая исполняет сценарий, создавая форму, с методом POST и action-адресом, по которому в ответ сервер выставит куки (разумеется, для second.com, как в моем случае и было необходимо). После этого iframe средствами postMessage может "информировать" родительское окно, что все прошло гладко или что-то случилось в свою очередь родительское окно удалить этот iframe. Все браузеры с включёнными куки, но с разными установками на предмет принятия сторонних куки прекрасно справились с этим сценарием.

5ae8e00c87193831000117.jpeg

Хочу так же заметить: часто вижу (и даже на Хабре есть такой пример), что вместо формы для таких случаев используют еще одни вложенный iframe с адресом , по которому сервер выставит куки - не стоит этого делать, так как такой способ срабатывает не во всех браузерах, нужен именно POST запрос и именно на форму (особенно для Safari).

В моем случае таких разных second.com должно быть 4, поэтому описанный выше сценарий запускается в цикле для каждого необходимого домена. В итоге весь процесс проходит параллельно для этих перечисляемых доменов. Задержки, связанные с временем загрузки контента в iframe, отправки форм и получения ответа в моем сценарии не имеют значения, но учитывая размер кода для создания и ее отправки вес там минимальный, остальное зависит от сети и скорости отдачи на сервере. В моем случае это не играет большой роли.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
что мешает проверить ручками?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы