1. 什么是 Session
Session(会话)是指服务器端为每个用户创建的一段存储区域,用来保存用户的状态信息(如登录信息、购物车内容、权限等)。
特点:
- 存储在服务器端(内存、数据库、文件等)
- 有唯一标识(通常是
sessionId) - 用户关闭浏览器后,会话不一定立即销毁(取决于服务器配置的过期时间)
- 需要配合 Cookie 或 URL 参数传递
sessionId
2. Session 的工作流程
-
用户第一次访问服务器
- 服务器为该用户创建一个新的 Session(生成唯一的
sessionId) - 服务器将
sessionId通过Set-Cookie响应头发送给浏览器 - 浏览器保存这个包含
sessionId的 Cookie
- 服务器为该用户创建一个新的 Session(生成唯一的
-
用户后续访问服务器
- 浏览器在请求头中自动携带包含
sessionId的 Cookie - 服务器根据
sessionId找到对应的 Session 数据 - 服务器读取或修改 Session 中的状态信息
- 浏览器在请求头中自动携带包含
-
Session 过期或销毁
- Session 有过期时间(默认通常 30 分钟到几小时)
- 过期后服务器会删除该 Session 数据
- 用户退出登录时,服务器可以主动销毁 Session
3. Session 的存储方式
Session 数据可以存储在多种位置:
- 内存(开发环境常用,简单但不适合生产)
- 文件系统(性能一般,适合小型应用)
- 数据库(如 MySQL、Redis,适合分布式部署)
- 缓存系统(如 Redis、Memcached,性能高,适合高并发)
4. Session 与 Cookie 的关系
| 特性 | Session | Cookie |
|---|---|---|
| 存储位置 | 服务器端 | 客户端(浏览器) |
| 数据大小 | 无严格限制(受服务器资源影响) | 每个 Cookie 最大 4KB |
| 安全性 | 较高(数据不在客户端暴露) | 较低(数据存储在客户端,易被窃取) |
| 传递方式 | 通过 Cookie 或 URL 参数传递 sessionId | 自动在 HTTP 请求头中发送 |
| 适用场景 | 存储敏感信息、大量状态数据 | 存储少量非敏感信息、传递 sessionId |
简单理解:
Session 是服务器端的 “储物柜”,Cookie 是客户端的 “钥匙”(
sessionId)
5. Session 的优缺点
优点
- 安全性高:敏感数据存储在服务器端,客户端只保存
sessionId - 存储容量大:可以保存大量状态信息
- 易于管理:服务器可以随时创建、修改、销毁 Session
缺点
- 服务器压力大:每个用户都需要在服务器端存储数据,高并发场景下需要考虑分布式存储
- 依赖 Cookie:如果用户禁用 Cookie,需要通过 URL 参数传递
sessionId(不太安全) - 不易扩展:在分布式系统中,需要确保不同服务器能共享 Session 数据(如使用 Redis)
6. 示例:使用 Session(Node.js + Express)
const express = require('express');
const session = require('express-session');
const app = express();
// 配置 Session
app.use(session({
secret: 'your-secret-key', // 用于加密 sessionId
resave: false, // 每次请求是否重新保存 Session
saveUninitialized: true, // 是否保存未初始化的 Session
cookie: {
maxAge: 3600000, // Session 过期时间(1 小时)
httpOnly: true, // 防止 JavaScript 访问
secure: process.env.NODE_ENV === 'production' // 仅在 HTTPS 下传输
}
}));
// 登录接口
app.get('/login', (req, res) => {
// 模拟验证用户
const username = 'Tom';
const password = '123456';
if (username === 'Tom' && password === '123456') {
// 将用户信息存入 Session
req.session.user = { username, role: 'admin' };
res.send('登录成功');
} else {
res.send('用户名或密码错误');
}
});
// 个人信息接口
app.get('/profile', (req, res) => {
// 从 Session 中读取用户信息
const user = req.session.user;
if (user) {
res.send(`欢迎你,${user.username}(角色:${user.role})`);
} else {
res.send('请先登录');
}
});
// 退出登录接口
app.get('/logout', (req, res) => {
// 销毁 Session
req.session.destroy(err => {
if (err) {
res.send('退出登录失败');
} else {
res.send('退出登录成功');
}
});
});
app.listen(3000);
7. Session 与 Token 的区别
| 特性 | Session | Token |
|---|---|---|
| 存储位置 | 服务器端 | 客户端(浏览器、App) |
| 状态管理 | 有状态(服务器保存会话数据) | 无状态(服务器不保存会话数据) |
| 传递方式 | 通过 Cookie 自动发送 | 需要手动在请求头中添加(如 Authorization: Bearer <token>) |
| 适用场景 | 简单 Web 应用、同域会话管理 | 复杂认证授权、跨域请求、移动应用 |
| 扩展性 | 较差(分布式部署需共享 Session) | 较好(无状态,易于扩展) |
✅ 总结:
- Session 是服务器端为每个用户创建的会话存储区域,用于保存状态信息
- 通过
sessionId与客户端通信,通常借助 Cookie 传递 - 安全性高,但对服务器资源消耗较大,分布式部署需要特殊处理
- 常用于简单 Web 应用的会话管理,现代 Web 开发中更多与 Token 结合使用