首先我们需要知道Cookie和Session的作用,换而言之,我们为什么需要Cookie和Session
HTTP是无状态协议,无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求会给我们发送数据过来,但是发送完不会记录任何信息,它不能以状态来区分和管理请求和响应,服务器无法辨别客户端身份,所以需要Cookie和Session配合告知服务器是哪个用户在请求服务器。
一、Session
1. 概念
Session通常称为“会话控制”,存储特定用户会话所需要的属性及配置信息。
当客户端请求访问服务器时,服务器首先检查这个客户端的请求里是否已包含了一个SessionID,如果包含则说明以前已经为此客户端创建过session,服务器就按照SessionID把这个session检索出来使用;如果客户端请求不包含SessionID,则为此客户端创建一个session并且生成此session的id即SessionID用来唯一标识session,然后在响应中将SessionID发送给客户端保存(保存SessionID的容器就是我们即将讨论的Cookie)
2. 生命周期
- 当客户端关闭时会话结束,Session失效
- Session保存在服务器端,为了获取更高的存取速度,服务器一般会把Session放在内存里面,每个用户都会有一个独立的Session。当大量的用户访问服务器时,服务器存储的Session就越来越多,不仅占用服务器性能,而且可能会导致内存溢出,所以为了减少存储负担,服务器会把长时间没有活跃的Session删除,而这个时间就是Session的超时时间,过了超时时间,我们的Session就会自动失效
3. 拓展:分布式Session
在互联网公司为了可以支撑更大的流量,后端往往需要多台服务器共同支撑前端用户请求,形成分布式布局环境。在这种情况下Session可能会失效,因为每台服务器存储的是向其请求过的客户端,并不是所有的客户端。那如果用户在 A 服务器登录了,下一次请求的是服务器 B 就会出现登录失效问题。因此我们需要考虑分布式Session的更好处理方式。
(1). Session复制
任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。
(2). 共享 Session
将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器。
二、Cookie
1. 概念
Cookie是服务器为了辨别用户身份、进行Session 跟踪在用户计算机上存储的小量信息,这些信息通常会经过加密处理,并随着每次请求发送到服务器。
2. 生命周期
(1). 会话Cookie
Cookie如果不设置过期时间的话,则表示这个Cookie的生命周期为浏览器会话期间,关闭浏览器,这个cookie就会消失,这种生命周期为浏览器会话期的Cookie被称为会话Cookie,会话Cookie一般不保存在硬盘上而是保存在内存里。
(2). 永久Cookie
如果 Cookie 包含到期日期,则可视为永久Cookie,浏览器把Cookie保存到硬盘上,即使浏览器关闭了Cookie还是会一直有效直到指定的到期日期,Cookie就从磁盘中删除。
3. 拓展:禁止Cookie后如何保障机制的正常运转。
(1). 每次请求中携带一个 SessionID 的参数,可以以Post的方式提交或者在请求的地址后面手动拼接 xxx?SessionID=yyyy...
(2). Token机制
当用户第一次登录后,服务器根据用户信息生成一个 Token,响应时将 Token 返回给客户端,以后客户端每次请求服务器数据只需带上这个Token即可,无需再次登录验证。
三、Session和Cookie的区别
1. 作用范围不同
Cookie数据存放在客户端上;session数据放在服务器上
2. 安全性能
Cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗;Session相对安全些
3. 有效期
Cookie 可设置为长时间保持(永久Cookie),比如我们经常使用的默认登录功能;Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
4. 存储大小
单个cookie在客户端的限制是4K,就是说一个站点在客户端存放的COOKIE不能超过4K;Session 可存储数据远高于 Cookie
看懂的小伙伴给个赞👍吧!码字不易