)
在 Web 开发中身份认证与状态保持是绕不开的话题而最常见的三种方案就是CookieSessionTokenJWT很多人容易混淆它们的关系这篇文章带你彻底搞懂它们的原理、区别、优缺点以及使用场景。一、为什么需要它们HTTP 是一种无状态协议 每一次请求都是独立的服务器不会记住你是谁。举个例子登录 → 请求1 访问首页 → 请求2 下单 → 请求3如果没有额外机制服务器根本不知道这三次请求是不是同一个人。 所以就需要Cookie / Session / Token来做“身份标识”二、Cookie客户端存储1️⃣ 什么是 CookieCookie 是存储在浏览器中的一小段数据由服务器返回给客户端。2️⃣ 工作流程1. 用户访问网站 2. 服务器返回 CookieSet-Cookie 3. 浏览器保存 Cookie 4. 后续请求自动携带 Cookie 请求头示例Cookie: userId1234563️⃣ 特点✅ 存在客户端浏览器✅ 自动携带✅ 可设置过期时间4️⃣ 优缺点优点简单自动携带无需开发者处理缺点不安全容易被篡改容量小一般 4KB易受攻击XSS / CSRF5️⃣ 使用场景记住登录状态简单系统购物车未登录状态用户偏好语言、主题三、Session服务器存储1️⃣ 什么是 SessionSession 是存储在服务器端的用户数据。 本质Cookie SessionID2️⃣ 工作流程1. 用户登录 2. 服务器创建 Session保存用户信息 3. 返回 SessionID通过 Cookie 4. 浏览器保存 SessionID 5. 后续请求携带 SessionID 6. 服务器通过 SessionID 找到用户3️⃣ 核心结构客户端CookieSessionID 服务器Session用户数据4️⃣ 优缺点优点✅ 数据存储在服务器更安全✅ 可以存复杂数据缺点❌ 占用服务器内存❌ 不利于分布式需要共享 Session5️⃣ 常见问题 Session 共享问题重点面试题在分布式系统中请求1 → 服务器A 请求2 → 服务器B Session 不一致解决方案Session 复制Session 粘滞Sticky SessionRedis 存储 Session推荐6️⃣ 使用场景传统 Web 项目如 JSP/Servlet管理后台系统对安全要求较高的系统四、Token无状态认证1️⃣ 什么是 TokenToken 是一种客户端保存的身份凭证常见形式是 JWTJSON Web Token2️⃣ 工作流程1. 用户登录 2. 服务器生成 Token 3. 返回给客户端 4. 客户端存储 TokenlocalStorage / Cookie 5. 请求时携带 Token 6. 服务器校验 Token 请求头Authorization: Bearer xxx.token.xxx3️⃣ JWT 结构重点JWT 由三部分组成Header.Payload.Signature示例eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 . eyJ1c2VySWQiOjEyMywibmFtZSI6IlRvbSJ9 . 签名4️⃣ 优缺点优点✅ 无状态服务器不存储✅ 支持分布式✅ 跨域友好缺点❌ 一旦泄露难以撤销❌ Token 体积较大❌ 需要自己实现过期控制5️⃣ 使用场景前后端分离项目Vue Spring Boot移动端App微服务架构第三方登录OAuth五、三者核心区别总结重点表格对比项CookieSessionToken存储位置客户端服务器客户端是否存用户数据是是是加密是否无状态❌❌✅安全性低高中扩展性一般差强分布式支持差差强自动携带✅✅依赖 Cookie❌需手动加六、三者关系很多人搞错的点Cookie ≠ Session关系是Cookie 可以存 SessionID Session 依赖 CookieToken 可以不依赖 Cookie七、如何选择实战建议 1. 传统单体项目 使用✔ Session Cookie 2. 前后端分离项目 使用✔ TokenJWT 3. 分布式 / 微服务 推荐✔ Token✔ 或 Session Redis 4. 高安全场景 推荐HTTPSToken Refresh TokenHttpOnly Cookie八、常见面试问题总结1️⃣ Cookie 和 Session 的区别 核心Cookie 在客户端Session 在服务器2️⃣ Token 为什么适合分布式 因为不需要服务器存储每个请求自带身份信息3️⃣ JWT 为什么不安全 因为一旦泄露无法立即失效不能强制下线除非黑名单4️⃣ 如何让 Token 更安全使用 HTTPS设置过期时间使用 Refresh Token存入 HttpOnly Cookie九、总结一句话记忆法Cookie存客户端的小纸条Session服务器帮你记住你是谁Token你自己带着身份证