tl; dr, клиент XHR в домене A отправляет запрос на сервер в домене B, сервер отвечает Set-Cookie
с Domain=A
(домен клиента, XHR Origin
),все заголовки CORS установлены правильно, должно ли это работать?
Хорошо известно, что нельзя установить cookie в другой домен.( Как установить cookie для другого домена
Однако с учетом следующего сценария:
Действующие лица:
Клиент в домене A , веб-клиент
Сервер в домене B , настройка с заголовками CORS, допускающими A в качестве источника, включая Access-Control-Allow-Credentials
установлен на true
Поток связи 1 (базовый уровень):
- Клиент отправляет простой запрос GET на сервер
- Сервер отвечаетс cookie и устанавливает свойство Domain для сервера (Domain = B )
- Клиент отправляет еще один HXR-запрос и имеет
withCredentials=true
- Cookieотправляется обратно на сервер без проблем
Примечание : файл cookie, отправленный на шаге 1, не отображается в document.cookies, даже если он не был установленкак httpOnly (так как он не принадлежит домену клиента). Также попытка получить его из xhr
, посмотрев на заголовок «Set-Cookie», вы будетезаблокировано, по замыслу: https://fetch.spec.whatwg.org/#forbidden-response-header-name он даже не будет отображаться в инструментах Chrome dev на вкладке сети!но он все равно будет отправлен)
Поток связи 2 (мой вопрос):
- Клиент отправляет простой запрос GET на сервер
- Серверотвечает cookie, но устанавливает свойство Domain для клиента (Domain = A )
- Клиент отправляет запрос HXR и имеет
withCredentials=true
- cookie не отправляется обратно и, похоже, нигде не хранится
Почему я немного удивлен?Так как XHR-источник A и запрашивает что-то, что устанавливает cookie в домен A (если я посмотрю в Postman, я отчетливо вижу, что заголовок Set-Cookie
отправляется с Domain
такой же, как в запросе Origin
), и у меня для этого есть наиболее допустимая настройка CORS, в чем причина того, что я не позволил это сделать?(Я ожидал, что он потерпит неудачу, но все же заставил меня задуматься)
Вопросы
Где находится лучшее место в спецификации / RFC, где разъясняется, чтоэто не будет работать и для XHR, где cookie Domain
равен Origin
Каков вектор атаки в сценарии 2, если теоретически браузер сделал разрешить серверу сохранять cookie, если и только если Origin
совпадает с cookie Domain
, а источник CORS разрешает этот источник.
Есть ли другой способ заставить его работать?Может быть, это работает, но мой POC был настроен неправильно?
Приложение: Reasoning
Я ищу способ использовать перекрестный источник CSRF, используя что-то вроде Cookie to header token метод , но из-за проблемы перекрестного происхождения кажется, что это невозможно.Единственный обходной путь, о котором я подумал, - это отправка токена CSRF в качестве заголовка с сервера, после чего клиент может просто сохранить его как файл cookie, к которому он может получить доступ позже, есть ли другой способ сделать это?Это считается безопасным?