Session、Cookie、Token的区别
在 Web 开发中,Session、Cookie 和 Token 是三种常见的用户身份认证与状态保持机制,它们各有不同的用途和特性。
1. Session(会话)
✅ 定义
Session 是一种 服务器端 的状态管理机制,用于存储用户的会话信息。
🔹 特点
- 存储位置:保存在服务器端,通常是内存或数据库。
- 安全性:比 Cookie 更安全,因为数据不存储在客户端。
- 生命周期:通常与浏览器会话(session)相关,关闭浏览器可能会丢失,或者由服务器控制失效时间。
- 依赖 Cookie:默认使用 Cookie 存储
SessionID
,通过SessionID
关联服务器端的数据。
📌 适用场景
适用于 用户登录态管理,如:
- 传统网站的用户认证
- Web 后台管理系统
- 需要服务器记录用户数据的场景
示例
// Java 中使用 HttpSession
HttpSession session = request.getSession();
session.setAttribute("user", "张三");
// 获取 Session
String user = (String) session.getAttribute("user");
2. Cookie
✅ 定义
Cookie 是一种 客户端 状态管理技术,用于存储小量数据,并随着请求发送给服务器。
🔹 特点
- 存储位置:存储在客户端(浏览器)。
- 安全性:容易被篡改、劫持,需要搭配
HttpOnly
和Secure
提高安全性。 - 生命周期:
- 会话 Cookie:不设置
expires
或max-age
,浏览器关闭时自动删除。 - 持久 Cookie:设置
expires
或max-age
,可以在多次会话间保持。
- 会话 Cookie:不设置
- 大小限制:单个 Cookie 最大 4KB,浏览器对总数有限制(一般 20 个)。
📌 适用场景
适用于 轻量级数据存储,如:
- 记录用户偏好(主题颜色、语言设置等)
- 记住登录信息(记住密码、自动登录)
- 追踪用户行为(广告、统计等)
示例
// 设置 Cookie
document.cookie = "username=zhangsan; path=/; max-age=3600; Secure; HttpOnly";
// 读取 Cookie
console.log(document.cookie);
3. Token(令牌)
✅ 定义
Token 是一种 无状态 认证机制,不依赖服务器存储,而是通过客户端携带 Token 进行身份认证。
🔹 特点
- 存储位置:通常保存在客户端(
localStorage
、sessionStorage
、Cookie
)。 - 安全性:需要结合 加密、签名(如 JWT),避免篡改。
- 无状态:服务器不存储 Token,适用于分布式系统。
- 生命周期:
- 短期 Token(Access Token):一般几分钟到几小时。
- 长期 Token(Refresh Token):用于刷新 Access Token,通常有效期较长(如 7 天)。
📌 适用场景
适用于 分布式系统、RESTful API 认证,如:
- OAuth 2.0 认证
- JWT(JSON Web Token)认证
- 微服务架构
示例
生成 JWT
const jwt = require('jsonwebtoken');
// 生成 Token
const token = jwt.sign({ userId: 123 }, 'your_secret_key', { expiresIn: '1h' });
console.log(token);
验证 Token
jwt.verify(token, 'your_secret_key', (err, decoded) => {
if (err) {
console.log("Token 无效");
} else {
console.log("用户 ID:", decoded.userId);
}
});
4. 什么时候用?
- 使用 Session:传统 Web 网站,用户认证(登录后管理 Session)。
- 使用 Cookie:存储用户偏好、小型数据、自动登录信息。
- 使用 Token:RESTful API 认证、微服务架构、移动端应用。
如果是 前后端分离 项目,一般采用 Token + JWT 方式认证,而不是使用 Session + Cookie。
📌 结论:
- Session 适用于服务器端存储用户会话数据,通常用于传统网站的身份认证。
- Cookie 适用于存储小型数据,但不安全,不能存储敏感信息。
- Token 适用于 RESTful API,无状态认证方式更适合分布式系统。
如果你是在做 Vue + SpringBoot 项目,推荐使用 JWT Token 方式 进行身份认证,避免 Session 依赖服务器存储。