当前位置: 首页 > news >正文

cookie,session,localstorage,sessionstorage一次讲清楚

在Web开发中,sessioncookiesessionStoragelocalStorage 都是用于存储数据的技术,但它们的应用场景、存储方式和特性有很大差异。下面从前后台使用场景核心区别出现顺序现状几个方面详细说明:

一、前台还是后台用?

  • cookie:前后台都能操作。

    • 前台(浏览器):通过 document.cookie 读写。
    • 后台(服务器):通过 HTTP 响应头 Set-Cookie 设置,请求头 Cookie 携带。
  • session:本质是服务器端的存储技术,前台无法直接操作。

    • 服务器通过 session ID(通常存放在 cookie 中)识别用户,关联存储在服务器的用户数据(如登录状态、购物车等)。
  • sessionStoragelocalStorage:仅前台(浏览器)使用,服务器无法直接访问。

    • 通过 JavaScript 的 window.sessionStoragewindow.localStorage API 操作,数据完全存储在客户端。

二、核心区别(表格对比)

特性 cookie session(服务器端) sessionStorage localStorage
存储位置 客户端(浏览器) 服务器端(内存/数据库/文件) 客户端(浏览器) 客户端(浏览器)
存储大小 约 4KB(每个域名限制) 无固定限制(取决于服务器配置) 约 5-10MB(各浏览器不同) 约 5-10MB(各浏览器不同)
生命周期 可设置过期时间(如 24 小时),过期后删除 依赖 session ID 有效性(如关闭浏览器/超时后失效) 会话级(关闭标签页/浏览器后删除) 永久存储(除非手动删除)
通信方式 每次 HTTP 请求都会携带(自动发送) 不随请求发送,仅通过 session ID 关联 不参与 HTTP 通信 不参与 HTTP 通信
跨页面共享 同域名下所有页面共享 同 session ID 关联的页面共享 仅同一标签页内共享 同域名下所有页面共享
典型用途 存储用户标识(如 session ID)、记住登录状态 存储用户敏感数据(如登录信息、权限) 临时数据(如表单临时保存) 持久化数据(如用户偏好设置)

三、出现的先后顺序

  1. cookie:最早出现(1994 年由网景公司引入),是 Web 早期唯一的客户端存储方案,用于解决 HTTP 无状态的问题。
  2. session:伴随 cookie 出现(1990 年代中期),服务器通过 session ID(存于 cookie)关联用户状态,弥补 cookie 存储大小和安全性的不足。
  3. localStoragesessionStorage:属于 HTML5 标准(2010 年左右正式纳入规范),为客户端提供更大容量、更安全的存储方式,替代 cookie 存储非必要的请求数据。
  • cookie:仍不可替代,用于存储 session ID、跨域请求的身份标识(如第三方登录)等必须随请求发送的数据。

  • session:仍是服务器存储用户状态的主流方案(如登录会话管理),但需注意分布式系统中的 session 共享问题(可通过 Redis 等中间件解决)。

  • localStoragesessionStorage:广泛用于客户端存储非敏感数据(如用户设置、临时表单数据),避免频繁请求服务器,提升页面性能。

  • 需注意的“过时”用法:

    • 早期有人用 cookie 存储大量数据(如购物车详情),但因大小限制和性能问题,现在已被 localStorage 或服务器 session 替代。
    • 避免用 sessionStorage 存储需要跨标签页共享的数据(因它仅在同一标签页有效)。

但在 RESTful 架构中,"无状态"(Stateless)是核心原则之一,这确实与传统的服务器端 session 存储存在理念上的冲突。而 JWT(JSON Web Token)作为一种自包含的身份验证机制,常被视为替代 session 的方案。下面详细分析两者的矛盾与取舍

一、session 与 RESTful 无状态原则的冲突

REST 架构要求每个请求必须包含所有必要信息,服务器不应存储客户端的状态(即"无状态")。而传统 session 的工作方式是:

  • 客户端首次登录后,服务器生成 session 数据并存储(内存/数据库),仅返回一个 session ID(通常存在 cookie 中)。
  • 后续请求仅携带 session ID,服务器需查询本地存储的 session 数据才能确认身份——这导致服务器保存了客户端状态,违反了无状态原则。

这种有状态性会带来问题:

  • 分布式系统中,需同步 session 数据(如用 Redis 共享),增加架构复杂度。
  • 服务器重启可能导致 session 丢失(非持久化存储时)。
  • 扩展性受限(每个请求需查询 session 存储)。

二、JWT 如何适配 RESTful 无状态原则?

