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过期机制后,该管理方式可以应对大部分的业务场景。

相关推荐
一 乐1 分钟前
在线考试|基于springboot + vue在线考试系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
女王大人万岁17 分钟前
Go标准库 path 详解
服务器·开发语言·后端·golang
qq_124987075326 分钟前
基于spring boot的调查问卷系统的设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
Eaxker30 分钟前
Java后端学习4:MySQL
后端·mysql
LuminescenceJ1 小时前
RPC通信中的Context上下文如何跨进程传递消息,gRPC为例分析
开发语言·网络·后端·网络协议·rpc·golang
Remember_9931 小时前
Spring 中 REST API 调用工具对比:RestTemplate vs OpenFeign
java·网络·后端·算法·spring·php
源代码•宸1 小时前
分布式理论基础——Raft算法
经验分享·分布式·后端·算法·golang·集群·raft
晨非辰3 小时前
Linux权限管理速成:umask掩码/file透视/粘滞位防护15分钟精通,掌握权限减法与安全协作模型
linux·运维·服务器·c++·人工智能·后端
毕设源码-钟学长14 小时前
【开题答辩全过程】以 基于SpringBoot的智能书城推荐系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
青春男大15 小时前
Redis和RedisTemplate快速上手
java·数据库·redis·后端·spring·缓存