Ответ 1
Насколько требуют спецификации, вопрос выше должен быть разделен на пару ответов:
- Когда браузеры должны отправить заголовок Origin
- Когда браузеры должны внутренне установить происхождение значение Thatll получить сериализации в
null
Я сомневаюсь, что то, что требуется Firefox для этого (где оно отличается от спецификации), перечислено. Но что касается перечисления спецификационных требований, то здесь они, во всех подробностях, разделены на две части:
Когда браузеры должны отправить заголовок Origin
Ответ на вопрос Когда браузеры должны отправлять заголовок Origin? is: заголовок Origin
отправляется только для любого запроса, который спецификация Fetch определяет как запрос CORS:
CORS-запрос - это HTTP-запрос с заголовком
Origin
. Он не может быть надежно идентифицирован как участвующий в протоколе CORS, поскольку заголовокOrigin
также включен для всех запросов, метод которых не является ниGET
ниHEAD
.
Фактический оператор в спецификации Fetch, который требует, чтобы браузеры отправляли заголовок Origin
для всех запросов, чей метод не является ни GET
ни HEAD
:
Если установлен флаг CORS или метод httpRequests не является ни
GET
ниHEAD
, то добавьтеOrigin
/httpRequests origin, serialized и UTF-8 закодированный в список заголовков httpRequests.
Так что требует браузеры для отправки Origin
для всех POST
запросов, в том числе одного источника POST
(который по определению в Fetch на самом деле являются "CORS запросы" -Еще хотя Theyre же происхождения).
Примечание. Выше описано, как спецификация Fetch в настоящее время определяет требования, в связи с изменением, внесенным в спецификацию на 2016-12-09. До тех пор требования были другими:
- ранее не
Origin
было отправлено на POST-же происхождение - ранее
Origin
было отправлено для отправки POST из<form>
(без CORS)
Поэтому я думаю, что поведение Firefox, описанное в этом вопросе, соответствует тому, что ранее требовалось для спецификации, а не тому, что требует спецификация в настоящее время.
Другими случаями, когда браузеры должны отправлять заголовок Origin
являются любые случаи, когда запрос выполняется с установленным "флагом CORS", который, насколько запросы HTTP (S) , websocket
, когда режим запроса - navigate
, websocket
, same-origin
или no-cors
.
XHR всегда устанавливает режим на cors
. Но с помощью API Fetch эти режимы запросов можно установить в поле mode
аргумента init-object метода fetch(…)
:
fetch("http://example.com", { mode: 'no-cors' }) // no Origin will be sent
Наряду с этим для любого элемента с атрибутом crossorigin
(он же "атрибут установки CORS) спецификация HTML требует, чтобы браузеры установили режим запроса cors
(и отправили заголовок Origin
).
В противном случае для любых элементов, которые инициируют запросы (скрипты, таблицы стилей, изображения, медиа-элементы), режим для запросов по умолчанию равен no-cors
, что означает, что заголовок Origin
для них не отправляется.
Так что выше приведены подробности об условиях, при которых браузеры отправляют заголовок Origin
.
Следующая часть ответа о том, когда исходное значение будет установлено равным null
.
Когда браузеры должны установить origin на значение, которое будет сериализовано как null
Отдельно от требований, когда браузеры должны отправлять заголовок Origin
есть требования, когда браузеры должны устанавливать источник в null
, которые определены в следующих спецификациях:
Спецификация HTML использует термин непрозрачное происхождение и говорит следующее:
Внутреннее значение, без сериализации, из которого оно может быть воссоздано (оно сериализуется как "ноль" для ASCII-сериализации источника), для которого единственной значимой операцией является проверка на равенство.
Другими словами, везде, где спецификация HTML говорит о непрозрачном происхождении, вы можете перевести это на null
.
Спецификация HTML требует, чтобы браузеры устанавливали непрозрачный источник или уникальный источник в следующих случаях:
- Изображения перекрестного происхождения (включая элементы
img
перекрестного происхождения) - Мультимедийные данные о происхождении (включая
video
иaudio
) - Любой документ, сгенерированный из
data:
URL - Любой
iframe
с атрибутомsandbox
который не содержит значениеallow-same-origin
- Любой документ, программно созданный с использованием
createDocument()
и т.д. - Любой документ, который не имеет контекста просмотра создателя
- Ответы, которые являются ошибками сети
- Должна ли политика безопасности контента блокировать ответ навигации на запрос навигации типа от источника в цели? Алгоритм возвращает Заблокированный при выполнении в ответе навигации
Спецификация Fetch требует, чтобы браузеры устанавливали в качестве источника "глобально уникальный идентификатор" (что в основном означает то же самое, что и "непрозрачное происхождение", что в основном означает null
…) в одном случае:
Спецификация URL требует, чтобы браузеры устанавливали непрозрачный источник в следующих случаях:
- Для
blob:
URL - Для
file:
URL - Для любых других URL, чья схема не относится к
http
,https
,ftp
,ws
,wss
илиgopher
.
Но его важно понимать, что только потому, что браузер внутренне установлен непрозрачный происхождение, по существу null
-Вота обязательно не означает, что браузер отправит Origin
заголовок. Так что смотрите первую часть этого ответа, чтобы узнать, когда браузеры должны отправлять заголовок Origin
.