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