前后端 会话状态保持

本文将介绍如何在基于无状态的 HTTP 的前后端通信中实现会话状态保持。

一、无状态的 HTTP

HTTP 是无状态的,它并没有 “记忆”,每次 HTTP 请求都是独立的。

二、Session

狭义的 Session 指的是会话,即客户端与服务端之间一对一的 “相互沟通”,一次会话往往包含多次通信;广义的 Session 指的是会话状态,即会话的相关状态信息,例如用户信息等。

下文的 Session 指的是会话状态

会话状态保持主要有两种方案:

  • Server Side Session:服务器存储信息,客户端携带存储信息对应的 key
  • Client Side Session:客户端存储信息

三、Server Side Session

1. 工作方式

  • 服务端将状态信息存储在 Session 库中,生成 session_id
  • 客户端访问服务端时,应该携带 session_id
  • 服务端根据客户端携带的 session_id 查找对应的 Session

2. 缺点

  • 如果存在 多 Server + 负载均衡 + Session 本地化存储 的情况,需要考虑 Session 分布式存储时的访问问题。常见的解决方案有:

    • Session Sticky:将用户与服务器绑定,每个用户都始终只与一台服务器进行通信
    • 将 Session 集中存储

四、Client Side Session

1. 工作方式

  • 服务端将状态信息打包,交给客户端存储
  • 客户端访问服务端时,应该携带状态信息
  • 服务端提取客户端携带的状态信息,做校验后使用

2. 常见方案

常通过 JWT 实现,具体请看:

技术分享 JWT

参考