2025.6.12
使用传统会话(Session)和 Cookie 来做身份验证,相比 JWT 更简单、更安全,尤其是在 Web 应用中。以下是具体实现方式:
1. 基本流程(Session + Cookie)
- 用户登录 → 服务器验证账号密码,生成一个 Session ID 并存储(如 Redis 或数据库)。
- 服务器返回 Cookie → 把 Session ID 通过
Set-Cookie
返回给浏览器。 - 后续请求 → 浏览器自动带上 Cookie,服务器验证 Session ID 是否有效。
- 用户登出 → 服务器删除 Session,使 Cookie 失效。
2. 具体实现(以 Node.js + Express 为例)
(1)安装依赖
npm install express express-session cookie-parser
(2)服务器代码
const express = require("express");
const session = require("express-session");
const cookieParser = require("cookie-parser");
const app = express();
// 使用 Cookie 和 Session 中间件
app.use(cookieParser());
app.use(
session({
secret: "your-secret-key", // 用于签名 Cookie 的密钥
resave: false, // 避免不必要的 Session 保存
saveUninitialized: false, // 避免存储未初始化的 Session
cookie: {
httpOnly: true, // 防止 JavaScript 访问 Cookie(防 XSS)
secure: false, // 生产环境建议设为 true(仅 HTTPS)
maxAge: 24 * 60 * 60 * 1000, // Cookie 有效期(1天)
},
})
);
// 登录接口
app.post("/login", (req, res) => {
const { username, password } = req.body;
// 1. 验证用户名密码(这里简化)
if (username === "admin" && password === "123456") {
// 2. 存储 Session 数据(比如用户 ID)
req.session.userId = "user123";
req.session.username = username;
// 3. 返回成功(浏览器会自动存储 Session ID 的 Cookie)
res.send("登录成功!");
} else {
res.status(401).send("用户名或密码错误!");
}
});
// 受保护的路由(检查 Session)
app.get("/profile", (req, res) => {
// 1. 检查 Session 是否存在
if (!req.session.userId) {
return res.status(401).send("请先登录!");
}
// 2. 返回用户信息
res.send(`欢迎回来,${req.session.username}!`);
});
// 登出接口
app.post("/logout", (req, res) => {
// 1. 销毁 Session
req.session.destroy((err) => {
if (err) {
return res.status(500).send("登出失败!");
}
// 2. 清除 Cookie(可选)
res.clearCookie("connect.sid"); // 默认的 Session Cookie 名称
res.send("登出成功!");
});
});
app.listen(3000, () => {
console.log("服务器运行在 http://localhost:3000");
});
3. 关键安全措施
✅ httpOnly: true
→ 防止 JavaScript 访问 Cookie(防 XSS 攻击)
✅ secure: true
(生产环境) → 仅允许 HTTPS 传输(防中间人攻击)
✅ Session 存储到 Redis(而不是内存)→ 避免服务器重启丢失 Session
✅ 设置合理的 maxAge
→ 避免 Session 长期有效
4. 对比 JWT
特性 | Session + Cookie | JWT |
---|---|---|
存储方式 | 服务器存储 Session | 客户端存储 Token |
安全性 | ✅ 更安全(可随时撤销) | ❌ 无法强制失效 |
大小 | 很小(仅 Session ID) | 较大(包含数据) |
适用场景 | Web 应用(浏览器) | API / 无状态服务 |
5. 总结
- Session + Cookie 是传统但更安全的方案,适合 Web 应用。
- JWT 适合无状态 API(如移动端),但管理失效较麻烦。
- 生产环境建议用 Redis 存 Session,避免服务器内存溢出。
如果你在做 Web 开发,优先用 Session + Cookie,而不是 JWT!🚀