为什么我们需要 Origin?
重要性:5
如您所知,存在 HTTP 标头 Referer
,它通常包含发起网络请求的页面的 URL。
例如,当从 https://javascript.js.cn/some/url
获取 http://google.com
时,标头如下所示
Accept: */*
Accept-Charset: utf-8
Accept-Encoding: gzip,deflate,sdch
Connection: keep-alive
Host: google.com
Origin: https://javascript.js.cn
Referer: https://javascript.js.cn/some/url
如您所见,Referer
和 Origin
都存在。
问题
- 如果
Referer
包含更多信息,为什么还需要Origin
? - 是否可能没有
Referer
或Origin
,或者这是否不正确?
我们需要 Origin
,因为有时 Referer
会缺失。例如,当我们从 HTTPS 获取 HTTP 页面(从更安全的页面访问不太安全的页面)时,就不会有 Referer
。
内容安全策略 (Content Security Policy) 可能禁止发送 Referer
。
正如我们所见,fetch
具有防止发送 Referer
甚至允许更改 Referer
(在同一站点内)的选项。
根据规范,Referer
是一个可选的 HTTP 头。
正是因为 Referer
不可靠,所以发明了 Origin
。浏览器保证跨域请求的 Origin
正确。