引入:
在正常 web 操作中,我登录完一个网站之后,之后在网站中进行其他操作,发起请求时,Cookie 会携带 SessionId 或 Token,用来标识用户身份,因此打开新页面仍保持登录状态,从而打开新页面时,依然还是显示之前那个用户的相关数据,如果在我登录完网站之后清除了浏览器的缓存,此时再进行下一步页面操作,则会提示登录,是因为清除缓存之后将 cookie、token 都删了,继续请求时没有携带验证用户的相关信息,则会提示重新登录获取身份信息
实质:
以上说来说去实质离不开一句话:维持用户的登录状态信息,对,这也就是他们三个的作用,维持用户的登录状态信息是互联网应用程序中的一个核心功能,它确保了用户在登录后能够持续享受应用程序提供的各项服务,而无需在每次请求时都重新进行身份验证。
session 与 token:
根据作用效果先来解释 session 与 token,他们都是用来维持用来维持用户登录状态
session(会话):
以登录为例,登录成功之后 服务端把用户信息保存在服务端,称之为 session,并且生成一个对应 session 的唯一编号sessionId 存 cookie 里并随响应数据返回给客户端, 后续每次请求浏览器自动携带 Cookie 中的 SessionId,服务端通过 SessionId 查询服务端保存的会话信息,维持登录状态。
Session 必须依赖 Cookie 传递 SessionId
token(令牌):
还是以登录为例,登录完成之后服务端会签发 token (数字签名凭证(加密字符串)),里面存放了用户的身份信息,全部加密封装在 Token 字符串里,随着响应数据把 Token 返回给前端,前端把Token要么跟 sessionId 一样存在 cookie 中,要么存在 localStorage( 本地存储 ),每次请求时,如果存在 cookie 中的话随 cookie 作为请求数据进行传入,如果是存在本地存储中则需请求时手动添加 token 作为请求数据传入,服务端进行校验,校验成功则维持登录状态
值得注意的是:从始至终 服务器不保存任何用户登录会话数据,只负责签发 Token、校验 Token;
不用依赖 Cookie,规避 Cookie 跨域限制
cookie:
从上面关于 session 与 token 的介绍来看,cookie 在其中好像是起到传输数据的作用,以下来介绍 cookie
cookie 的本质相当于是一小块随身便签吧,存在浏览器本地中,随着每次请求,这个标签就会随着请求数据一起传输,里面可以写上 sessionId 或者 token,这也就是为什么都要使用 cookie 进行传输。而且可以把账号、偏好设置写在 Cookie 里,存在你浏览器本地,服务器不用记 (比方说你登录网站并设置一些偏好主题等,这些数据存在 cookie 中,登录进去之后自动随身份信息进行设置)
以下是 cookie 的作用流程:
客户端发送登录请求,服务端接受请求后在响应头中返回 Set-Cookie 下发给客户端进行存储,数据不存在服务端,里面可以放置 sessionId 或者 token, 下次访问同网站,自动把 Cookie 带上发给服务器 。
三个核心功能
- 专门用来存各种身份标识比如:存 SessionId、存 Token、存登录标识
- 记住用户偏好比如 记住账号、主题皮肤、是否勾选记住我、网页设置
- 跟踪会话、维持状态因为 HTTP 协议是无状态的,服务器记不住你,全靠Cookie 随身带标记,服务器才能认出你。
三者协调完整工作业务逻辑:
一、先单独看懂 Cookie 本职工作
浏览器第一次访问网站
服务器返回响应头:Set-Cookie: xxx
浏览器把这段内容存到本地 = Cookie
以后每次访问这个网站,浏览器自动把 Cookie 发给服务器
👉 Cookie 核心:浏览器本地存储 + 每次请求自动携带
二、Cookie + Session 完整登录流程(有状态)
用户输入账号密码登录
服务器校验账号密码正确
服务器生成 SessionId,并在服务端保存你的登录信息
服务器通过 Set-Cookie 把 SessionId 下发给浏览器
浏览器把 SessionId 存入 Cookie
你点开新页面 / 刷新页面
浏览器自动带上 Cookie 里的 SessionId 发给服务器
服务器拿 SessionId 在自己本地查询,匹配到你的登录信息
识别成功,保持登录状态
👉 总结:
Cookie 装 SessionId,Session 存用户信息
三、Cookie + Token 完整登录流程(无状态)
用户输入账号密码登录
服务器校验账号密码正确
服务器不保存任何你的信息,加密生成 Token
服务器把 Token 返回给前端
前端可以选择:把 Token 存进 Cookie 或 localStorage
访问新页面 / 请求接口时
前端手动在请求头带上 Token(也可 Cookie 自动带)
服务器只做:解密、校验 Token 是否合法、是否过期
校验通过,直接识别身份,不用查服务器数据库 / 缓存
👉 总结:
Cookie 只是用来装 Token 的容器,服务器不存用户会话,只验 Token
四、总结
Cookie:浏览器本地小仓库,自动随请求发送,负责装东西(SessionId、Token、账号)
Session:服务器档案库,靠 Cookie 里的编号找人,服务器存信息
Token:加密通行证,信息自带在令牌里,服务器不存信息,只做校验
面试题:
cookie 与 session 有什么区别?
Cookie 和 Session 通常协同工作,核心作用都是解决 HTTP 无状态问题,维持用户登录会话状态。
- 存储位置:Cookie 保存在客户端浏览器;Session 保存在服务器端。
- 存储内容:Cookie 只能存字符串、容量小;Session 可存任意类型数据,无大小限制。
- 安全性:Cookie 存在本地,易被窃取篡改,安全性低;Session 用户数据在服务端,更安全。
- 生命周期:Cookie 可自定义过期时间,可长期有效;Session 默认关闭浏览器失效,也可服务端配置有效期。
- 服务器压力:Cookie 数据在客户端,不占用服务器资源;Session 服务端要存储每个用户会话,用户量大时占用服务器资源。
- 依赖关系:Session依赖 Cookie传递 SessionId;Cookie 可独立使用,无需依赖 Sessio