一、Cookie(客户端存储)
定义
存储在用户浏览器中的小型文本数据(最大 4KB),由服务器通过 Set-Cookie 响应头创建,浏览器后续请求会自动携带。
核心特点
-
存储位置:客户端浏览器
-
安全性:较低(明文存储,可能被篡改)
-
用途:跟踪会话、保存用户偏好(如语言)、实现自动登录
-
生命周期:可设置有效期(默认浏览器关闭失效)
-
优缺点
• 优点:HTTP协议中支持的技术(像set-cookie响应头的解析以及 cookie 请求头数据的携带,都是浏览器自动进行的,是无需我们手动操作的)
• 缺点:
. 移动端APP(Android、Ios)中无法使用Cookie
. 不安全,用户可以自己禁用cookie
. Cookie不能跨域 -
-
比如第一次请求了登录接口,登录接口执行完成之后,我们就可以设置一个cookie,在cookie当中我们就可以来存储用户相关的一些数据信息。比如我可以在 cookie 当中来存储当前登录用户的用户名,用户的ID。服务器端在给客户端在响应数据的时候,会自动的将 cookie 响应给浏览器,浏览器接收到响应回来的cookie 之后,会自动的将 cookie 的值存储在浏览器本地。接下来在后续的每一次请求当中,都会将浏览器本地所存储的 cookie 自动地携带到服务端。
-
接下来在服务端我们就可以获取到 cookie的值。我们可以去判断一下这个 cookie的值是否存在,如果不存在这个cookie,就说明客户端之前是没有访问登录接口的;如果存在 cookie的值,就说明客户端之前已经登录完成了。这样我们就可以基于 cookie在同一次会话的不同请求之间来共享数据。
-
3个自动:
1、服务器会自动的将cookie响应给浏览器。
2、浏览器接收到响应回来的数据之后,会 自动 的将 cookie 存储在浏览器本地。
3、在后续的请求当中,浏览器会 自动 的将 cookie 携带到服务器端。 -
为什么这一切都是自动化进行的?
是因为 cookie 它是 HTP 协议当中所支持的技术,而各大浏览器厂商都支持了这一标准。在 HTTP协议官方给我们提供了一个响应头和请求头:响应头 set-Cookie :设置cookie数据的;请求头 Cookie:携带cookie数据的。 -
二、Session(服务端存储)
定义
服务器内存中存储的用户会话数据,通过 Session ID 标识(通常存放在 Cookie 中)。
核心特点
• 存储位置:服务端内存/数据库
• 安全性:较高(敏感信息不暴露给客户端)
• 用途:存储登录状态、购物车数据等敏感信息
• 生命周期:用户最后一次访问后超时(默认 30 分钟)
优缺点
• 优点:session是存储在服务端的,安全。
• 缺点:
. 服务器集群环境下无法直接使用session
. 移动端APP(Android、Ios)中无法使用Cookie
. 用户可以自己禁用cookie
. Cookie不能跨域
session,它是服务器端会话跟踪技术,所以它是存储在服务器端的。而session 的底层其实就是基于我们刚才所介绍的 Cookie 来实现的。
如果我们现在要基于 session 来进行会话跟踪,浏览器在第一次请求服务器的时候,我们就可以直接在服务器当中来获取到会话对象session。如果是第一次请求session,会话对象是不存在的,这个时候服务器会自动的创建一个会话对象session 。而每一个会话对象session ,它都有一个ID(示意图中session后面括号中的1,就表示ID),我们称之为 session 的ID。
响应Cookie
接下来,服务器端在给浏览器响应数据的时候,它会将 session 的 ID 通过cookie 响应给浏览器。其实在响应头当中增加了一个 set-cookie 响应头。这个 Set-Cookie响应头对应的值是不是cookie? cookie 的名字是固定的 JSESSIONID 代表的服务器端会话对象Session 的 ID。浏览器会自动识别这个响应头,然后自动将cookie存储在浏览器本地。
查找session
接下来,在后续的每一次请求当中,都会将 cookie 的数据获取出来,并且携带到服务端。接下来服务器拿到JSESSIONID这个Cookie的值,也就是Session的ID。拿到ID之后,就会从众多的 session当中来找到当前请求对应的会话对象session。
就可以通过 session 会话对象在同一次会话的多次请求之间来共享数据了。这就是基于 session进行会话跟踪的流程。
分布式场景
需使用Redis等集中存储方案解决多服务器间的 Session 共享问题。