我們為什麼需要 Origin?
重要性:5
正如你所知,有一個 HTTP 標頭 Referer
,通常包含發起網路要求的頁面網址。
例如,當從 https://javascriptinfo.dev.org.tw/some/url
擷取 http://google.com
時,標頭如下所示
Accept: */*
Accept-Charset: utf-8
Accept-Encoding: gzip,deflate,sdch
Connection: keep-alive
Host: google.com
Origin: https://javascriptinfo.dev.org.tw
Referer: https://javascriptinfo.dev.org.tw/some/url
如你所見,Referer
和 Origin
都存在。
問題
- 如果
Referer
擁有更多資訊,為什麼需要Origin
? Referer
或Origin
可能不存在嗎?還是這是錯誤的?
我們需要 Origin
,因為有時 Referer
不存在。例如,當我們從 HTTPS 擷取 HTTP 頁面(從較安全的存取較不安全的)時,就沒有 Referer
。
內容安全政策 可能禁止傳送 Referer
。
正如我們將看到的,fetch
有選項可以防止傳送 Referer
,甚至允許在(同一個網站內)更改它。
根據規範,Referer
是可選的 HTTP 標頭。
正是由於 Referer
不可靠,所以才發明了 Origin
。瀏覽器保證跨來源請求的 Origin
正確。