如何在浏览器中实际缓存CORS预检响应?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在浏览器中实际缓存CORS预检响应?相关的知识,希望对你有一定的参考价值。

一个技术性很强的问题,可能只有知道浏览器内部的人才能回答......

浏览器缓存的CORS预检响应究竟是多少(假设在对OPTIONS预检请求的响应中返回了Access-Control-Max-Age响应头)?

基本上,在规范(https://www.w3.org/TR/cors/#preflight-result-cache-0)中,它表示预检结果缓存中的每个条目都包含以下字段:

  • 起源
  • 网址
  • 最大年龄
  • 证书
  • 方法

(方法和标题互斥)

主缓存密钥由除max-age之外的所有字段组成。

因此,如果我收到包含以下内容的OPTIONS预检请求的响应:

Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, OPTION, HEAD
Access-Control-Allow-Headers: x-cool, x-special, x-sweet
Access-Control-Max-Age: 3600

那么我是否正确地认为这会导致所有以下条目被添加到预检缓存中?

http://www.example.com  <url>  3600  true  GET
http://www.example.com  <url>  3600  true  POST
http://www.example.com  <url>  3600  true  OPTIONS
http://www.example.com  <url>  3600  true  HEAD
http://www.example.com  <url>  3600  true           x-cool
http://www.example.com  <url>  3600  true           x-special
http://www.example.com  <url>  3600  true           x-sweet

我的问题是:

  1. 如果这是真的,这是否意味着(从性能POV)更好地返回OPTIONS调用中所有可能允许的方法,因此它们会立即添加到缓存中)。这与仅返回在Access-Control-Request-Method请求头中传递的实际方法形成对比。或者是性能优势可以忽略不计甚至不值得问这个问题:)
  2. 是否有最大缓存大小?
  3. 有谁知道为什么起源和网址区分大小写?

<咆哮>

FWIW,我希望我可以指定Access-Control-Allow-Headers:*(意味着我的源服务器允许所有通过实际请求传递给它的头)。同样,能够指定Access-Control-Expose-Headers:*会很好,所以我不需要弄清楚每个是否需要将它暴露给客户端JS。因为它们无论如何都会在响应中传递,所以无法公开它们有点毫无意义 - 确保提出CORS请求的JS无法看到它们,但它们并不像是隐藏在技术上知识渊博的最终用户 - 任何使用控制台或Fiddler或Charles的人都可以看到它们。

</咆哮>

叹。

更新:我与其中一位Chrome开发人员交谈过,他已经确认无法查看CORS缓存(至少在Chrome中)。

更新2:Access-Control-Allow-Headers:*和Access-Control-Expose-Headers:*已添加到fetch规范中!好极了!没有关于每个浏览器的哪个版本(如果有)支持它们的消息。

答案

FWIW,我希望我可以指定Access-Control-Allow-Headers:*(意味着我的源服务器允许所有通过实际请求传递给它的头)。同样,能够指定Access-Control-Expose-Headers:*

可能的解决方法是收集所有标头密钥并在Access-Control-Expose-Headers中返回。

以上是关于如何在浏览器中实际缓存CORS预检响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CORS 预检缓存应用于整个域

cors跨域之简单请求与预检请求(发送请求头带令牌token)

MVC6 Cors - 拦截预检

已启用 CORS,但在 POST JSON 时,预检响应的 HTTP 状态代码 404 无效

Rails 在 CORS 预检选项请求中以 404 响应

CORS 预检响应错误