JWT 是一种自包含令牌,它将用户身份信息(如用户 ID、权限)加密后直接包含在令牌中,服务器无需存储额外数据:

  1. 客户端登录后,服务器生成 JWT(包含用户信息+签名)并返回。
  2. 后续请求中,客户端携带 JWT(通常在 HTTP 头 Authorization 中)。
  3. 服务器只需验证 JWT 的签名有效性,即可解析出用户信息,无需查询本地存储。

这种方式完全符合 REST 无状态原则:

  • 服务器不存储客户端状态,每个请求都携带完整的身份验证信息。
  • 分布式系统中无需同步数据,任意服务器节点均可独立验证 JWT。
  • 简化了服务器架构,更适合水平扩展。

三、JWT 与 session 的取舍:并非绝对替代

虽然 JWT 更贴合 RESTful 理念,但两者各有优劣,需根据场景选择:

维度 传统 session(服务器存储) JWT(自包含令牌)
无状态性 有状态(服务器存数据),违反 REST 原则 无状态,符合 REST 原则
安全性 可随时 invalidate(删除 session) 一旦签发,有效期内无法主动作废(除非结合黑名单)
性能 每次请求需查询服务器存储(如 Redis) 仅需本地验证签名,性能更高
数据量 可存储大量数据(服务器端) 数据量有限(令牌过长会影响请求效率)
适用场景 需频繁更新状态、严格控制失效的场景 分布式系统、API 服务、移动端应用

结论

  • 在严格遵循 RESTful 架构的 API 服务中,JWT 是更优选择,尤其适合分布式系统和第三方 API 授权。
  • 但 JWT 并非银弹:若需频繁吊销令牌(如用户登出、权限变更),需额外维护黑名单(如用 Redis 存储失效 JWT),会部分抵消无状态的优势。
  • 传统 session 仍适用于单体应用、对安全性要求极高(需实时失效)的场景。

四、实践建议

  1. 公开 API/分布式系统:优先用 JWT,减少服务器状态依赖,提升扩展性。
  2. 单体应用/内部系统:session 实现简单(如框架自带),可继续使用。
  3. 混合方案:关键操作(如支付)用 session 保证实时可控,普通请求用 JWT 提升性能。

总之,RESTful 提倡无状态是为了简化架构和提升扩展性,JWT 是实现这一目标的优秀工具,但需根据业务安全性、可扩展性需求灵活选择,而非绝对替代 session。

总结

  • cookie:前后台通用,适合存储小容量、需随请求发送的数据。
  • session:服务器专用,管理用户状态,安全但依赖服务器资源。
  • sessionStorage:前台临时存储,会话级有效期,同标签页共享。
  • localStorage:前台永久存储,适合持久化非敏感数据。
http://www.aitangshan.cn/news/585.html

相关文章:

  • Maven jar上传Nexus教程
  • 7.1组合计数
  • 浅学 FHQ
  • DeepCompare文件深度对比软件:智能文本对比与差异统计功能完全指南
  • 单据上采购数量按3个单位分别显示数量
  • 致敬2025年还在写博客的你
  • MyBatis-Plus
  • 概率论的基础
  • Docker
  • 【IEEE出版】第三届电力、电网和储能国际学术会议(PGES 2025)
  • 记录下MySQL的分区表
  • 从 “JSON 字段适配噩梦” 到 “Spring Boot 优雅解决方案”,你只差这一篇
  • 【IEEE出版】第四届电力系统与电力工程国际学术会议(PSPE 2025)
  • 题解:P10299 [CCC 2024 S5] Chocolate Bar Partition
  • 关闭Ollama开机启动项
  • MySQL 根据一个表的字段值,更新另一个表的字段
  • DeepCompare文件深度对比软件:智能同步滚动与对比视图管理功能完全指南
  • 书单
  • 2025 款潘通色卡 PS/AI 插件推荐:解锁高效配色新体验
  • Dubbo源码—1.服务发布的主要流程
  • 剑指offer-20、包含min函数的栈
  • CF1456E XOR-ranges 题解
  • QueryCon 2019:osquery的重大转折点 - 技术治理与社区共建
  • 基于Transformer的百万级文本分类技术
  • 详细介绍:网络基础1-11综合实验(eNSP):vlan/DHCP/Web/HTTP/动态PAT/静态NAT
  • Omnissa Horizon Windows OS Optimization Tool 2506 - Windows 系统映像优化工具
  • docker 容器化部署 vLLM 启动大模型
  • App Linking 助力应用场景创新,操作步骤立省 60%
  • ChatGpt 5系列文章1——编码与智能体
  • Cisco Catalyst 9800-CL IOS XE 17.18.1 发布,新增功能简介