返回课程

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

如您所见,RefererOrigin 都存在。

问题

  1. 如果 Referer 包含更多信息,为什么还需要 Origin
  2. 是否可能没有 RefererOrigin,或者这是否不正确?

我们需要 Origin,因为有时 Referer 会缺失。例如,当我们从 HTTPS 获取 HTTP 页面(从更安全的页面访问不太安全的页面)时,就不会有 Referer

内容安全策略 (Content Security Policy) 可能禁止发送 Referer

正如我们所见,fetch 具有防止发送 Referer 甚至允许更改 Referer(在同一站点内)的选项。

根据规范,Referer 是一个可选的 HTTP 头。

正是因为 Referer 不可靠,所以发明了 Origin。浏览器保证跨域请求的 Origin 正确。