Session 和 Cookie 有什么区别?
最近面试被问到这个问题,和面试官一番讨论了解到面试官心里的答案后,我不太满意。
面对上面的问题,如果是刚毕业时的我,一定会毫不犹豫说出 Cookie 是存在客户端的,Session 存在服务器这个比较“标准”的答案。
现在么,我不打算探讨上面的问题,而是打算抓着 Session 说一说。
抽象层面,Session 的意义是会话。既然是会话,那就意味着每一次交流是有语境的,也就是有上下文的。
要做到这点,我们需要想办法保持(存储)会话的状态。
于是很自然的,我们想到下面的方案。
客户端持有一个门牌号,把会话信息存储在服务端,每次客户端都会带着钥匙发起请求,服务器通过门牌号,领客户端进入房间,就可以开始会话了。
那么客户端的门牌号存放在哪里呢?
在单页应用出现以前,所有数据都是通过服务器写进页面里,然后交给浏览器显示的,并且也没有 LocalStorage, SessionStorage 这样的存储空间供同一个域名下的前端页面们交流,于是这个门牌号就只能存放在 Cookie 里了。这大概就是 Session 和 Cookie 唯一的交集了。
如今,选择的余地大了很多。我们可以把门牌号放在 LocalStorage, SessionStorage 里,如果是单页应用的情况,还可以存放在内存里。
甚至,我们可以把整个会话用的房间也丢在客户端,如果不涉及机密事项的话。
所以 Session 只是一个抽象层面的技术概念,具体实现可以有很多种方案,使用 Cookie 只是其中一种,尽管最早设计出 Cookie 的原因或许正是这个。
以上。
本着讨论一定要出结果的原则,我还是给出开头抛出的问题的答案吧:
Session 跟 Cookie 的区别就像是 Java 跟 JavaScript,所以不要再提这个问题了。