公司动态
Cookie、Session、localStorage、sessionStorage 深度对比与总结
一、 四种存储机制概览在深入细节之前我们先建立一个宏观认知存储方式存储位置生命周期存储大小与服务器通信Cookie浏览器端硬盘/内存可设置过期时间否则随浏览器关闭失效约 4KB每次 HTTP 请求自动携带Session服务器端内存/数据库默认约 20 分钟无访问时开始计时无硬性限制受服务器内存影响通过 Cookie 中的 SessionID 关联localStorage浏览器端硬盘永久有效除非手动删除约 5MB不与服务器通信sessionStorage浏览器端内存当前会话/窗口有效关闭即销毁约 5MB不与服务器通信二、 逐个击破核心特性详解1. Cookie最经典的“小饼干” Cookie 是什么Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据。它会在浏览器下次向同一服务器发起请求时被携带并发送到服务器上。核心特点存储位置与生命周期如果不设置过期时间Cookie 保存在内存中称为“会话 Cookie”浏览器关闭即失效如果设置了Expires或Max-Age则保存在硬盘中直到过期才消失。大小限制单个 Cookie 不能超过4KB且很多浏览器限制一个站点最多保存 20 个 Cookie。作用域Cookie 有“路径path”和“域domain”的概念可以限制 Cookie 只属于某个路径下。通信每次 HTTP 请求都会自动带上同源的 Cookie无形中浪费了带宽这也是为什么大厂优化时建议尽量减少 Cookie 体积。应用场景记住登录状态如“7 天内免登录”。记录用户上次访问时间、浏览记录。购物车未登录时的临时存储。缺点大小受限4KB。用户可以禁用 Cookie导致功能受限。安全性较低容易被窃取或 CSRF 攻击。每次请求都携带浪费带宽。2. Session服务器端的“会话” Session 是什么Session 是一种在服务器端存储用户数据的机制。它依赖于 Cookie或 URL 重写来传递一个唯一的SessionID服务器通过这个 ID 来识别用户并读取对应的数据。核心特点存储位置数据保存在服务器内存、文件或数据库。生命周期默认失效时间通常为 20 分钟从最后一次被访问开始计算。存储内容通过类似 Hashtable 的数据结构保存支持任何类型的对象而 Cookie 只能存字符串。安全性客户端只拿到一个无意义的 SessionID真正的数据在服务器因此安全性较高。工作流程用户首次请求服务器检查请求中是否有 SessionID。如果没有服务器创建一个 Session 对象并生成一个唯一且不易伪造的 SessionID。服务器将这个 SessionID 通过响应头通常借助 Cookie返回给浏览器。浏览器后续请求会自动带上这个 SessionID服务器据此找到对应的 Session 数据。应用场景网上商城的购物车用户登录后。保存用户登录状态敏感信息。防止用户非法登录后台。缺点Session 保存的数据越多越占用服务器内存。用户在线人数多时服务器压力大。强依赖 Cookie如果浏览器禁用 Cookie需使用 URL 重写不友好。代码中使用不当随意创建 Session 变量会导致可读性差、难以维护。3. localStorageHTML5 的“永久仓库” ️localStorage 是什么HTML5 引入的浏览器端存储机制以 key-value 形式保存数据数据始终保存在硬盘中除非被主动清除。核心特点生命周期永久有效。即使关闭浏览器窗口或重启电脑数据依然存在直到用户手动调用removeItem或clear方法或通过浏览器设置清除。存储大小通常可达5MB比 Cookie 大得多。作用域在所有同源窗口协议、域名、端口相同中共享。通信不会自动发送给服务器仅在本地保存节省带宽。存储内容只能存储字符串。对于对象或数组需使用JSON.stringify()和JSON.parse()进行转换。应用场景长期登录状态如“记住我”功能。网站的主题设置、语言偏好。本地缓存的静态资源索引。4. sessionStorageHTML5 的“临时抽屉” ️sessionStorage 是什么同样是 HTML5 引入的浏览器端存储API 与 localStorage 几乎一致但生命周期和作用域有本质区别。核心特点生命周期仅在当前浏览器窗口或标签页有效。刷新页面或进入同源的另一个页面数据仍然存在但关闭窗口或标签页后数据立刻被销毁。存储大小约5MB。作用域不在不同的浏览器窗口中共享即使是同一个页面在不同窗口中打开sessionStorage 也是独立的。通信不与服务器通信。应用场景敏感账号的一次性登录关闭窗口即退出。多步骤表单填写如注册流程关闭页面后数据自动清空不污染下次访问。临时保存一些仅在本次浏览会话中需要的状态。三、 面试对比题1. Cookie 和 Session 的区别对比维度CookieSession存储位置客户端浏览器服务器端安全性较低可被分析、伪造较高客户端只存 ID性能影响无服务器压力访问增多会占用服务器内存存储大小单个不超过 4KB无硬性限制受内存影响数据类型字符串支持任意对象路径限制可设置 path不同路径互相隔离不区分路径同一用户全站可访问 面试回答技巧“Cookie 和 Session 都是为了跟踪用户状态。Cookie 存在客户端方便但小且不安全Session 存在服务端安全但占用服务器资源。通常我们会把登录状态等敏感信息放 Session把用户偏好等非敏感小数据放 Cookie。”2. Web StoragelocalStorage/sessionStorage和 Cookie 的区别设计目的Cookie 是为与服务器交互而设计的HTTP 规范的一部分Web Storage 仅是为了在本地存储数据。大小Cookie 只有 4KBWeb Storage 有 5MB。通信Cookie 每次请求自动携带Web Storage 不自动发送。API 易用性Web Storage 提供了setItem、getItem等简洁 APICookie 需要开发者自己封装setCookie、getCookie方法。作用域Cookie 可通过 path/domain 限制localStorage 同源共享sessionStorage 仅同窗口共享。3. localStorage 和 sessionStorage 的区别生命周期localStorage 永久sessionStorage 临时窗口关闭即清。作用域localStorage 同源窗口共享sessionStorage 即使同源也不跨窗口共享。四、 浏览器本地存储 vs 服务器端存储维度浏览器本地存储 (Web Storage/Cookie)服务器端存储 (Session/数据库)数据所有权分散存储在各个用户浏览器中集中存储在服务器适合数据量小数据KB 级别大数据MB/GB 级别安全性一般易被 JS 读取较高客户端不可直接见性能读取极快减少网络请求需要网络请求占用服务器资源持久性Cookie 可设过期Storage 需手动/永久数据库可永久Session 为临时会话总结敏感、大数据、需要持久化的放服务器非敏感、需快速读取、临时或小数据放浏览器。五、 面试小贴士 常见追问如果浏览器禁用了 CookieSession 还能用吗可以但需要使用URL 重写将 SessionID 附加在 URL 路径中传递不过这种方式不推荐有安全风险且不够优雅。localStorage 和 sessionStorage 可以跨域访问吗不能。它们遵循同源策略协议、域名、端口必须完全一致。如何存储对象到 Web Storage为什么有了 Cookie 还需要 Web Storage因为 Cookie 太小4KB且每次请求都自动发送浪费带宽。Web Storage 容量更大5MB且不与服务器通信更适合纯本地存储场景。