基于Firebase+AWS Amplify+Cognito的应用如何修复会话劫持漏洞
会话劫持漏洞修复方案
核心风险点梳理
你当前的实现存在三个可被直接利用的会话劫持入口:
- 自定义
IdTokenCookie安全属性缺失:httpOnly=false允许任意前端JS读取令牌,一旦存在XSS漏洞可直接窃走凭证;secure=false允许HTTP明文传输,中间人可直接截获;sameSite=null无跨站防护,易被CSRF组合利用。 - Cognito全量会话令牌(accessToken/idToken/refreshToken)默认存储在LocalStorage:LocalStorage无任何访问控制,XSS攻击可一次性窃取所有令牌,配合长有效期的refreshToken可实现长期会话劫持。
- 无会话异常校验逻辑:令牌泄露后无任何检测、拦截机制,攻击者拿到合法令牌即可无感知冒用身份。
分步修复方案
1. 加固IdToken Cookie配置,敏感Cookie禁止前端JS操作
注意:受浏览器安全机制限制,HttpOnly属性无法通过前端JS设置,所有带HttpOnly属性的敏感Cookie必须通过服务端响应头写入,前端直接操作Cookie写入的逻辑必须全部废弃。
首先废弃现有前端直接写入IdToken Cookie的逻辑,将IdToken、refreshToken的写入逻辑迁移到Firebase边缘函数或后端服务层实现,Cookie必须配置全量安全属性:
// 服务端设置Cookie的参考配置 res.cookie('IdToken', idToken, { maxAge: 15 * 60 * 1000, // idToken有效期缩短到15分钟 httpOnly: true, // 禁止JS读取,阻断XSS窃密 secure: true, // 仅HTTPS传输,阻断中间人攻击 sameSite: 'Strict', // 跨站请求不携带,防CSRF path: '/', domain: 'my_domain.firebaseapp.com' }) // refreshToken单独配置更长有效期,同样启用全安全属性 res.cookie('RefreshToken', refreshToken, { maxAge: 7 * 24 * 60 * 60 * 1000, // 根据业务敏感度调整,最长不超过30天 httpOnly: true, secure: true, sameSite: 'Strict', path: '/auth/refresh', // 仅令牌续期接口可读取,缩小作用域 domain: 'my_domain.firebaseapp.com' })
原有前端代码中Cookies.set('IdToken', ...)的逻辑直接删除即可。
2. 调整Amplify/Cognito令牌存储策略,禁止敏感令牌落LocalStorage
Amplify支持自定义存储驱动,直接覆盖默认的LocalStorage存储逻辑,将短有效期的accessToken、idToken存在内存中,避免持久化到可被JS读取的存储介质:
// 自定义内存存储,替换默认LocalStorage const inMemoryStorage = { setItem: (key, value) => Promise.resolve(), getItem: (key) => Promise.resolve(null), removeItem: (key) => Promise.resolve(), clear: () => Promise.resolve() } Amplify.configure({ Auth: { // 保留原有Cognito用户池、客户端ID等配置 storage: inMemoryStorage } })
令牌静默续期逻辑统一走服务端/auth/refresh接口,由服务端读取HttpOnly中的RefreshToken换取新的idToken/accessToken,前端全程不接触refreshToken明文。配置完成后检查浏览器LocalStorage,确认无任何Cognito相关的令牌明文残留。
3. 补充会话异常检测与加固逻辑
- 实现会话上下文绑定:用户登录时记录当前会话的User-Agent、IP网段特征,后续每次校验请求时比对特征,若出现短时间内跨区域IP跳变、User-Agent突变等异常情况,直接作废当前会话,要求用户重新登录。
- 部署严格的CSP(内容安全策略):限制脚本、资源加载来源,禁止内联脚本、未授权域名的脚本执行,从根源上降低XSS攻击风险——XSS是前端会话窃密的最主要入口。
- 配置CSRF Token校验:针对所有需要身份校验的写接口,额外增加CSRF Token校验逻辑,弥补旧版浏览器SameSite属性兼容性不足的问题。
- Firebase托管层配置HSTS响应头,强制浏览器全程使用HTTPS连接,禁止HTTP降级访问。
修复验收标准
- 浏览器开发者工具Application面板中,IdToken、RefreshToken的
HttpOnly、Secure、SameSite属性全部为启用状态,控制台执行document.cookie无法读取到这两个Cookie的值。 - LocalStorage、SessionStorage中无任何Cognito相关的accessToken、idToken、refreshToken明文。
- 模拟XSS注入场景,无法通过JS获取到有效会话凭证。
- 跨站请求发起时,浏览器不会自动携带IdToken、RefreshToken凭证。
内容的提问来源于stack exchange,提问作者ambigus9
相关产品推荐
相关产品推荐

