web会话管理方式详解

目前流行的web业务系统,只要存在动态请求,就绕不开用户管理的基础组件------会话管理,本文将阐述几种常用的会话管理方式。

什么是会话管理

http短连接的问题:无状态,请求中没有用户信息,无法确定请求发起方是谁,从而进行进一步的鉴权以及业务处理。 会话简单来说,就是指用户从登录到退出的这个时间窗口,以及发生在这个窗口内的一系列业务操作。 而管理会话的机制就是"会话管理"。

会话管理的方式

从web应用开发的发展过程中,大致出现了三种会话管理方式。

session-based 管理方式

实现

1)用户登录后,服务端会为该用户生成一个session对象,其中包含用户的登录凭据,该对象有一个唯一标识,称为sessionid。

2)服务端通过set-cookie,以cookie:sessionid=xxxx的形式将sessionid同步给客户端。

3)客户端在接下来的请求中会依赖于cookie的机制,把sessionid带给服务端,这样服务端就能够通过该id获知请求的是哪个用户,其登录凭据是否有效。

4)session会被设定有效期,例如2小时,在超出有效期之后,服务端就会销毁对应session对象。一般在设计时,服务端在session有效期内收到请求后,会自动把session的有效期重新设置。

优缺点

  • 优点

1)安全,因为存到客户端的只是sessionid,并且其一般是无规则的,不好破解

2)实现简单

  • 缺点

1)用户在线数量多时,占用存储空间多

2)服务端节点多的时候,session信息必须共享,需要相应的同步机制

3)多个应用要共享sessionid,需要做cookie跨域处理

cookied-based 管理方式针对session-based存在的服务端存储和架构问题,推出了将凭证信息直接保存到客户端cookie的管理方式。

实现

1)用户登录后,服务端为用户生成登录凭证,并对该凭证进行签名和加密处理。签名是为了防止凭证被篡改,加密是为了在传输过程中,凭证细节被明文截获。凭证最简单的内容可以是uid。

2)服务端使用set-cookie将上述凭证设置到客户端,需要设置cookie有效期,例如2小时

3)客户端在接下来的请求中会依赖于cookie的机制,把凭证带给服务端,服务端解密后,校验凭证是否有效,是否被篡改。确认凭证有效后,根据凭证内容获得请求用户信息

优缺点

  • 优点

1)服务端不需要存储凭证,无状态

2)当服务端多节点时,只要保证使用相同的密钥,可以对凭证进行加解密,并且保证签名算法相同即可

  • 缺点

1)使用cookie保存,受cookie空间大小限制

2)多个应用要共享sessionid,需要做cookie跨域处理

token-based 管理方式

由于cookie-based受cookie机制的限制,因此又提出了一种新的方式,token-based管理方式。 这种管理方式的实现,和cookie-based方式很像,差别是凭证存储的方式不是cookie,而是由客户端通过本地存储进行保存。

实现

1)用户登录后,服务端为用户生成登录凭证,并对该凭证进行签名和加密处理。签名是为了防止凭证被篡改,加密是为了在传输过程中,凭证细节被明文截获。凭证最简单的内容可以是uid。最后生成的就是token。

2)服务端将token填入返回内容,返回给客户端

3)客户端将token保存到本地存储中

4)客户端在接下来的请求中会把token通过url参数或者header的方式带给服务端,服务端解密后,校验凭证是否有效,是否被篡改。确认凭证有效后,根据凭证内容获得请求用户信息

优缺点

  • 优点

1)服务端,无需存储token,无状态

2)当服务端多节点时,只要保证使用相同的密钥,可以对凭证进行加解密,并且保证签名算法相同即可

3)不受制于cookie大小限制

4)可以将token扩展为access_token+refresh_token的双token机制,提供access_token自动刷新机制

  • 缺点

1)相对于session-based管理方式,如果想在服务端侧强制限制用户访问,需要增加额外的token过期机制,很类似于服务端存储session对象的机制。

总结

总的来说,token-based管理方式应该是当下最流行的会话管理方式,在增加了token过期机制后,该管理方式可以应对大部分的业务场景。

相关推荐
南山乐只19 分钟前
【Spring AI 开发指南】ChatClient 基础、原理与实战案例
人工智能·后端·spring ai
努力的小雨2 小时前
从“Agent 元年”到 AI IDE 元年——2025 我与 Vibe Coding 的那些事儿
后端·程序员
源码获取_wx:Fegn08952 小时前
基于springboot + vue小区人脸识别门禁系统
java·开发语言·vue.js·spring boot·后端·spring
wuxuanok2 小时前
Go——Swagger API文档访问500
开发语言·后端·golang
用户21411832636023 小时前
白嫖Google Antigravity!Claude Opus 4.5免费用,告别token焦虑
后端
爬山算法3 小时前
Hibernate(15)Hibernate中如何定义一个实体的主键?
java·后端·hibernate
用户26851612107564 小时前
常见的 Git 分支命名策略和实践
后端
程序员小假4 小时前
我们来说一下 MySQL 的慢查询日志
java·后端
南囝coding4 小时前
《独立开发者精选工具》第 025 期
前端·后端