0

我在 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
  • 我正在使用不带任何扩展名的隐身窗口
4

1 回答 1

0

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

服务器通过响应将 cookie 重置为 httpOnly 并不是一回事,我已经在网络视图中检查了每个请求,并且这些 cookie 不是来自服务器。

这并不完全正确,显然,WebSphere发送回带有 httpOnly 标志的 cookie,这可能是由于HTTPOnly 标志。但是,它并不总是在 Chrome/Firefox DevTools 网络视图中可见。我记得只有一个案例(几十个)是可见的。不知道为什么浏览器没有一致地显示它(即使是硬刷新)

于 2019-07-29T08:17:26.767 回答