我在 WebSphere 上的 context root 上部署了一个 Web 应用程序/app
。在应用程序内部,有一个 javascript 在加载后立即执行,它看起来像这样:
document.cookie = "foo=bar; path=/app";
setTimeout(function () {
document.cookie = "baz=qux; path=/app";
}, 1000);
铬行为
从 DevTools 我可以看到最初foo=bar
创建为非-httpOnly 和 1-2 秒后它自动变为 httpOnly。等待 5 秒左右(只是为了确保)后,第二个 cookie 也被创建,但在非 httpOnly 模式下,最终结果如下所示:
foo=bar (httpOnly=true)
baz=qux (httpOnly=false)
Q1: 为什么 foo=bar 一段时间后变成 httpOnly ?
Q2:为什么这种延迟的 cookie 创建会产生如此大的影响?
我可以说阈值在 700-800 毫秒之间,如果我延迟 cookie 创建的时间小于这个值,它的行为就完全没有延迟。
火狐行为
在这里,如果延迟低于阈值(或没有任何 setTimeout),它会为每个 kay,value 对创建 2 个 cookie,例如:
foo=bar; path=/app (httpOnly=false)
foo=bar; path=/app/ (httpOnly=true)
baz=qux; path=/app (httpOnly=false)
baz=qux; path=/app/ (httpOnly=true)
而在延迟高于阈值的情况下,它不会创建重复的 cookie(对于 baz=qux):
foo=bar; path=/app (httpOnly=false)
foo=bar; path=/app/ (httpOnly=true)
baz=qux; path=/app (httpOnly=false)
Q3:不说FF为什么会在末尾附加斜线(我听说不同的浏览器对cookie的处理方式不同),为什么延迟cookie创建不是这种情况?
我什至认为应用程序中某处可能有一段脚本在一段时间后将非 httpOnly cookie“覆盖”为 httpOnly 一个,但我不认为是这种情况,因为从控制台执行它不会改变任何东西:
document.cookie="baz=qux; path=/app; HttpOnly"
即 baz=qux 保持为非 httpOnly。甚至有人声称这是不可能的
服务器通过响应将 cookie 重置为 httpOnly 并不是一回事,我已经在网络视图中检查了每个请求,并且这些 cookie 不是来自服务器。
我有一种直觉,在这个环境中一定有一些东西,因为我试图创建一个具有类似设置的单独 Spring boot 项目,并且所有 cookie 都保持非 httpOnly。
有任何想法吗?不幸的是,我无法分享真实的代码。如果有人能够至少在理论上解释可能是什么原因,那将非常有帮助。
其他注意事项:
- 这不适用于使用 path=/ 创建的 cookie
- 铬版本:75.0.3770.100
- 火狐版本:67.0.4
- 我正在使用不带任何扩展名的隐身窗口