面试官:Cookie、Session、Web Storage 的区别?答对这 3 点直接满分

77 阅读4分钟

一、Cookie 和 Session 的区别

1. 基本概念

  • Cookie

    • 定义:由服务器发送到浏览器并存储在客户端的小型文本数据(键值对)。
    • 作用:用于维持客户端状态(如用户登录状态、个性化设置)。
    • 存储位置:客户端(浏览器)。
    • 传输方式:每次请求自动通过 HTTP 头(Cookie)发送到服务器。
  • Session

    • 定义:服务器端存储的用户会话信息(如用户ID、权限)。
    • 作用:存储敏感或临时数据(如购物车内容、登录凭证)。
    • 存储位置:服务器(如内存、数据库、Redis)。
    • 传输方式:依赖 Cookie 中的 Session ID(如 session_id=abc123)关联用户与 Session 数据。

2. 核心区别

维度CookieSession
存储位置客户端(浏览器)服务器端
安全性较低(可被篡改或窃取)较高(数据在服务端)
存储容量较小(4KB 左右)较大(取决于服务器配置)
生命周期可设置过期时间(持久化)通常随会话结束销毁(可配置)
性能影响无服务器压力服务器需维护 Session 存储

3. 常见面试题

Q1:Cookie 和 Session 如何配合使用?

  • 答案

    1. 用户登录时,服务器生成唯一 Session ID 并存入 Session 数据(如用户ID)。
    2. 服务器通过 Set-Cookie 响应头将 Session ID 发送到浏览器(如 session_id=abc123)。
    3. 浏览器后续请求自动携带该 Cookie,服务器通过 Session ID 查找对应的 Session 数据。

Q2:如何防止 Session ID 被窃取?

  • 答案

    • 设置 Cookie 的 HttpOnly 属性(禁止 JavaScript 读取)。
    • 设置 Cookie 的 Secure 属性(仅通过 HTTPS 传输)。
    • 定期更换 Session ID(如用户重新登录时)。

Q3:禁用 Cookie 后 Session 还能用吗?

  • 答案:可以,但需通过 URL 重写(如 http://site.com?session_id=abc123),但这种方式安全性较低且不推荐。

二、Web Storage:localStorage 和 sessionStorage

1. 基本概念

  • localStorage

    • 生命周期:永久存储(除非手动清除或代码删除)。
    • 作用域:同一域名下的所有页面共享。
    • 存储大小:约 5-10MB(不同浏览器差异)。
  • sessionStorage

    • 生命周期:仅在当前浏览器标签页有效(关闭标签页即销毁)。
    • 作用域:仅当前标签页共享。
    • 存储大小:同 localStorage。

2. 与 Cookie 的对比

维度CookielocalStoragesessionStorage
存储容量4KB5-10MB5-10MB
自动发送每次请求自动携带不自动发送不自动发送
API易用性需手动解析简单(setItem/getItem同 localStorage
安全性较低(易被 XSS 窃取)同 Cookie同 Cookie

3. 常见面试题

Q1:localStorage 和 sessionStorage 的主要区别?

  • 答案

    • 生命周期localStorage 永久存储;sessionStorage 随标签页关闭销毁。
    • 作用域localStorage 跨标签页共享;sessionStorage 仅限当前标签页。

Q2:Web Storage 能被 XSS 攻击利用吗?如何防御?

  • 答案

    • :XSS 攻击可通过 JavaScript 直接读取/修改 Web Storage。
    • 防御:对用户输入严格过滤转义,避免 XSS 漏洞。

Q3:如何选择 Cookie 和 Web Storage?

  • 答案

    • Cookie:需与服务器交互的数据(如身份验证)。
    • Web Storage:纯客户端数据(如用户偏好设置、缓存)。

三、四者综合对比

存储方式存储位置生命周期作用域自动发送容量典型应用场景
Cookie客户端可设置过期时间域名+路径4KB用户登录状态、跟踪信息
Session服务器会话结束或过期用户会话否(依赖ID)无限制敏感数据(如购物车、权限)
localStorage客户端永久(手动清除)同源域名5-10MB长期缓存(如用户主题设置)
sessionStorage客户端标签页关闭当前标签页5-10MB临时数据(如表单草稿)

四、高频面试题汇总

1. Cookie 相关

Q:Cookie 的 SameSite 属性有什么作用?

  • 答案

    • SameSite=Strict:禁止跨站携带 Cookie(如银行网站)。
    • SameSite=Lax:允许部分安全请求(如导航跳转)携带 Cookie(默认值)。
    • SameSite=None:允许跨站携带,需配合 Secure 属性(HTTPS)。

Q:如何避免 Cookie 被 JavaScript 读取?

  • 答案:设置 HttpOnly 属性(如 Set-Cookie: session_id=abc123; HttpOnly)。

2. Web Storage 相关

Q:localStorage 的数据如何同步到多个标签页?

  • 答案:监听 storage 事件:

    window.addEventListener('storage', (e) => {
      console.log('数据变化:', e.key, e.newValue);
    });
    

Q:Web Storage 可以存储对象吗?如何处理?

  • 答案:需序列化为字符串(如 JSON.stringify(obj)),读取时反序列化(JSON.parse)。

3. 综合问题

Q:用户登录状态为什么推荐用 Cookie + Session,而不是 localStorage?

  • 答案

    • 安全性:Cookie 的 HttpOnly 和 Secure 属性可防御 XSS 和中间人攻击。
    • 兼容性:Cookie 支持跨域携带,而 Web Storage 仅限同源。

Q:如果禁用 Cookie,如何实现用户登录状态保持?

  • 答案

    • Token 方案:将身份令牌(如 JWT)通过 URL 参数或请求头传递,但需防范泄露风险。

总结

  • Cookie:适合小规模、需与服务器交互的数据(如身份验证)。
  • Session:适合存储敏感或临时数据(依赖 Cookie 传递 Session ID)。
  • Web Storage:适合纯客户端的大数据存储(如缓存、用户偏好)。
  • 安全优先:无论哪种方式,均需结合 XSS/CSRF 防御措施(如转义输入、CSP、Token 验证)。