Cookie 和 Session 的概念
首先需要知道,为什么需要 Cookie 和 Session 的存在 ?
因为 HTTP 是一个无状态的协议,虽然这样的好处就是更加快速了,但是坏处就是想要将两个或两个以上的 URL 关联起来是做不到的。这样就需要某种工具了。
什么是 Cookie ?
HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的HTTP协议记录稳定的状态信息成为了可能。
Cookie 主要用于以下三个方面:
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
( Cookie 概念来自于MDN)
什么是 Session ?
Session 是服务器和客户端的一次会话,Session 对象存储会话所需要的属性以及配置信息,并且在这次会话中不会丢失。当客户端关闭或者Session超时都会使会话结束。
这里可能会有疑问,因为SessionId的存在,现在所说的 Session 更倾向指的是一种实现,通常是使用 Cookie 来实现的,但是也不一定要使用 Cookie 来实现,也可以把 SessionId 放在URL中来传递给客户端。
那 Cookie 和 Session 有什么区别?
-
Cookie保存在客户端,Session保存在服务端。 -
Cookie存储在客户端,比较容易被窃取或修改,相比Session存储在服务端,安全性会比较好一点。 -
Cookie存储的数据不能超过 4K,而Session可以存储的高于Cookie。 -
Cookie可设置长时间保持,Session一般失效时间比较短,客户端关闭或者Session超时都会使Session失效。
Cookie 和 Session 如何配合使用
知道了 Cookie 和 Session 的基本概念,就需要知道他们是怎么配合使用的了。
客户端第一次发请求给服务器的时候,服务器会根据客户端发来的数据来创建响应的 Session,并且将此Session的唯一标识 SessionId 返回给客户端,客户端接收到服务端发来的 SessionId 后就会将此存入到 Cookie 中,同时 Cookie 还会记录 SessionId 属于那个域名。
之后客户端访问这个服务器的时候,请求会自动将 Cookie 中的信息也发送给服务端,服务端就会从 Cookie 中获取到 SessionId,之后就根据 SessionId 查找对应的 Session 信息,如果找到 Session 就说明是之前的客户端,如果没有就说明是第一次访问这个服务器或者 SessionId 失效了。
这样会存在一个问题。
实际中,后端往往不止一台服务器,如果客户端在A服务器登录了,之后又访问到B服务器了,就会出现登录失效的问题。这就是解决分布式 Session 问题
那么怎么解决?
-
Nginx ip_hash。服务端使用Nginx代理,让每个请求按照访问IP的hash分配。让某个IP固定访问同一个后台服务器。
-
Session 复制。当某一个服务器中的Session发生了改变,这个服务器就会把这个Session的内容序列化并广播给其他所有服务器。
-
共享 Session。将客户端的Session使用缓存中间件来统一管理,保证分发到每个服务器的响应式幂等的。
若有不正确的地方,欢迎在评论区中指出,一起学习