我们为什么需要源(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。