httponly和secure两个标识是现代化浏览器对cookie安全保护的一大举措,我们来简单看下其作用。httponly是为了防护xss对cookie的劫持,在通用的攻击场景中,通过植入xss来劫持到管理者或用户的cookie,然后绕过应用的账户管控措施进入到操作页面完成非法的操作。secure是为了解决https与http间的问题,http是一种透明的传输,也就是说能看到明文,而https是具有加密的,secure的设置正是声明仅跟随https的请求,不答理http。
Tomcat下有一种好的通用解决措施就是过滤器来操作,举例如下,具体的业务情况请自行调整。
private void rewriteCookieToHeader(HttpServletRequest request, HttpServletResponse response) { if (response.containsHeader("SET-COOKIE")) { String sessionid = request.getSession().getId(); String contextPath = request.getContextPath(); String secure = ""; if (request.isSecure()) { secure = "; Secure"; } response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; Path=" + contextPath + "; HttpOnly" + secure); } }
我们需要明白的是,使用request.isSecure()并不总是准确的,考虑到负载均衡技术为执行SSL加速,请求从浏览器到负载均衡器过来是HTTPS,而负载均衡器和实际服务器之间的请求可能会通过普通HTTP。这将导致request.isSecure()是假的,而浏览器确实使用SSL。