面试官: “ 说一下你对 Session 的理解 ? ”

191 阅读4分钟

1. 什么是 Session

Session(会话)是指服务器端为每个用户创建的一段存储区域,用来保存用户的状态信息(如登录信息、购物车内容、权限等)。

特点:

  • 存储在服务器端(内存、数据库、文件等)
  • 有唯一标识(通常是 sessionId
  • 用户关闭浏览器后,会话不一定立即销毁(取决于服务器配置的过期时间)
  • 需要配合 Cookie 或 URL 参数传递 sessionId

2. Session 的工作流程

  1. 用户第一次访问服务器

    • 服务器为该用户创建一个新的 Session(生成唯一的 sessionId
    • 服务器将 sessionId 通过 Set-Cookie 响应头发送给浏览器
    • 浏览器保存这个包含 sessionId 的 Cookie
  2. 用户后续访问服务器

    • 浏览器在请求头中自动携带包含 sessionId 的 Cookie
    • 服务器根据 sessionId 找到对应的 Session 数据
    • 服务器读取或修改 Session 中的状态信息
  3. Session 过期或销毁

    • Session 有过期时间(默认通常 30 分钟到几小时)
    • 过期后服务器会删除该 Session 数据
    • 用户退出登录时,服务器可以主动销毁 Session

3. Session 的存储方式

Session 数据可以存储在多种位置:

  • 内存(开发环境常用,简单但不适合生产)
  • 文件系统(性能一般,适合小型应用)
  • 数据库(如 MySQL、Redis,适合分布式部署)
  • 缓存系统(如 Redis、Memcached,性能高,适合高并发)

4. Session 与 Cookie 的关系

特性SessionCookie
存储位置服务器端客户端(浏览器)
数据大小无严格限制(受服务器资源影响)每个 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 的区别

特性SessionToken
存储位置服务器端客户端(浏览器、App)
状态管理有状态(服务器保存会话数据)无状态(服务器不保存会话数据)
传递方式通过 Cookie 自动发送需要手动在请求头中添加(如 Authorization: Bearer <token>
适用场景简单 Web 应用、同域会话管理复杂认证授权、跨域请求、移动应用
扩展性较差(分布式部署需共享 Session)较好(无状态,易于扩展)

✅ 总结

  • Session 是服务器端为每个用户创建的会话存储区域,用于保存状态信息
  • 通过 sessionId 与客户端通信,通常借助 Cookie 传递
  • 安全性高,但对服务器资源消耗较大,分布式部署需要特殊处理
  • 常用于简单 Web 应用的会话管理,现代 Web 开发中更多与 Token 结合使用