Навіщо нам Origin?
Як ви, мабуть, знаєте, існує HTTP-заголовок Referer
, який зазвичай містить URL-адресу сторінки, що ініціювала мережевий запит.
Наприклад, під час отримання 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
для запитів між різними джерелами.