一、Cookie是什么?
Cookie的存在主要是为了解决HTTP协议的无状态性问题,即协议本身无法记住用户之前的操作。
- “状态” 的含义指的是:
默认情况下 HTTP 协议的客端和服务器之间的这次通信,和下次通信之间没有直接的联系
但是实际开发中,我们很多时候是需要知道请求之间的关联关系的
例如登陆站成功后, 第次访问的时候服务器就能知道该请求是否是已经登陆过了
上述图中的 “令牌” 通常就存储在 Cookie 字段中。
如去医院挂号
1. 看病之前先挂号. 挂号时候需要提供份证号, 同时得到了张 “就诊卡”, 这个就诊卡就相当于患者的 “令牌”.
2. 后续去各个科室进检查, 诊断, 开药等操作, 都不必再出份证了, 只要凭就诊卡即可识别出当前患者的份.
3. 看完病了之后, 不想要就诊卡了, 就可以注销这个卡. 此时患者的份和就诊卡的关联就销毁了. (类似于站的注销操作)
4. 来看病, 可以办张新的就诊卡, 此时就得到了个新的 “令牌”
此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的信息, 这个就是 Session 机制所做的作
二、Session是什么?
Session(会话)是Web开发中用于管理用户状态的一种机制。它允许服务器在多个页面请求或多个浏览器会话之间保持用户的状态信息。
所谓的会话,其实就可以理解为 “对话”
在计算机领域,会话是个客与服务器之间的不中断的请求响应。对客的每个请求,服务器能够识别出请求来于同个客。当个未知的客向Web应程序发送第个请求时就开始了个会话。当客明确结束会话或服务器在个时限内没有接受到客的任何请求时,会话就结束了
如我们打客服电话
每次打客服电话,是个会话. 挂断电话,会话就结束了
下次再打客服电话,是个新的会话
如果我们时间不说话,没有新的请求,会话也会结束
服务器同时刻收到的请求是很多的。服务器需要清楚的区分每个请求是属于哪个,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与的信息的对应关系。
- Session是服务器为了保存信息创建的个特殊的对象
Session的本质就是个 “哈希表”, 存储了些键值对结构. Key 就是SessionID, Value 就是信息(信息可以根据需求灵活设计)
SessionId 是由服务器成的个 “唯性字符串”,从 Session 机制的度来看,这个唯性字符串称为 " SessionId "。但是站在整个登录流程中看待,也可以把这个唯性字符串称为 " token "。
上述例中的令牌ID,就可以看做是SessionId,只不过令牌除了ID之外,还会带些其他信息,如时间、签名等
1. 当登陆的时候,服务器在 Session 中新增个新记录,并把 sessionId返回给客端(通过 HTTP 响应中的 Set-Cookie 字段返回)
2. 客端后续再给服务器发送请求的时候,需要在请求中带上 sessionId。(通过 HTTP 请求中的 Cookie 字段带上)
3. 服务器收到请求之后,根据请求中的 sessionId在 Session 信息中获取到对应的信息,再进后续操作。找不到则重新创建Session,并把SessionID返回
Session 默认是保存在内存中的。如果重启服务器则 Session 数据就会丢失
三、Cookie 与 Session 的区别
1、存储位置:
- Cookie:存储在客户端(用户的浏览器)中,通常以键值对的形式存在。
- Session:存储在服务器端,客户端通常只存储一个Session ID,用于标识对应的服务器端Session。
2、存储大小和数量限制:
- Cookie:每个Cookie的大小一般限制在4KB左右,每个域名下可以存储的Cookie数量有限(大约20个)。
- Session:理论上没有严格的大小限制,但受到服务器存储空间的限制。Session可以存储更多的数据。
3、生命周期:
- Cookie:可以设置过期时间,浏览器会在过期后删除Cookie,或者用户可以手动清除。
- Session:依赖于服务器的配置,通常在用户关闭浏览器或Session超时后结束。
4、安全性:
- Cookie:由于存储在客户端,更容易受到跨站脚本攻击(XSS)和跨站请求伪造(CSRF)等攻击,安全性较低。
- Session:由于存储在服务器端,不易被篡改,相对更安全。但是,Session ID的传输需要安全保护,以防止Session劫持。
5、使用场景:
- Cookie:适用于存储不太敏感的数据,如用户偏好设置、会话标识符等。
- Session:适用于存储敏感数据,如用户的登录状态、购物车内容等。
6、传输:
- Cookie:每次HTTP请求都会自动包含在请求头中发送给服务器,增加了HTTP请求的大小。
- Session:只有Session ID在客户端和服务器之间传递,实际的Session数据存储在服务器端,减少了网络传输。
7、控制权:
- Cookie:由客户端浏览器控制,用户可以禁用Cookie或手动删除。
- Session:由服务器控制,服务器可以创建、修改和删除Session。
8、跨域访问:
- Cookie:可以设置为跨域访问,允许多个相关联的域名访问相同的Cookie。
- Session:通常局限于创建它的域名,除非通过特定的机制(如Session联邦)来实现跨域Session共享。
Cookie 和 Session之间主要是通过 SessionId 关联起来的,SessionId 是 Cookie 和 Session 之间的桥梁
注意:
Cookie 和 Session 经常会在起配合使,但是不是必须配合:
- 完全可以 Cookie 来保存些数据在客端。这些数据不定是份信息,也不定是 SessionId
- Session 中的sessionId 也不需要得通过 Cookie/Set-Cookie 传递,如通过URL传递
那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步