最近写项目的时候,产生了一个疑问 我应该使用 Cookie 还是 Session ? 因此我选择深入研究研究它两的区别,以及什么场景下该怎么选。

这是个非常常见的面试题,相信大家早已司空见惯能流畅背诵出以下片段:

Cookie 存储在浏览器, Session 是存储在服务器的。他们作用是保存用户状态...

那了解的也太浅显了,我们先从 Cookie 开始认识一下。


HTTP Cookie 也就是我们熟知的 Cookie 是服务器发送给浏览器保存在本地的一块数据,它会在浏览器下次向同一个服务器再次发起请求的时候跟随一起被发送到服务器上。

那么,问题来了。为什么服务器要大费周章给我们发个数据呢?这个就要涉及到 HTTP 底层原理之无状态了。详情可以查看以下MDN官方文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Guides/Overview

基于以上,因为 HTTP 的无状态性。我们服务器并不能分辨到底是哪个用户发出的请求,自然也就没法对资源进行权限控制了。Cookie 和 Session 就是为了解决这个问题的。

-

作用范围

存取方式

有效期

隐私策略

存储大小

Cookie

客户端

ASCII

可以长时间

容易截取

单个不可超过 4K

Session

服务端

任意类型

客户端关闭/超时失效

不易获取

理论上无限大,但通常 5 ~ 10M

哪怕看完了上面的解释,那也只知道是为了用来识别用户信息的。可是至于为什么需要这两个东西,依旧不清不楚。

而目前实际上大多数项目都会将 Cookie 和 Session 搭配在一起使用,这样才能更好的方便服务端知道当前是哪个用户在操作。

那么我做了一张图,应该可以很好的帮助大家了解这两个关联使用的方案:

sequenceDiagram participant User participant Browser participant Server User->>Browser: 第一次请求(提交信息) Browser->>Server: 发送请求(携带用户信息) Server->>Server: 创建Session并生成SessionID Server-->>Browser: 返回响应(Set-Cookie: SessionID=123) Note over Browser: 将SessionID存入Cookie<br/>并记录所属域名 User->>Browser: 第二次请求 Browser->>Browser: 自动检查域名Cookie Browser->>Server: 发送请求(携带Cookie: SessionID=123) Server->>Server: 从Cookie提取SessionID<br/>查找对应Session alt Session存在 Server-->>Browser: 用户已登录,执行后续操作 else Session不存在 Server-->>Browser: 用户未登录/登录失效 end Browser-->>User: 返回最终响应

看完这张图,我相信大家已经知道了,重点在于 Session ID 它是连接 Cookie 和 Session 的一道重要的桥梁。Cookie 负责传输 Session ID 而服务器负责接收并搜索 Session ID 获取用户信息并判断。

🔍 结论... ? 不! 新的方案

到这里应该可以统一得出一个暂时性结论:

Cookie 和 Session 应该搭配使用,两者不可或缺。

可是,事实真的如此吗?实际上并不是,你当然可以单独使用它们中的任一一个作为你的开发方案。这是你的选择。


但是这个方案自然也是有缺点的,服务端需要维护 Session 的存储,如果遇上高并发可能就老实了。并且 Cookie 会受到同源策略限制。

那么,还有其他方案吗? 那自然是有的,也就是我们最常见到的 Token 方案。适合分布式架构、跨域友好、自包含性。至少能解决现在遇到的选型问题了。

至于 Token 方案,欲知后事如何,请听下回分解。


参考:

https://www.cnblogs.com/ityouknow/p/10856177.html

https://juejin.cn/post/6844904034181070861