跨域资源共享 是一种允许网页向另一个域(来自Wikipedia)发出 XMLHttpRequests 的机制。
在过去的几天里,我一直在摆弄 CORS,我想我对一切是如何运作的有了很好的理解。
所以我的问题不是关于 CORS / preflight 如何工作,而是关于 将 preflights 作为新请求类型提出的原因 。我看不出为什么服务器 A 需要向服务器 B 发送预检 (PR) 只是为了确定是否会接受真正的请求 (RR) - B 肯定有可能接受/拒绝 RR 而无需任何先前的 PR。
经过一番搜索后,我在www.w3.org (7.1.5)找到了这条信息:
为了保护资源免受在本规范存在之前无法源自某些用户代理的跨域请求,发出预检请求以确保资源了解本规范。
我发现这是有史以来最难理解的句子。我的解释(最好称其为“最佳猜测”)是关于保护服务器 B 免受来自不了解规范的服务器 C 的请求。
有人可以解释一个场景/展示一个 PR + RR 比单独使用 RR 解决的问题吗?
我花了一些时间对预检请求的目的感到困惑,但我想我现在明白了。
关键的见解是预检请求不是 安全 问题。相反,它们是 不改变规则 的东西。
预检请求与安全无关,它们与现在正在开发的应用程序无关,具有 CORS 意识。相反,预检机制有益于在 没有 意识到 CORS 的情况下开发的服务器,并且它充当客户端和服务器之间的健全性检查,它们都支持 CORS。CORS 的开发人员认为那里有足够多的服务器依赖于他们永远不会收到的假设,例如,他们发明了预检机制以允许双方选择加入的跨域删除请求。他们认为,如果只是简单地启用跨域调用,就会破坏太多现有的应用程序。
这里有三种情况:
旧服务器,不再在开发中,在 CORS 之前开发。这些服务器可能会假设它们永远不会收到例如跨域删除请求。 这种情况是预检机制的主要受益者。 是的,这些服务可能已经被恶意或不合格的用户代理滥用(而 CORS 没有改变这一点),但在使用 CORS 的世界中,预检机制提供了额外的“健全性检查”,因此客户端和服务器不会打破,因为网络的基本规则已经改变。
仍在开发中但包含大量旧代码的服务器,并且不可行/不希望审核所有旧代码以确保其在跨域世界中正常工作。这种情况允许服务器逐步选择加入 CORS,例如说“现在我将允许这个特定的标头”、“现在我将允许这个特定的 HTTP 动词”、“现在我将允许 cookie/auth 信息发送”等。 这种情况得益于预检机制。
以 CORS 意识编写的新服务器。根据标准安全实践,服务器必须在面对 任何 传入请求时保护其资源——服务器不能相信客户端不会做恶意事情。 这种情况不会从预检机制中受益 :预检机制不会为已正确保护其资源的服务器带来额外的安全性。