请求es2015模块文件时Safari不包含cookie

F. *_*inn 6 cookies safari ecmascript-6

我的网络服务器要求在提供任何文件(包括.js文件)之前必须先提供身份验证cookie。

由于更新了我的网站之一以在<script type="module">标签中提供es2015模块,因此Safari不会与该文件的请求一起发送身份验证cookie。它可以在Chrome中按预期运行。

Safari中是否有行为阻止js模块请求上的cookie?我可以回滚到不支持模块以恢复服务,但是对于支持它们的浏览器,则失去模块的好处。

<script src="module.js" type="module"></script>
<script src="legacy.js" nomodule></script>
---
<script src="legacy.js"></script>
Run Code Online (Sandbox Code Playgroud)

在请求js文件的页面的服务器响应标头中设置了第一方Cookie。当出现前两个脚本标签时,Safari不会像预期的那样请求module.js而不是legacy.js,但是该请求不包含任何cookie。如果改为使用第三个脚本标签,则Safari会请求legacy.js,包括带有该请求的cookie。

有没有办法让Safari发送带有模块请求的cookie?其他浏览器会采用Safari的行为吗?ECMAScript 6规范是否以一种或另一种方式在此处规定了行为?

Dan*_*aru 6

模块脚本及其依赖项使用 CORS 获取。这意味着任何跨源模块脚本都必须使用正确的标头,例如 Access-Control-Allow-Origin: *. 当然,对于经典脚本而言,情况并非如此。

暂时似乎可行的一个选项是在脚本中添加 type 模块属性

<script src="[...].js" type="module" crossorigin="use-credentials"></script>
Run Code Online (Sandbox Code Playgroud)

默认情况下(即未指定属性时),根本不使用 CORS。“匿名”关键字意味着不会通过 cookie、客户端 SSL 证书或 HTTP 身份验证交换用户凭据,除非它们来自同一来源。

获取需要凭据的清单时,必须使用 use-credentials 值,即使该文件来自同一来源。 https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes