Зачем нужен Origin?
Как вы, наверняка, знаете, существует HTTP-заголовок Referer
, в котором обычно указан адрес страницы, с которой инициирован запрос.
Например, при отправке XMLHttpRequest
со страницы http://javascript.ru/some/url
на http://google.ru
, заголовки будут примерно такими:
Accept:*/*
Accept-Charset:windows-1251,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Host:google.ru
Origin:http://javascript.ru
Referer:http://javascript.ru/some/url
Как видно, здесь присутствуют и Referer
и Origin
.
Итак, вопросы:
- Зачем нужен
Origin
, еслиReferer
содержит даже более полную информацию? - Может ли быть такое, что заголовка
Referer
нет или он неправильный?
Origin
нужен, потому что Referer
передаётся не всегда. В частности, при запросе с HTTPS на HTTP – нет Referer
.
Политика Content Security Policy может запрещать пересылку Referer
.
По стандарту Referer
является необязательным HTTP-заголовком, в некоторых браузерах есть настройки, которые запрещают его слать.
Именно поэтому, ввиду того, что на Referer
полагаться нельзя, и придумали заголовок Origin
, который гарантированно присылается при кросс-доменных запросах.
Что же касается «неправильного» Referer
– это из области фантастики. Когда-то, много лет назад, в браузерах были ошибки, которые позволяли подменить Referer
из JavaScript, но они давно исправлены. Никакая «злая страница» не может его подменить.