加载中...
Session 是服务器端存储的用户状态,通过一个随机生成的 Session ID 与客户端关联。相比把状态存在 Cookie 里,Session 把敏感数据留在服务器,只把无意义的 ID 发给浏览器,安全性更可控。

| 存储位置 | 服务器端(内存/Redis/数据库) |
| 客户端持有 | Session ID(通过 Cookie 传递) |
| 分布式解决方案 | Redis 共享 Session Store |
用户登录成功后,服务器在内存(或 Redis、数据库)里创建一条 Session 记录,存下用户 ID、权限等信息,生成一个随机且不可猜测的 Session ID,通过 Set-Cookie 发给浏览器。之后每次请求,浏览器带上这个 ID,服务器查 Session 存储,知道这是谁。
Session ID 本质上是一把钥匙,钥匙本身没有意义,意义在于它开哪扇门。因此 Session ID 的随机性至关重要——必须用密码学安全的随机数生成器(CSPRNG),防止攻击者暴力猜测或预测。PHP 的 session_start()、Express 的 express-session 都是成熟的 Session 管理实现。[1]
单机应用 Session 存内存没问题。但水平扩展到多台服务器后,用户第一次请求打到服务器 A,Session 存在 A 的内存里;下次请求打到服务器 B,B 找不到 Session,用户被迫重新登录。
解决方案有三:粘性会话(负载均衡器把同一用户的请求始终发到同一台服务器,单点故障问题未解)、Session 集中存储(Redis 做共享 Session Store,最常见)、或者直接放弃服务器端 Session,改用无状态的 JWT(把状态编码在 Token 里发给客户端)。三种方案各有取舍,大型系统通常结合使用。

| 存储位置 | 服务器端(内存/Redis/数据库) |
| 客户端持有 | Session ID(通过 Cookie 传递) |
| 分布式解决方案 | Redis 共享 Session Store |
登录 后参与讨论
暂无讨论,来发表第一条评论吧