Cookie、Session、Token 到底有什么区别?
HTTP 协议天生是无状态的 —— 每一次请求都是独立的事务服务器默认无法判断两次请求是否来自同一个用户也无法保留用户的操作上下文。为了解决身份识别、会话状态保持的核心需求Cookie、Session、Token 成为了 Web 开发领域最主流的三类方案但很多开发者对三者的底层逻辑、边界差异和适用场景始终存在混淆。本文从核心定义、工作流程、特性差异和选型原则四个维度彻底厘清三者的区别。一、逐个拆解三者的本质与工作原理1. Cookie客户端的存储与传输载体Cookie 是服务器下发到浏览器、并保存在客户端本地的一小段文本数据。浏览器后续向同一域名发起请求时会自动在请求头中携带这些 Cookie 数据以此让服务器识别用户身份、维持会话状态。完整工作流程浏览器向服务器发起首次请求如账号登录服务器校验身份后在 HTTP 响应头通过Set-Cookie字段写入数据返回给浏览器浏览器将 Cookie 按域名、路径规则存储在本地后续同域下的所有请求浏览器会自动在请求头的Cookie字段中携带对应数据服务器读取 Cookie 内容完成用户身份识别核心特性存储在客户端单域名下有大小约 4KB和数量限制仅适合存储轻量数据具备完善的属性控制Domain/Path限定作用域Expires/Max-Age控制有效期HttpOnly禁止 JavaScript 读取防 XSS 窃取Secure仅允许 HTTPS 传输SameSite限制跨站携带防 CSRF本身只是存储与传输载体不具备身份认证能力只是状态传递的工具2. Session服务端的有状态会话Session 是服务器为每个用户会话创建的独立存储对象用于保存用户的状态数据如登录信息、权限、购物车数据。它通过一个全局唯一的Session ID与用户绑定而这个 Session ID 绝大多数场景下通过 Cookie 传递给客户端。完整工作流程用户首次访问服务端服务器为该用户创建 Session生成唯一的 Session ID服务器通过Set-Cookie将 Session ID 写入客户端 Cookie后续浏览器发起请求时自动携带包含 Session ID 的 Cookie服务器通过 Session ID 匹配到对应的 Session 对象读取用户状态完成身份识别核心特性状态数据存储在服务端敏感信息不会暴露到客户端安全性更高依赖 Cookie 作为 Session ID 的传输载体也可通过 URL 重写实现但兼容性与安全性较差分布式架构下存在天然短板多台应用服务器无法直接共享 Session需要额外引入 Redis 等中间件做集中式存储服务端可主动销毁 Session实现强制用户下线、会话过期管控3. Token无状态的加密身份凭证Token 是服务器在用户认证通过后基于密钥与用户信息生成的加密字符串作为客户端访问受保护资源的身份凭证。最通用的实现规范是 JWTJSON Web Token它的核心特点是无状态、自包含—— 服务器不需要存储会话数据仅通过校验 Token 的签名即可确认身份合法性。完整工作流程以 JWT 为例客户端提交账号密码发起登录请求服务器校验通过后将用户 ID、权限、过期时间等信息写入 Payload配合密钥生成签名拼接成完整 Token 返回客户端将 Token 存储在 localStorage、sessionStorage 或 Cookie 中后续请求时客户端主动将 Token 放入 HTTP 请求头的Authorization字段通常为 Bearer 模式服务器用同一密钥校验 Token 的签名有效性确认未篡改、未过期后直接解析出用户信息无需查询数据库或缓存核心特性无状态服务端无需存储会话数据天然适配分布式、多节点架构没有 Session 共享的痛点跨端友好不依赖 Cookie 机制天然支持 APP、小程序、IoT 设备等非浏览器环境也不受跨域限制自包含Token 本身携带身份、权限等信息网关层即可完成鉴权无需穿透到业务服务存在天然缺陷Token 一旦签发在过期前无法主动作废Payload 仅为 Base64 编码而非加密不能存放敏感信息体积远大于 Session ID会增加请求开销二、核心差异对比表格对比维度CookieSessionToken存储位置客户端浏览器本地服务端内存 / 数据库 / Redis客户端本地存储 / Cookie 等状态属性仅为存储载体本身无状态有状态服务端留存完整会话数据无状态用户信息自包含在令牌中安全性易受 XSS 窃取、CSRF 攻击可通过属性加固安全性较高敏感数据在服务端仅 Session ID 传输天然规避 CSRF存储在本地仍有 XSS 窃取风险无法主动作废分布式支持天然支持仅负责数据携带适配成本高需额外实现 Session 共享天然支持无服务端存储依赖跨域适配受同源策略限制需单独配置跨域 Cookie依赖 Cookie 传输跨域能力受限天然支持跨域放置在请求头即可适用终端仅浏览器环境以浏览器 Web 场景为主全端适配浏览器、APP、小程序、开放接口服务端开销无额外开销较高需存储、查询和维护会话数据较低仅做签名校验无需查库三、常见认知误区澄清误区 1Cookie 和 Session 是二选一的对立方案两者是配合关系而非替代关系。Session 的核心是服务端存储会话而 Session ID 几乎都通过 Cookie 完成传输Cookie 是底层的传输载体Session 是基于 Cookie 实现的服务端会话方案。误区 2Token 一定比 Cookie/Session 更安全安全性取决于使用方式而非技术本身。Token 如果存储在 Cookie 中依然会面临 CSRF 风险如果存储在 localStorage 中XSS 攻击同样可以窃取。Token 的核心优势是无状态与跨端适配而非绝对的安全性。误区 3JWT 就是 TokenJWT 只是 Token 的一种标准化实现Token 还包含 OAuth2 体系中的 Access Token、Refresh Token以及自定义的随机字符串令牌等多种形态JWT 只是其中应用最广泛的规范之一。四、场景选型什么时候该用哪一种优先选择 Cookie Session 的场景传统服务端渲染的 Web 网站、企业内部管理后台仅面向浏览器端对会话管控要求高需要支持强制用户下线、权限实时变更单节点服务或已有成熟的分布式 Session 共享方案典型场景企业 OA 系统、电商平台 PC 端后台优先选择 Token 的场景前后端分离架构、SPA 单页应用多端统一认证APP、小程序、H5 多终端共用一套鉴权体系微服务分布式架构、跨域系统、单点登录SSO对外开放的 API 接口、第三方平台鉴权典型场景移动端应用、微服务网关鉴权、开放平台接口Cookie 的独立适用场景除了配合 Session 传递会话 IDCookie 也常单独用于存储非敏感的客户端状态比如网站主题偏好、语言设置、浏览历史记录等轻量数据无需服务端参与存储。写在最后Cookie、Session、Token 并不是互相替代的关系而是解决不同层级问题的方案Cookie 是浏览器提供的客户端存储与自动传输机制是底层的载体工具Session 是基于 Cookie 实现的服务端有状态会话方案核心是服务端集中管理状态Token 是无状态的加密身份凭证摆脱了 Cookie 和服务端存储的限制更适配分布式、多端的现代架构实际业务中三者也常常组合使用比如用 HttpOnly Cookie 存储 Token 提升安全性或是用 Session 做主身份认证、用 Cookie 存储用户偏好。没有绝对最优的方案只有最匹配业务架构、安全需求和终端场景的选择。