1、定义
- Cookie:
服务器发送到浏览器并保存到本地的一小块数据,它会在浏览器下一次向同一服务器发送请求时被携带并发送给服务器。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。
-
Session:
Session代表着服务器和客户端的一次会话的过程。Session对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个会话过程中一直存在下去。当客户端关闭会话,或者Session失效时会话结束。
2、不同点
- 作用范围不同:Cookie保存在客户端,Session保存在服务器端
- 存取方式不同:Cookie只能保存ASCII,Session可以存任意数据类型
- 有效期不同:Cookie可设置为长时间保持,比如默认登录功能,Session一般失效时间较短。
- 隐私策略不同,Cookie存储在客户端,很容易遭到非法获取,丢失账户密码信息。Session存储在服务器的,安全性相对Cookie要好一些。
- 存储大小不同:Cookie保存的数据不能超过4K,Session可存储数据远高于Cookie
3、关联
HTTP 协议是一种 无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;
Session和Cookie的主要目的就是为了弥补HTTP 的无状态特性。
这就需要一个机制来告诉服务器本次操作是否登录,是谁操作,这个机制的实现就需要Cookie 和 Session 的配合。如下图:
用户第一次请求服务器时,服务器根据请求信息创建一个Session会话,并生成能唯一标识此Session的SessionID,然后将SessionID返回给客户端,客户端收到此SessionID后,将它存储在Cookie中,同时记录此SessionID属于哪个域名。
用户第二次请求服务器时,首先判断此服务器的域名下是否存在Cookie信息,如果存在自动将Cookie发送到服务器。服务器收到Cookie后,从Cookie中取到SessionID,去寻找对应的Session信息。如果没有找到则表示未登录或者登录失效。如果找到就证明用户已经登陆,就可以继续后面的操作。
根据上面的流程可以看出,SessionID是Cookie和Session的一个桥梁,大部分系统都是通过此原理来验证用户的登录状态。
4、禁止Cookie
如果浏览器禁止了Cookie,那么如何保障整个机制的运行呢?
-
第一个方案:每次请求时,都携带一个SessionID的参数,可以使用Post(隐藏域)提交,也可以使用Get在请求的地址后面拼接,如:http://xxxx?SessionID=123456
-
第二个方案:Token机制,服务端生成一个字符串,作为客户端请求的标识。Token机制和Cookie与Session机制类似。
当用户第一次发送请求时,服务器端根据请求信息生成对应的Token标识客户端,并将Token响应给客户端,以后客户端就可以携带Token来请求数据,无需再次登录验证。
5、分布式Session
很多物联网公司为了可以支持更大的流量,后端都是采用分布式,后端往往需要多个服务器来支持。
如何解决分布式Session?
- 第一种:Nginx ip_hash策略,服务器端使用Nginx代理,每个请求按访问 IP 的 hash 分配,这样同一个ip就固定访问一个后台服务器,避免了在服务器A上创建Session,第二次分发到服务器B上。
- 第二种:Session复制,任意一台服务器上的Session发生变化时,该服务器会把Session的所有信息序列化,然后广播到其他服务器。
- 第三种:共享Session,服务器端没有会话状态,使用缓存中间件来存储Session,来保障发送到每一台服务器的Session都是一致的。