gpt4 book ai didi

java - 如何在生产中安全地更改 session cookie 域或名称?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:34 25 4
gpt4 key购买 nike

我们最近意识到我们的 session cookie 被写到我们网站的完全限定域名 www.myapp.com,例如:

MYAPPCOOKIE: 79D5DB83..., domain: www.myapp.com

我们希望将其切换为可以跨子域共享的 cookie,因此 myapp.com 中的任何服务器也可以使用 session cookie。例如,我们希望我们的 cookie 像这样存储:

MYAPPCOOKIE: 79D5DB83..., domain: .myapp.com

我们试过只更改我们的 session cookie 以像这样使用该域:

   Cookie sessionCookie = sessionManager.getSessionIdCookie();
sessionCookie.setDomain(".myapp.com");

这在大多数 情况下工作正常。

我们发现在某些情况下,一些用户在部署此新代码后无法登录。当用户出现以下问题时:

  • 已在他们当前的浏览器 session 中登录到我们的站点,但当前未登录。
  • 他们再次尝试登录

他们的浏览器中似乎有 2 个 session cookie:

  • 来自他们之前 session 的陈旧 cookie,带有完全限定的域名

    MYAPPCOOKIE: 79D5DB83..., domain: www.myapp.com
  • 他们刚刚登录的 session 的新 session cookie,具有新的域设置

    MYAPPCOOKIE: 79D5DB83..., domain: .myapp.com

管理这个旧 cookie 的最佳方法是什么?如果用户没有 session ,我们已尝试添加一些代码来删除旧 cookie,但在某些进入我们应用程序的路径中,这似乎不起作用。

如果可行,我们愿意重命名 cookie,并且正在寻找其他人可能提出的任何建议。谢谢!

最佳答案

以下方法通过将 session cookie 重命名为新的名称来解决问题,如果需要,将旧值复制到新的 cookie 名称。

它使用一些 Apache 模块(mod_headersmod_setenvif)在新 cookie 不存在时将旧 cookie 值复制到新 cookie 名称。

  # We only want to copy the old cookie to the new cookie name
# when it doesnt already exist in the request. To do so, we
# set a "per request" flag which is used to determine if we need
# to do the "cookie copy operation".

<IfModule mod_setenvif.c>
SetEnvIf Cookie "NEW_SESSION_ID=" HAS_NEW_SESSION_ID
</IfModule mod_setenvif.c>

# If the cookie "NEW_SESSION_ID" doesnt exist in the request, copy
# the old cookie value to the new cookie name. This allows seamless
# switching to the new cookie for users with existing sessions, and
# also ensure that if we have to rollback our code change for some
# reason, the old cookie will still be ok. Of course if new sessions
# are created with the new cookie, then they wouldn't be copied over on
# rollback, but a similar approach could be used if someone
# wanted to do so

<IfModule mod_headers.c>
RequestHeader edit Cookie "OLD_SESSION_ID=([0-9a-zA-Z\-]*)" "NEW_SESSION_ID=$1 DEBUG_MSG_FOR_REPLACING=TRUE; OLD_SESSION_ID=$1" env=!HAS_NEW_SESSION_ID
</IfModule mod_headers.c>

请注意,您可以通过查找 DEBUG_MSG_FOR_REPLACING cookie 值来测试替换是否有效,我添加该值是为了在替换完成时进行调试。

以下是端点的一些示例代码,它只是将 cookie header 的值转储到响应中,您可以在调试 Apache 更改时使用它:

@GET
@Path("dump_cookies")
public Object dumpCookies(@Context HttpServletRequest request)
{
String result = request.getHeader("Cookie");
String cookies = result.replace("; ", "<br/>");

String html = "<h1>Raw</h1>" + result;

html += "<hr/>";
html += "<h1>Cookies</h1>" + cookies;

return html;
}

请注意,由于业务原因阻止我们重命名 cookie,我们并没有最终使用此解决方案。我们最终使用了 this solution instead这使我们能够保持我们的 cookie 名称相同。

关于java - 如何在生产中安全地更改 session cookie 域或名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32763252/

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