Почему нам нужен Origin?
Как вы, вероятно, знаете, существует HTTP-заголовок Referer, который обычно содержит адрес страницы, инициировавшей сетевой запрос.
Например, при запросе (fetch) http://google.com с http://javascript.info/some/url заголовки выглядят так:
Accept: */*
Accept-Charset: utf-8
Accept-Encoding: gzip,deflate,sdch
Connection: keep-alive
Host: google.com
Origin: http://javascript.info
Referer: http://javascript.info/some/url
Как вы можете видеть, присутствуют и Referer, и Origin.
Вопросы:
- Почему нужен
Origin, еслиRefererсодержит даже больше информации? - Возможно ли отсутствие
RefererилиOrigin, или это неправильно?
Нам нужен Origin, потому что иногда Referer отсутствует. Например, когда мы запрашиваем через fetch HTTP-страницу с HTTPS (менее безопасный доступ с более безопасного), то Referer нет.
Content Security Policy (политика безопасности содержимого) может запретить отправление Referer.
Как мы увидим позже, у fetch есть опции, которые предотвращают отправку Referer и даже позволяют изменять его (в пределах того же сайта).
Согласно спецификации, Referer является необязательным HTTP-заголовком.
Именно потому что Referer ненадёжен, был изобретён Origin. Браузер гарантирует наличие правильного Origin при запросах на другой источник.