将 cookie-config 设置为 httpOnly 并在 web.xml 中保护后无法读取 JSESSIONID cookie

Posted

技术标签:

【中文标题】将 cookie-config 设置为 httpOnly 并在 web.xml 中保护后无法读取 JSESSIONID cookie【英文标题】:Can not read JSESSIONID cookie after setting cookie-config to httpOnly and secure in web.xml 【发布时间】:2019-08-18 08:14:41 【问题描述】:

我在我的 webapp 应用程序 web.xml 中添加了以下配置

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

当我启动我的应用程序时,我发送一个 http 请求来设置这个 cookie,我可以在带有路径 /、Secure 和 httpOnly 的 http 响应中看到它。

但是,我看不到在以下 http 请求中发送此 cookie,因此,如果我对以下请求执行 request.getSession().getId(),我会得到一个空字符串。

我尝试将以下内容添加到我的 tomcat 8.5 上下文以及 WAR 上下文中

<Context sessionCookiePath="/">

但它并没有解决问题。

这是否意味着 JSESSIONID cookie 不安全并因此被忽略以在请求中发送?

【问题讨论】:

您是否通过https访问您的应用程序? 嗨,不,http。 localhost 要具体。我还注意到,对于每个请求,都会创建一个新会话。我在中间件中有一个过滤器,当我在 web.xml 中设置配置时,我可以看到每个请求都有不同的 sessionId 【参考方案1】:

根据您的评论,您将会话 cookie secure 属性设置为 true,使用 http 连接进行传输。

虽然使用的http 协议不能保证机密传输,但您可以通过激活secure 属性正确表明会话是敏感信息。因此浏览器拒绝通过不安全的纯文本http 传输将此信息发送回服务器。

阅读此问答了解更多详情:How does cookie “Secure” flag work?

由于 JSESSIONID 永远不会发送回服务器,因此每个请求最终都会创建一个新会话,该会话永远不会用于后续请求。

解决方案是禁用secure 属性,或者最好禁用configure and use a https connector in tomcat。

您还应该只使用configure your app to accept https 连接并将http 重定向到https

【讨论】:

这真的很有帮助 :) 非常感谢。

以上是关于将 cookie-config 设置为 httpOnly 并在 web.xml 中保护后无法读取 JSESSIONID cookie的主要内容,如果未能解决你的问题,请参考以下文章

网络安全-HttpOnlyCookies

Quarkus - 更改默认会话 cookie 名称

iframe 内的 iframe 以访问自己的 cookie

C4D如何将图片设置为文件背景?

将文件设置为755,将目录设置为644

MySQL查询将一个值设置为 1,将所有其他值设置为 0