Cookie会自动变为httpOnly

时间:2019-07-04 13:18:15

标签: google-chrome firefox cookies httponly cookie-httponly

我在上下文根/app上的WebSphere上部署了一个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)

问题1:为什么foo = bar在一段时间后变为httpOnly?

第二季度:为什么延迟创建cookie会带来如此不同?

我可以说阈值在700-800ms左右,如果我延迟cookie的创建并使其小于此值,则它的行为完全没有延迟。

Firefox行为

如果延迟低于阈值(或没有任何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状态。

有什么想法吗?不幸的是,我不能分享真实的代码。如果某人至少能够从理论上解释原因,那将是非常有帮助的。

其他说明:

  • 这不适用于使用path = /
  • 创建的cookie
  • Chrome版本:75.0.3770.100
  • Firefox版本:67.0.4
  • 我正在使用无任何扩展名的隐身窗口

1 个答案:

答案 0 :(得分:0)

好吧,经过进一步的挖掘,我想我已经找到了解释

  

服务器通过以下方式将Cookie重置为httpOnly无关紧要   响应,我已经检查了网络视图中的每个请求,   这些Cookie并非来自服务器。

那不是完全正确,显然,WebSphere 发回了设置了httpOnly标志的cookie,这可能是由于this setting造成的。但是,它并不总是在Chrome / Firefox DevTools网络视图中可见。我记得只有一种情况(十分之几)可见。不确定为什么浏览器不能始终如一地显示它(即使进行硬刷新)