api - 在 CORS 请求的 POST 之前使用 OPTION 请求的背后原因是什么?

标签 api rest http browser

<分区>

发送 OPTION 的原因是什么?在实际 POST 之前请求, UPDATE , PUTDELETE当调用不同的域时请求? (所以在 CORS 请求上)我知道它应该检查服务器是否可以处理真正的请求,但为什么不立即发送真正的请求呢?

我想到的一些原因:

  1. 查看是否支持该方法
    • 发送真正的请求会返回相同的状态码,所以 无需发送 OPTION先请求。
  2. 检查用户是否允许发送请求
    • 没有任何意义,因为 OPTION 没有发送任何身份验证 header 。要求
  3. 防止服务器负载过重
    • 没有意义,因为在处理数据之前检查身份验证规则。
  4. 检查是否允许请求的 header 和来源
    • 这就是它现在的工作方式,但为什么不直接发送请求,我们可以从真实请求中读取错误。
  5. 如果不处理则阻止发送 post 数据
    • 这是有效的唯一原因。使用选项请求将防止不必要地将发布数据发送到服务器。但是我认为这在 99% 的时间里都不是问题,因为只发送了一小块数据。

有人可以阐明浏览器供应商实现 OPTION 的原因吗?调用不同域时的请求?

最佳答案

CORS 基本上是一种浏览器安全功能,而不是服务器端。

默认情况下,浏览器不允许某些跨源请求。您正在与之交谈的服务器可以发布使用跨源请求是否安全,但理解和使用该信息的是客户端,因此提供保护而不是服务器。

所以对于GET请求,你可以获取资源,检查CORS头,然后根据头决定是否处理它。漂亮而简单。

对于 POST(或其他更改的)事件,事情就没那么简单了。您发出 POST 请求,服务器处理它(记住服务器不关心 CORS,只关心浏览器)并发回响应。浏览器发现 CORS 未启用并忽略响应,但到那时为时已晚 - POST 请求已在服务器端处理,所有被阻止的是显示已处理的结果。因此,对于网上银行应用程序,例如,一个恶意的转账请求意味着资金将被转账,但您的浏览器将忽略“资金转账成功”的响应——重要的是,由于钱已经消失,恶意请求已经造成了损害无论如何都可能会忽略响应!

因此,在知道响应中的 CORS header 是什么之前,您无法发送请求 - 这需要发送请求!先有鸡还是先有蛋。

因此浏览器向同一地址发送一个 OPTIONS 请求,该地址不会像 POST 请求那样改变任何内容,但返回 CORS header 。之后浏览器知道发送真实请求是否安全。

顺便说一句,服务器不实现 CORS 安全性的原因是更改 Referrer header 非常容易,因此无论如何它都不会提供任何保护。服务器将具有其他安全功能(例如,检查 session 是否有效并获得发出请求的授权),但 CORS 旨在防止的攻击是这些功能无济于事的攻击(例如,用户登录在另一个选项卡上转到他们的网上银行)。

关于api - 在 CORS 请求的 POST 之前使用 OPTION 请求的背后原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38375124/

相关文章:

java - Facebook API for Java 应用程序(例如,使用 Swing 库)

json - 发出获取请求时出错以及如何在接收到数据后显示数据

c# - 通过 REST 发送大量数据 - 最佳实践

java - 如何为 MERGE 语句发送适当的 HTTP 状态?

java - RESTful 应用程序编辑未反射(reflect)在 tomcat 上

http - 如何启动Web服务器以在golang的浏览器中打开页面?

php - 如何使用 PHP 使用 LinkedIn 注册 API 获取电子邮件地址

http - 从 Wireshark 捕获中提取 GET URI 或它们的响应到单独的文件

java - 带有多部分消息的 HTTP gzip 编码

api - Datadog monitor API/terraform process monitor 检查