回到课程

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

正如你所看到的,存在 RefererOrigin

问题是:

  1. 为什么需要 Origin,如果 Referer 甚至具有更多信息?
  2. 如果这里没有 RefererOrigin 可行吗,还是说会出问题?

我们需要 Origin,是因为有时会没有 Referer。例如,当我们从 HTTPS(从高安全性访问低安全性)fetch HTTP 页面时,便没有 Referer

内容安全策略 可能会禁止发送 Referer

正如我们将看到的,fetch 也具有阻止发送 Referer 的选项,甚至允许修改它(在同一网站内)。

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

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