我们为什么需要源(Origin)?
重要程度: 5
你可能知道有一个 HTTP-header Referer
,它通常包含发起网络请求的页面的 url。
例如,当从 http://javascript.p2hp.com/some/url
fetch http://google.com
时,header 看起来如下:
Accept: */*
Accept-Charset: utf-8
Accept-Encoding: gzip,deflate,sdch
Connection: keep-alive
Host: google.com
Origin: http://javascript.p2hp.com
Referer: http://javascript.p2hp.com/some/url
正如你所看到的,存在 Referer
和 Origin
。
问题是:
- 为什么需要
Origin
,如果Referer
甚至具有更多信息? - 如果这里没有
Referer
或Origin
可行吗,还是说会出问题?
我们需要 Origin
,是因为有时会没有 Referer
。例如,当我们从 HTTPS(从高安全性访问低安全性)fetch
HTTP 页面时,便没有 Referer
。
内容安全策略 可能会禁止发送 Referer
。
正如我们将看到的,fetch
也具有阻止发送 Referer
的选项,甚至允许修改它(在同一网站内)。
根据规范,Referer
是一个可选的 HTTP-header。
正是因为 Referer
不可靠,才发明了 Origin
。浏览器保证跨源请求的正确 Origin
。