2025.6.12

使用传统会话(Session)和 Cookie 来做身份验证,相比 JWT 更简单、更安全,尤其是在 Web 应用中。以下是具体实现方式:


  1. 用户登录 → 服务器验证账号密码,生成一个 Session ID 并存储(如 Redis 或数据库)。
  2. 服务器返回 Cookie → 把 Session ID 通过 Set-Cookie 返回给浏览器。
  3. 后续请求 → 浏览器自动带上 Cookie,服务器验证 Session ID 是否有效。
  4. 用户登出 → 服务器删除 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!🚀

posted @ 2025-06-12 23:44  258333  阅读(22)  评论(0)    收藏  举报