最近写项目的时候,产生了一个疑问 我应该使用 Cookie 还是 Session ? 因此我选择深入研究研究它两的区别,以及什么场景下该怎么选。
📖 什么是 Cookie ?什么是 Session ?
这是个非常常见的面试题,相信大家早已司空见惯能流畅背诵出以下片段:
Cookie 存储在浏览器, Session 是存储在服务器的。他们作用是保存用户状态...
那了解的也太浅显了,我们先从 Cookie 开始认识一下。
HTTP Cookie 也就是我们熟知的 Cookie 是服务器发送给浏览器保存在本地的一块数据,它会在浏览器下次向同一个服务器再次发起请求的时候跟随一起被发送到服务器上。
那么,问题来了。为什么服务器要大费周章给我们发个数据呢?这个就要涉及到 HTTP 底层原理之无状态了。详情可以查看以下MDN官方文档:
基于以上,因为 HTTP 的无状态性。我们服务器并不能分辨到底是哪个用户发出的请求,自然也就没法对资源进行权限控制了。Cookie 和 Session 就是为了解决这个问题的。
📚 Cookie 和 Session 的区别?
-
作用范围
存取方式
有效期
隐私策略
存储大小
Cookie
客户端
ASCII
可以长时间
容易截取
单个不可超过 4K
Session
服务端
任意类型
客户端关闭/超时失效
不易获取
理论上无限大,但通常 5 ~ 10M
🖋 为什么需要 Cookie 和 Session ?
哪怕看完了上面的解释,那也只知道是为了用来识别用户信息的。可是至于为什么需要这两个东西,依旧不清不楚。
而目前实际上大多数项目都会将 Cookie 和 Session 搭配在一起使用,这样才能更好的方便服务端知道当前是哪个用户在操作。
那么我做了一张图,应该可以很好的帮助大家了解这两个关联使用的方案:
看完这张图,我相信大家已经知道了,重点在于 Session ID 它是连接 Cookie 和 Session 的一道重要的桥梁。Cookie 负责传输 Session ID 而服务器负责接收并搜索 Session ID 获取用户信息并判断。
🔍 结论... ? 不! 新的方案
到这里应该可以统一得出一个暂时性结论:
Cookie 和 Session 应该搭配使用,两者不可或缺。
可是,事实真的如此吗?实际上并不是,你当然可以单独使用它们中的任一一个作为你的开发方案。这是你的选择。
但是这个方案自然也是有缺点的,服务端需要维护 Session 的存储,如果遇上高并发可能就老实了。并且 Cookie 会受到同源策略限制。
那么,还有其他方案吗? 那自然是有的,也就是我们最常见到的 Token 方案。适合分布式架构、跨域友好、自包含性。至少能解决现在遇到的选型问题了。
至于 Token 方案,欲知后事如何,请听下回分解。
评论区