Cookie、Session 与 Token
三者定位
| 存储位置 | 状态 | 典型用途 | |
|---|---|---|---|
| Cookie | 客户端(浏览器) | 有状态 | 存储少量数据,配合 Session 使用 |
| Session | 服务端(内存/数据库) | 有状态 | 保存用户会话信息 |
| Token(JWT) | 客户端(Cookie 或 localStorage) | 无状态 | 现代身份认证,天然支持分布式 |
Cookie
工作原理
HTTP 是无状态协议,Cookie 是让服务端"认识"客户端的机制。
首次请求(无 Cookie):
GET /reader/ HTTP/1.1
Host: example.com
服务端响应,下发 Cookie:
HTTP/1.1 200 OK
Set-Cookie: sid=abc123; Path=/; HttpOnly; Expires=Wed, 10-Oct-2024 07:12:20 GMT
后续请求(自动携带):
GET /image/ HTTP/1.1
Host: example.com
Cookie: sid=abc123 ← 浏览器自动带上


重要属性
| 属性 | 作用 |
|---|---|
HttpOnly | JS 无法读取该 Cookie,防止 XSS 窃取 |
Secure | 仅在 HTTPS 下发送 |
SameSite=Strict/Lax | 限制跨站携带,防止 CSRF 攻击 |
Expires / Max-Age | 过期时间;不设置则关闭浏览器即失效(会话 Cookie) |
Domain / Path | 限制 Cookie 的作用域 |
Cookie + Session 认证方案
- 用户登录,发送账号密码
- 服务端验证通过,创建
Session,存入服务端(内存或 Redis) - 返回
Set-Cookie: sessionId=xxx给客户端 - 后续请求自动携带
sessionId - 服务端根据
sessionId查找Session,识别用户身份
缺点:
- 扩展性差:Session 存在服务端,多台服务器需要共享 Session(引入 Redis 等)
- Cookie 跨域受限:不同域名无法共享 Cookie(App、小程序等场景不适用)
Token(JWT)认证方案
JWT 结构
JWT = Header.Payload.Signature,三部分用 . 拼接,均为 Base64 编码。
eyJhbGciOiJIUzI1NiJ9 ← Header:算法类型
.eyJ1c2VySWQiOiIxMjMifQ ← Payload:用户信息(可解码,勿存敏感数据)
.SflKxwRJSMeKKF2QT4fwpMeJf36P ← Signature:签名,防篡改
Signature 生成方式:
HMACSHA256(Base64(Header) + "." + Base64(Payload), 服务端密钥)
签名用服务端私钥生成,只要密钥不泄露,Payload 就无法被伪造。
工作流程
- 用户登录,发送账号密码
- 服务端验证通过,生成 JWT 返回给客户端
- 客户端存储 JWT(推荐存在 HttpOnly Cookie,防 XSS)
- 后续请求携带 JWT:
Authorization: Bearer <token> - 服务端验证签名 + 检查有效期,无需查数据库
优点:
- 无状态:服务端不存储任何东西,天然支持水平扩展
- 跨域友好:通过 Header 传递,不依赖 Cookie
- 无法修改 Payload 后伪造一个合法的签名
缺点:
- Payload 可被解码:只是 Base64,不是加密,不能存密码等敏感信息