Вернуться к уроку

Зачем нужен Origin?

важность: 5

Как вы, наверняка, знаете, существует 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.

Итак, вопросы:

  1. Зачем нужен Origin, если Referer содержит даже более полную информацию?
  2. Может ли быть такое, что заголовка Referer нет или он неправильный?

Origin нужен, потому что Referer передаётся не всегда. В частности, при запросе с HTTPS на HTTP – нет Referer.

Политика Content Security Policy может запрещать пересылку Referer.

По стандарту Referer является необязательным HTTP-заголовком, в некоторых браузерах есть настройки, которые запрещают его слать.

Именно поэтому, ввиду того, что на Referer полагаться нельзя, и придумали заголовок Origin, который гарантированно присылается при кросс-доменных запросах.

Что же касается «неправильного» Referer – это из области фантастики. Когда-то, много лет назад, в браузерах были ошибки, которые позволяли подменить Referer из JavaScript, но они давно исправлены. Никакая «злая страница» не может его подменить.