Session 是一种在无状态的 HTTP 协议中用来实现用户状态管理的机制。它通过在服务器端保存用户的状态信息,并通过客户端在每次请求时传递一个唯一的标识符(通常称为 Session ID
),实现了在多个请求之间维持用户的会话状态。
一、Session 的工作原理:
-
客户端发送请求:用户首次访问网站时,客户端(例如浏览器)向服务器发送一个 HTTP 请求。
-
服务器创建 Session:
- 服务器在接收到请求后,会为这个用户创建一个
Session
对象,用来保存用户的会话信息(例如用户身份、购物车内容、浏览历史等)。 - 服务器生成一个唯一的
Session ID
,通常是一个随机的字符串,用来标识这个Session
。
- 服务器在接收到请求后,会为这个用户创建一个
-
服务器返回
Session ID
:- 服务器将生成的
Session ID
通过 HTTP 响应传回给客户端,通常是以Cookie
的形式存储在客户端的浏览器中。这个Cookie
通常名为JSESSIONID
或其他类似名称。
- 服务器将生成的
-
客户端携带
Session ID
发送后续请求:- 当客户端发送后续的 HTTP 请求时,浏览器会自动在请求头中附带上
Session ID
,以便服务器识别出是同一个用户的请求。 - 服务器通过
Session ID
找到对应的Session
,从而获取并更新用户的会话信息。
- 当客户端发送后续的 HTTP 请求时,浏览器会自动在请求头中附带上
-
服务器处理请求:
- 服务器根据找到的
Session
中存储的信息来处理用户的请求。例如,如果用户已登录,服务器可以从Session
中获取用户的登录状态,而无需每次都重新认证用户身份。
- 服务器根据找到的
-
Session 过期与销毁:
Session
具有过期时间,如果在设定的时间内客户端没有再次访问服务器,这个Session
会自动失效,服务器将会销毁这个Session
。- 用户主动登出时,服务器也会销毁对应的
Session
,以确保安全性。
二、Session与Token的区别
1、存储位置的不同
- Session存储在服务端,服务端会维护一个"Session"数据库,用户的会话信息将存储在服务器上面(如登录状态、权限等)。客户端只存储“Session ID”,通常用cookie保存
- Token,通常使用JWT实现,包含用户身份等。“Token由服务器生成并返回给客户端,客户端负责存储(LocalStorage、SessionStorage、或cooki),每次请求时附带发给服务端
2. 安全性:
-
Session:
- 因为
Session
信息存储在服务器端,客户端只持有一个Session ID
,安全性较高。如果Session ID
被窃取,攻击者可以冒充用户发起请求,但无法直接读取用户的会话信息。 - 服务器需要额外的资源来维护和保护
Session
数据,尤其在高并发环境下,可能导致扩展性问题。
- 因为
-
Token:
Token
是自包含的,所有的身份信息都在 Token 中,如果 Token 被窃取,攻击者可以完全冒充用户。Token
通常使用加密和签名技术来防止篡改和伪造,可以通过设置过期时间和刷新机制来提高安全性。
3、扩展性:
-
Session:
- 由于
Session
存储在服务器端,随着用户数量增加,服务器需要更多的内存和存储来维护会话状态。这在分布式系统中可能会导致复杂性,因为需要在多个服务器之间共享或同步Session
数据。
- 由于
-
Token:
Token
是无状态的,不依赖于服务器存储。服务器不需要存储每个用户的会话信息,因此更容易扩展,尤其适合微服务架构或跨域请求。- 服务器只需要验证
Token
的签名和有效性,不需要与其他服务器同步状态信息。