会话劫持:如何防范JSESSIONID被复制到其他浏览器访问Web应用的风险
Spring Boot 场景下JSESSIONID会话劫持防范方案
服务端基础配置
以下配置均可以直接在application.yml/application.properties中添加:
- 开启HttpOnly属性:禁止前端JavaScript读取Cookie,避免XSS漏洞被利用窃取会话ID
server.servlet.session.cookie.http-only: true - 开启Secure属性:强制Cookie仅通过HTTPS协议传输,避免明文传输过程中被抓包窃取(需配合HTTPS部署使用,HTTP环境下不要开启)
server.servlet.session.cookie.secure: true - 配置SameSite属性:设置为
Lax或Strict,禁止跨站请求携带本域Cookie,同时避免CSRF场景下的会话盗用server.servlet.session.cookie.same-site: lax - 限制会话有效期:设置合理的会话闲置超时时间,闲置超过阈值自动销毁会话
server.servlet.session.timeout: 1800s # 30分钟 - 禁用URL重写传递会话ID:避免JSESSIONID出现在URL中被泄露,仅允许Cookie存储会话ID
server.servlet.session.tracking-modes: cookie
服务端增强逻辑配置
如果项目使用Spring Security,可以直接添加会话固定保护配置,用户登录成功后自动更换JSESSIONID,避免登录前被植入的会话ID被利用:
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .sessionFixation().migrateSession(); // 登录成功后生成新的会话ID,迁移原有会话属性 } }
新增请求拦截器,绑定会话与客户端特征:会话创建时将用户的User-Agent、IP段(建议绑定IP前两位,避免移动网络出口IP变动导致误杀)存入会话属性,每次请求校验当前请求的特征与会话存储的特征是否一致,不一致直接销毁会话并跳转到登录页。
应用层面防护策略
- 全链路XSS防护:所有用户输入内容做校验过滤,输出到前端时做字符转义,避免恶意脚本注入
- 异常行为检测:后台实时检测同一会话ID短时间内出现多个不同IP、不同客户端特征的请求时,直接触发二次身份验证或销毁会话
- 提供用户自主会话管理能力:在个人中心增加「活跃会话」列表,允许用户手动下线可疑设备的会话;用户修改密码、主动退出登录时,销毁该账号关联的所有历史会话
注:以上措施可大幅提升会话劫持的攻击成本,覆盖绝大多数常见攻击场景,目前不存在100%杜绝会话劫持的技术方案。
内容的提问来源于stack exchange,提问作者Sushil
相关产品推荐
相关产品推荐

