【发布时间】:2019-11-15 05:58:37
【问题描述】:
我在 WebSphere 上的上下文根 /app 上部署了一个 Web 应用程序。在应用程序内部,有一个 javascript 在加载后立即执行,它看起来像这样:
document.cookie = "foo=bar; path=/app";
setTimeout(function () {
document.cookie = "baz=qux; path=/app";
}, 1000);
Chrome 行为
从 DevTools 中我可以看到,最初 foo=bar 被创建为 non-httpOnly,1-2 秒后它自动变为 httpOnly。
等待 5 秒左右(只是为了确保)后,第二个 cookie 也被创建了,但在非 httpOnly 模式下,最终结果如下所示:
foo=bar (httpOnly=true)
baz=qux (httpOnly=false)
Q1:为什么 foo=bar 会在一段时间后变成 httpOnly?
Q2:为什么延迟创建 cookie 会产生如此大的影响?
我可以说阈值在 700-800 毫秒之间,如果我延迟 cookie 创建的时间小于这个值,它的行为就完全没有延迟。
Firefox 行为
这里在延迟低于阈值的情况下(或没有任何 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。甚至有人声称它是not possible
这不是服务器通过响应将 cookie 重置为 httpOnly 的事情,我已经在网络视图中检查了每个请求,并且这些 cookie 不是来自服务器。
我有一种直觉,在这个环境中肯定有一些东西,因为我尝试创建一个具有类似设置的单独 Spring boot 项目,并且所有 cookie 都保持非 httpOnly。
有什么想法吗?不幸的是,我无法分享真实的代码。如果有人能够至少从理论上解释可能是什么原因,那将非常有帮助。
其他说明:
- 这不适用于使用 path=/ 创建的 cookie
- Chrome 版本:75.0.3770.100
- 火狐版本:67.0.4
- 我正在使用不带任何扩展程序的隐身窗口
【问题讨论】:
标签: google-chrome firefox cookies httponly cookie-httponly