Cookie、Session、Token

引入:

在正常 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 无状态问题,维持用户登录会话状态

  1. 存储位置:Cookie 保存在客户端浏览器;Session 保存在服务器端
  2. 存储内容:Cookie 只能存字符串、容量小;Session 可存任意类型数据,无大小限制。
  3. 安全性:Cookie 存在本地,易被窃取篡改,安全性低;Session 用户数据在服务端,更安全。
  4. 生命周期:Cookie 可自定义过期时间,可长期有效;Session 默认关闭浏览器失效,也可服务端配置有效期。
  5. 服务器压力:Cookie 数据在客户端,不占用服务器资源;Session 服务端要存储每个用户会话,用户量大时占用服务器资源。
  6. 依赖关系:Session依赖 Cookie传递 SessionId;Cookie 可独立使用,无需依赖 Sessio