Skip to content

P56 项目场景面试:用户登录 Token 存储的安全漏洞 ​

面试题:登录后的 Token 存在哪里才安全?LocalStorage、SessionStorage、Cookie 各有什么安全漏洞?

1. 先说结论 ​

  • LocalStorage/SessionStorage 存 Token 不安全:任何脚本(尤其是 XSS 注入的脚本)都能直接读取;
  • Cookie 也有风险:设置不当(无 HttpOnly、无 Secure、无 SameSite)会被窃取或用于 CSRF;
  • 安全做法:HttpOnly + Secure + SameSite Cookie,或 Token 存内存/安全存储,配合短有效期 + 刷新机制。

2. 各方案对比 ​

存储位置风险说明
LocalStorageXSS 可读JS 能直接 localStorage.getItem('token'),一旦 XSS 就泄露;且持久存在
SessionStorageXSS 可读同上,但关标签页即失效,风险稍低
Cookie(无 HttpOnly)XSS 可读 + CSRF 风险JS 可读 Cookie,跨站请求会自动携带
Cookie(HttpOnly)防 XSS 读取,仍有 CSRF 风险JS 读不到,但请求自动带 Cookie
内存(JS 变量)XSS 仍可能读,刷新丢失最接近"不落地",但要处理刷新后的会话

3. 核心漏洞与攻击 ​

① XSS(跨站脚本)— Token 泄露主因 ​

攻击者在页面注入脚本 → 读取 LocalStorage 里的 Token → 把 Token 发到攻击者服务器 → 冒充用户。

防御:

  • 输入输出转义/过滤,CSP 限制脚本来源;
  • 敏感接口用 Token 而不是长期 Cookie;
  • Token 不落 LocalStorage。

攻击者诱导用户访问恶意页面,浏览器自动携带 Cookie 发起请求。

防御:

  • Cookie 加 SameSite=Strict/Lax;
  • 关键操作校验自定义 Header/二次确认;
  • 用 Authorization Header 传 Token(不自动携带,天然防 CSRF)。

4. 生产推荐方案 ​

text
短期 AccessToken(15 分钟~2 小时,HttpOnly Cookie 或内存)
+ 长期 RefreshToken(服务端存,可吊销)
+ SameSite=Strict + Secure
+ XSS 防护(CSP、转义)+ CSRF Token/Header 校验

5. 加分点 ​

  • 主动提出"Access Token 短 + Refresh Token 长"的双 Token 模型;
  • 提 Token 吊销(服务端 Session/Redis 黑名单);
  • 登录设备管理、异地登录提醒;
  • 面试官如果问"那用 Cookie 还是 Header":可以答"HttpOnly Cookie 防 XSS + 自定义 Header/CSRF Token 防 CSRF,两者配合"。

一句话总结 ​

Token 存 LocalStorage 会被 XSS 直接偷走,Cookie 自动携带带来 CSRF 风险;安全方案是 HttpOnly+Secure+SameSite 的 Cookie 或内存存储,配合短 AccessToken + 可吊销 RefreshToken + XSS/CSRF 双重防御。

基于 VitePress 重建