gpt4 book ai didi

google-chrome - tomcat 网络服务器重启后 Chrome cookies 不工作

转载 作者:行者123 更新时间:2023-11-28 21:44:25 25 4
gpt4 key购买 nike

我最近注意到,当我重新启动我的 Tomcat 网络服务器时,Chrome 浏览器无法再存储 cookie。即 tomcat 使用 cookie 进行 http session ,浏览器无法再获取它的 http session ,我们用来存储登录用户的 cookie 也会失效,用户不会保持登录状态。

这似乎是 Chrome 的一个新问题,可能是最近的更新,我不记得以前见过它。如果我关闭 Chrome 浏览器,然后重新打开它,它又好了(直到服务器再次重新启动)。

这个问题在 Firefox 上没有发生,似乎是 Chrome 中的一个错误。

有没有其他人注意到这个问题,或者知道解决方案?

我找到了一些关于 Chrome/tomcat cookie 问题和设置建议的帖子,context.xml 中的 sessionCookiePathUsesTrailingSlash=false但这并不能解决问题。

看来可能与同时支持https和http的网站,以及在两者之间切换有关(虽然确实发生在不支持https的网站上……)

好的,我现在可以重新创建问题,步骤是。

  1. 通过 https 连接到网站
  2. 注销/登录
  3. 通过http连接到网站
  4. 不能再存储 Tomcat JSESSIONID cookie(奇怪的是存储了用户/密码 cookie)

这只发生在 Chrome 上,并且只有在 Chrome 更新后才会在使用 http 的登录页面上添加“不安全”标志

好的,我将其添加到我的 web.xml

<session-config>
<cookie-config>
<http-only>true</http-only>
<secure>true</secure>
</cookie-config>
</session-config>

这并没有解决问题,但使问题始终通过 http 发生,即使 http 不再能够存储 JSESSIONID cookie。我试过 <secure>false</secure>但仍然得到老问题。所以,至少和这个设定有关。有人有什么想法吗?

在 Chrome 上记录的错误, https://bugs.chromium.org/p/chromium/issues/detail?id=698741

最佳答案

我能够使用 Chrome 重现您的问题:只需要它来创建 HttpSession来自 HTTPS 区域。任何后续的 HTTP 请求都不会发送 session cookie 和任何对 Set-Cookie:JSESSIONID= 的尝试。通过 HTTP 被 chrome 忽略。

当用户从 HTTPS 切换到 HTTP 时,问题就出现了。即使服务器重新启动并正常工作,HTTPS session cookie 也会保留。 (我使用 Tomcat6、Tomcat 9 进行了测试,并使用了 SSL 的 apache 代理)

这是从 HTTPS 创建 session 时 Tomcat 发送的响应 header

 Set-Cookie: JSESSIONID=CD93A1038E89DFD39F420CE0DD460C72;path=/cookietest;Secure;HttpOnly

还有这个用于 HTTP(注意 Secure 缺失)

 Set-Cookie:SESSIONID=F909DBEEA37960ECDEA9829D336FD239;path=/cookietest;HttpOnly

Chrome 忽略第二个 set-Cookie .另一方面,Firefox 和 Edge 取代了 Secure带有非 secured 的 cookie .为了确定正确的行为应该是什么,我查看了 RFC2109

4.3.3 Cookie Management

If a user agent receives a Set-Cookie response header whose NAME is the same as a pre-existing cookie, and whose Domain and Path attribute values exactly (string) match those of a pre-existing cookie, the new cookie supersedes the old.

所以,很明显这是一个 chrome 错误,正如您在问题中假设的那样:HTTP cookie 应该替换由 HTTPS 设置的

从 Chrome 中手动删除 cookie 或在服务器端使 session 无效使其再次工作(如果在这些操作之后 session 是使用 HTTP 创建的)

默认情况下,JSESSIONID cookie 是使用 Secure 创建的何时从 HTTPS 请求。我想这就是 Chrome 不允许覆盖 cookie 的原因。但是如果你尝试设置 <secure>false</secure>web.xml Tomcat 忽略它和 Set-Cookie header 与 Secure 一起发送

<session-config>
<cookie-config>
<http-only>true</http-only>
<secure>true</secure>
</cookie-config>
</session-config>

更改 cookie 名称,设置 sessionCookiePathUsesTrailingSlash或删除 HttpOnly没有效果

除了在登录用户从 HTTPS 切换到 HTTP 时使服务器 session 无效外,我找不到解决此问题的方法。

最后我在 chromium 中打开了一个 bug:https://bugs.chromium.org/p/chromium/issues/detail?id=698839


已更新该问题最终被标记为Won't Fix,因为它是有意更改。参见 https://www.chromestatus.com/feature/4506322921848832

Strict Secure Cookies

This adds restrictions on cookies marked with the 'Secure' attribute. Currently, Secure cookies cannot be accessed by insecure (e.g. HTTP) origins. However, insecure origins can still add Secure cookies, delete them, or indirectly evict them. This feature modifies the cookie jar so that insecure origins cannot in any way touch Secure cookies. This does leave a carve out for cookie eviction, which still may cause the deletion of Secure cookies, but only after all non-Secure cookies are evicted.

关于google-chrome - tomcat 网络服务器重启后 Chrome cookies 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42138715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com