4

我有一个API从我的 React 应用程序调用的端点。那API是在同一个域上。就像是:

https://www.example.com
https://www.example.com/api/update-something

cross-fetch用来做那个请求。

我期待在我的服务器日志上看到一个Origin标题。事实上,我期待看到Origin: https://www.example.com

但这是我得到的:

Origin: undefined

// AND I ALSO GET THESE HEADERS

"sec-fetch-dest":"empty",
"sec-fetch-mode":"cors",
"sec-fetch-site":"same-origin"

他们的意思是什么?好像Origin支票已经办好了?

例如:如果我得到sec-fetch-site: cross-site这意味着呼叫是在另一个网站/域中生成的?那是对的吗?

参考:

Sec-Fetch-Site: cross-site
Sec-Fetch-Site: same-origin
Sec-Fetch-Site: same-site
Sec-Fetch-Site: none
4

2 回答 2

11

我有一个从我的 React 应用程序调用的 API 端点。该 API 在同一个域上。…我期待在我的服务器日志上看到一个Origin标题。

根据 Fetch 规范要求,浏览器不发送Origin同源请求。GET✳️

就像已经进行了起源检查

是的——浏览器知道:

  • 发出请求的代码的来源
  • 发出请求的资源的来源
  • 请求方法

…并且浏览器在决定是否添加Origin标题之前检查所有这些;如果Origin来源匹配且方法为GET.

// AND I ALSO GET THESE HEADERS
"sec-fetch-dest":"empty",
"sec-fetch-mode":"cors",
"sec-fetch-site":"same-origin"

他们的意思是什么?…例如:如果我得到sec-fetch-site: cross-site这意味着呼叫是在另一个网站/域中生成的?那是对的吗?

https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header有详细信息:

Sec-Fetch-Site 值 值表示什么
同源 发出请求的来源与发出请求的代码的来源相匹配。
同一地点 发出请求的来源和发出请求的代码来源具有相同的“可注册域”</em>(有时也称为“相同 eTLD+1”</em>或“相同有效顶级域名加一”</em>);所以,例如,https://subdomain.example.comhttps://example.com是同一个站点(即使不是同源)。
跨站 发出请求的来源和发出请求的代码来源既不是同源,也不是同站点,而是具有不同的可注册域。
没有任何 该请求不是由前端代码以编程方式发起的(例如,不是由 XHR/fetch/ajax 调用),而是由普通用户导航发起的——也就是说,由用户执行类似直接将地址放入浏览器 URL 栏中的操作,或单击超链接。

✳️ 导致在Origin同源GET请求中省略标头的规范要求:

最终是否Origin添加标头取决于请求的“响应污染”</a>,其值以“ basic”开头,对于同源请求,Fetch 算法将其设置为“ basic”,根据“Main fetch”算法的第 12 步

request的当前 url 的 origin 与request的 origin 相同,并且request的 response tainting 是 " basic"
...</p>

  1. 将请求的响应污染设置为“ basic”。
  2. 返回给定fetchParams运行方案 fetch的结果。

运行方案 fetch会导致调用附加请求 `Origin` 标头算法,并且Origin仅在以下至少一项为真时才导致添加标头:

  • 请求的响应污染是“ cors
  • 请求的模式是“ websocket
  • 请求的方法既不是GET也不是HEAD

但是对于 same-origin GET,响应污染不是cors(而是根据上面的要求,它是basic),请求模式不是websocket,当然方法也不是GET也不是HEAD(它是GET);因此,该算法要求浏览器不添加Origin标题。

于 2021-02-16T16:59:04.190 回答
0

Origin 标头与 CORS 请求以及 POST 请求一起发送。使用 HEAD 或 GET 方法在 Fetch 请求上未设置 Origin 标头

来自: 原始标题

于 2021-02-09T08:59:07.480 回答