Servlet可以获得HTTPS会话ID吗?

fer*_*olo 5 java security https session servlets

我想使用Java Servlets构建无状态Web应用程序.因为它是无状态的,所以没有HttpSession.浏览器中有一个会话,但每个请求可能由群集中的其他节点处理.存储在浏览器中的会话标识符由服务器生成并加密,因此很难有人制作有效的伪会话ID并绕过登录.

最近我在这个架构中发现了一个漏洞:如果恶意(被感染的)浏览器将会话标识符发送给强盗,则会话很容易被劫持.我无法在每个请求中重新生成会话标识符,因为服务器上没有会话来跟踪预期的请求序列,这也会使异步请求的处理变得复杂.

到目前为止,我的解决方案是获取一些HTTPS会话标识符并将其包含在存储在浏览器中的加密会话ID中.标准servlet可以从HTTPS连接获取此类信息吗?

另一种选择是仅为getId()使用HttpSession,但只有当这样的ID与HTTPS会话绑定时才会起作用,这是我在servlet规范中找不到的.

其他建议是受欢迎的.

Vin*_*lds 7

servlet容器在HttpServletRequest属性中填充SSL会话ID,供下游组件使用.属性名称恰好是javax.servlet.request.ssl_session_id.据我所知,这在实现Servlet规范3.0的所有容器中都可用.在Servlet Spec 3.0之前,如果我没有弄错的话,这可以在有限的容器中使用 - Tomcat和Jetty.

但是要预先警告,SSL会话ID被认为比容器生成的HTTP会话cookie值更安全.泄露SSL会话ID甚至会使您的HTTPS连接不安全.

  • SSL上的SSL会话ID的好处并不存在.cookie至少在加密的SSL/TLS连接中受到保护.在握手中清除SSL会话ID. (2认同)