一、先想一个最本质的问题:
服务器是怎么认出 "你是你" 的?
我们打开浏览器,输入账号密码登录。服务器去数据库查一遍,确认:嗯,是本人。
可问题来了:之后的每一次请求,难道还要再发一遍账号密码吗?
当然不行。
- 每次都带密码,极其不安全
- 客户端要存密码,泄露风险极大
- 体验差,性能差
所以,正确的思路是:
登录成功后,服务器给客户端一个身份标记。以后请求只带这个标记,服务器就知道你是谁。
这个 "标记",就是 Cookie、Session、Token 要解决的事情。
二、第一步:浏览器自动存的标记 ------ Cookie
1. 什么是 Cookie(专业版)
Cookie 是 HTTP 协议规范 下,服务器通过 Set-Cookie 响应头下发,由 客户端(浏览器)自动存储、自动携带 的小型文本数据,用于客户端与服务端之间的状态传递。
2. 通俗流程
- 你输入账号密码登录
- 服务器验证通过
- 服务器生成一段身份标识,放到响应头里返回
- 浏览器自动保存这段标识
- 以后每次请求,浏览器自动把 Cookie 带给服务器
整个过程:代码不用管,浏览器全自动。
3. Cookie 的问题
- 数据存在客户端,可被查看、修改、冒用
- 大小有限(4KB),不能存太多内容
- 纯文本,不安全
三、第二步:把数据存在服务器 ------ Session
为了解决 Cookie 不安全、不能存大量信息的问题,我们引入 Session。
1. 什么是 Session(专业版)
Session 是 服务端会话机制 :服务端为每个客户端创建独立的会话数据存储空间,生成唯一的 SessionID,并通过 Cookie 将 SessionID 下发给客户端。客户端后续请求携带 SessionID,服务端根据这个 ID 索引对应的会话数据。
2. 通俗流程
- 登录成功
- 服务器把你的用户信息存在自己这里(内存 / 数据库)
- 生成一个很长、随机、无法猜到 的字符串,叫
SessionID - 把
SessionID放进 Cookie 发给浏览器 - 以后请求,浏览器自动带
SessionID - 服务器通过
SessionID找到你的会话信息
一句话:Cookie 只带一把钥匙,真正的房间在服务器里。
3. Session 的优点
- 敏感数据存在服务端,更安全
- 客户端只存一个 ID,体积小
- 适合传统 Web 网站、后端管理系统
4. Session 的缺点
- 强依赖 Cookie,APP、小程序不友好
- 服务器集群时,需要做 Session 共享
- 有状态,不利于分布式扩展
四、第三步:不依赖 Cookie 的全平台方案 ------ Token
现在的客户端不只有浏览器:APP、小程序、桌面软件、跨域前端......它们没有 Cookie 自动机制。
于是,Token 登场了。
1. 什么是 Token(专业版)
Token 是 服务端签发的加密签名凭证 ,通常包含用户身份信息与防篡改签名。它 无状态、不依赖 Cookie,由客户端自行存储,请求时手动携带,服务端只需要验签就能完成身份认证,不需要查表。
2. 通俗流程
- 账号密码登录
- 服务器验证通过
- 用密钥生成一段加密字符串 ------ Token(如 JWT)
- 直接返回给客户端
- 客户端自己手动保存(本地存储、文件等)
- 以后请求,手动把 Token 放到请求头
- 服务器验证签名,解析身份,不需要存会话
3. Token 的核心优势
- 不依赖 Cookie,全平台通用
- 无状态,服务端不用存会话,天然支持分布式
- 加密签名,防篡改、防伪造
- 适合前后端分离、APP、小程序、微服务
五、一张图看懂三者关系
plaintext
浏览器登录 → 账号密码验证通过
↓
服务器要给你一个"身份标记"
↓
1. 浏览器自动存、自动发 → Cookie
2. 数据放服务器,只给钥匙 → Session(钥匙=SessionID,存在Cookie)
3. 全平台、手动存、加密凭证 → Token
六、极简总结(面试直接背)
🍪 Cookie
- 浏览器自动存储、自动发送
- HTTP 协议原生支持
- 存客户端,不安全、容量小
🔐 Session
- 服务端存储会话信息
- 客户端只存
SessionID(放在 Cookie 里) - 安全,但依赖 Cookie,有状态
🔑 Token
- 加密签名凭证,自包含身份信息
- 不依赖 Cookie,全平台可用
- 无状态,易扩展,适合现代架构
七、一句话串起整个逻辑
浏览器登录,账号密码验证后,服务器不再让你每次带密码,而是返回一个标记:浏览器自动保存并发送,这就是 Cookie ;为了安全,把数据存在服务端,只给你一个钥匙(SessionID),这就是 Session ;APP、小程序没有 Cookie 机制,于是客户端手动保存加密凭证,这就是 Token。