Cookie 和 Session 的区别详解在 Web 开发中Cookie和Session是两种最常用的保持会话状态的技术。很多初学者对它们的区别一知半解本文将深入浅出地讲解它们的原理、区别以及特殊场景下的解决方案并通过流程图和对比表格帮助你彻底掌握。一、什么是 CookieCookie是浏览器端的存储技术。服务器可以像浏览器发送一个“小纸条”即 Cookie浏览器会把它保存下来并在后续的每次请求中自动携带这张“纸条”。Cookie 的特点存储位置客户端浏览器大小限制每个 Cookie 一般不超过 4KB每个域名下数量有限约 20~50 个安全性相对较低容易被拦截或篡改生命周期可通过Expires或Max-Age控制分为会话级关闭浏览器即失效和持久级跨域限制遵循同源策略但可通过Domain和Path调整作用范围二、什么是 SessionSession是服务器端的存储技术。服务器为每个用户创建一个独立的“档案室”Session 对象用来存放用户的私有数据。客户端只需要保存一个会话标识符Session ID服务器通过这个 ID 找到对应的 Session。Session 的特点存储位置服务器内存、Redis、数据库等大小限制理论无上限但受服务器内存或存储容量约束安全性相对较高敏感数据存放在服务端生命周期由服务器控制通常设置一个不活动超时时间如 30 分钟依赖机制Session ID 默认通过 Cookie 传递三、核心区别一览表维度CookieSession存储位置客户端浏览器服务器内存 / Redis / DB数据容量小约 4KB大视服务器资源而定安全性低可被用户查看和篡改高数据在服务端相对可控网络传输每次 HTTP 请求都会自动携带只传输 Session ID通常通过Cookie生命周期可设置长期有效通常较短如 30 分钟无操作失效性能影响主要占用客户端资源占用服务器内存海量用户需分布式存储典型用途记住登录状态、用户偏好、跟踪点击用户认证、购物车、敏感信息缓存四、工作原理流程图1. 正常情况Cookie 启用服务器浏览器服务器浏览器1. 首次请求无 Session ID2. 创建 Session生成唯一 Session ID3. 响应头 Set-Cookie: JSESSIONIDxxx4. 保存 Cookie5. 后续请求携带 Cookie: JSESSIONIDxxx6. 根据 Session ID 找到 Session处理业务7. 响应结果默认情况下Session 完全依赖 Cookie 来传递 Session ID。2. Cookie 被禁用时 —— URL 重写如果用户禁用了 Cookie服务器就无法通过 Set-Cookie 保存 Session ID浏览器也不会自动携带。此时需要采用URL 重写在每一个 URL 后面手动加上 Session ID 参数。支持不支持或禁用客户端请求访问页面浏览器是否支持Cookie?正常使用Cookie传递SessionID服务器采用URL重写在返回的页面中将所有URL后面附加jsessionidxxx用户点击链接时携带SessionID服务器解析URL中的SessionID获取对应Session正常响应URL 重写示例原始链接 /user/profile 重写后 /user/profile;jsessionidABC123DEF456或者不同容器实现方式略有差异/user/profile?jsessionidABC123DEF456注意URL 重写要求每一个内部链接、表单 action、重定向 URL 都必须手动处理非常繁琐。现代 Web 项目通常要求开启 Cookie或者使用 Token如 JWT替代 Session。五、安全性对比与建议Cookie 的安全隐患窃取XSS 攻击可读取 Cookie 中的 Session ID伪造CSRF 攻击可冒用用户的 Cookie明文未加密的 Cookie 可被中间人截获Session 的注意事项Session ID 本身通过 Cookie 传递所以 Cookie 不安全Session ID 同样有泄露风险建议设置HttpOnly防止 XSS 读取 Cookie设置Secure仅 HTTPS 传输设置SameSite防范 CSRF服务端应定期清理过期 Session避免内存泄漏六、如何选择场景推荐技术保存用户是否登录敏感Session保存用户界面主题、语言偏好不敏感Cookie实现“记住我”功能长期自动登录Cookie配合服务端 token移动端 / 跨域 APITokenJWT代替 Session服务器集群 / 分布式环境需使用 Redis 等共享 Session 或改用无状态 Token七、总结Cookie 是浏览器的存储技术数据小、不安全但天然支持跨请求自动携带。Session 是服务器的存储技术数据大、安全但需要借助 Cookie 或 URL 重写来传递 Session ID。Cookie 被禁用时可以使用 URL 重写作为降级方案但一般不推荐依赖它。现代 Web 开发更倾向于使用JWT localStorage或OAuth2等无状态方案以减少对 Session 的依赖。面试常问的一句话总结Cookie 是客户端的“便签”Session 是服务端的“档案柜”Session 的工作需要 Cookie 帮忙递送钥匙Session ID。