我在上下文根/app
上的WebSphere上部署了一个Web应用程序。在应用程序内部,有一个javascript,它在加载后立即执行,看起来像这样:
document.cookie = "foo=bar; path=/app";
setTimeout(function () {
document.cookie = "baz=qux; path=/app";
}, 1000);
从DevTools中,我可以看到最初foo=bar
创建为 non -httpOnly,然后在1-2秒后自动变为httpOnly。
等待5秒钟左右(确保确定)后,还会创建第二个cookie,但是在非httpOnly模式下,最终结果如下所示:
foo=bar (httpOnly=true)
baz=qux (httpOnly=false)
问题1:为什么foo = bar在一段时间后变为httpOnly?
第二季度:为什么延迟创建cookie会带来如此不同?
我可以说阈值在700-800ms左右,如果我延迟cookie的创建并使其小于此值,则它的行为完全没有延迟。
如果延迟低于阈值(或没有任何setTimeout) 它会为每个kay(值)对创建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)
问题3:更不用说为什么FF在末尾添加斜杠(我听说过不同的浏览器对cookie的处理方式不同),为什么延迟cookie的创建不是这种情况?
我什至认为应用程序中可能有一段脚本,经过一段时间后,它会将非httpOnly cookie改写为httpOnly,但是我认为不是这种情况,因为从控制台执行不变:
document.cookie="baz=qux; path=/app; HttpOnly"
即baz = qux保持为非httpOnly。甚至有人声称它是not possible
服务器通过响应将cookie重置为httpOnly并不是一件容易的事,我已经检查了网络视图中的每个请求,而这些cookie并非来自服务器。
我有种直觉,认为这个环境中一定有东西,因为我试图用类似的设置创建一个单独的Spring引导项目,并且所有cookie都保持非httpOnly状态。
有什么想法吗?不幸的是,我不能分享真实的代码。如果某人至少能够从理论上解释原因,那将是非常有帮助的。
其他说明:
答案 0 :(得分:0)
好吧,经过进一步的挖掘,我想我已经找到了解释
服务器通过以下方式将Cookie重置为httpOnly无关紧要 响应,我已经检查了网络视图中的每个请求, 这些Cookie并非来自服务器。
那不是完全正确,显然,WebSphere 是发回了设置了httpOnly标志的cookie,这可能是由于this setting造成的。但是,它并不总是在Chrome / Firefox DevTools网络视图中可见。我记得只有一种情况(十分之几)可见。不确定为什么浏览器不能始终如一地显示它(即使进行硬刷新)