如果当前微服务是一个大型情侣酒店,那么我们该如何管理众多房客而不乱套?(一)
这里就涉及到会话管理,有两种会话方式:Session与JWT,在项目当中推荐使用JWT方式作为会话技术,以下是这两种会话方式的区别。
Session-Cookie
这种会话方式我们需要区分为传统单机Session与分布式Session。
在传统单机web应用中,一般使用tomcat/jetty等web容器时,用户的session都是由容器(单JVM内有效)管理。浏览器使用cookie中记录sessionId,容器根据sessionId判断用户是否存在会话session。分布式与集群场景下,请求将被负载发送至不同服务器,Session必需要被共享方可满足需求。
传统Session存储架构:
分布式Session登场
会话信息存储在服务器端Session对象当中,这种方式在分布式会话场景下,相对比较繁琐一点,一般我们用SpringSession做分布式会话,会话信息一般会选择第三方中间件进行存储,比如:MongoDB,Redis,Mysql,这三种存储方式分布式会话框架SpringSession都支持,已经提供springboot的集成,我们只需要做相关配置即可。
1 比如我们一Redis作为分布式Session存储服务 2 第一步:引入依赖 3 <!‐‐sessions 依赖‐‐> 4 <dependency> 5 <groupId>org.springframework.session</groupId> 6 <artifactId>spring‐session‐data‐redis</artifactId> 7 <version>2.0.6.RELEASE</version> 8 </dependency> 9 <!‐‐redis 依赖‐‐> 10 <dependency> 11 <groupId>org.springframework.boot</groupId> 12 <artifactId>spring‐boot‐starter‐data‐redis</artifactId> 13 <version>2.0.6.RELEASE</version> 14 </dependency> 15 在application.yml配置redis与Session 16 spring: 17 redis: 18 host: 192.168.0.198 19 port: 6379 20 session: 21 # spring session使用存储类型,springboot默认就是使用redis方式,如果不想用可以填n one。 22 store‐type: redis 23 分布式会话搞定!就这么简单
SpringSession原理如下图:
JWT
全称JSON Web Token,用户会话信息存储在客户端浏览器,它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象进行安全传输信息。这些信息可以通过对称/非对称方式进行签名,防止信息被串改。。由此可知JWT是:
1 是JSON格式数据
2 是一个Token,也就是一个令牌方式
JWT数据包含三部分:
1 Header
2 Payload
3 Signature
三者组合在一起
1 Header.Payload.Signature
2 示例: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZXN0IiwiY3JlYXRlZCI6MTU3NzE3NjE0OTQ3OCwiZX hwIjoxNTc3NzgwOTQ5fQ.qSlhJNpom2XeeqMyXST2AdHvAjztWqR4zvQQEc‐K8qMsJ3XQpwpQsnG7tK06YoYrjcnH5NW2EGjtemIc_00VIw
Header
1 描述JWT元数据 2 { 3 alg: "HS256", 4 typ: "JWT" 5 } 6 1、alg属性表示签名的算法,默认算法为HS256,可以自行别的算法。 7 2、typ属性表示这个令牌的类型,JWT令牌就为JWT。 Header = Base64(上方json数据)
Payload
1 使用方式如下,userid,created(token创建时间),exp(最近更新时间)
2 data = {"userid":"yangguo","created":1489079981393,"exp":1489684781} Payload = Base64(data) //可以被反编码,所以不要放入敏感信息
Signature
1 HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
2 secret为加密的密钥,密钥存在服务端
JWT工作方式
1 通常我们把token设置在request‐Header头中,每次请求前都在请求头加上下方配置 Authorization: Bearer <token> 示例: 2 Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZXN0IiwiY3JlYXRlZCI6MTU3NzE3Nj E0OTQ3OCwiZXhwIjoxNTc3NzgwOTQ5fQ.qSlhJNpom2XeeqMyXST2AdHvAjztWqR4zvQQEc‐K 8qMsJ3XQpwpQsnG7tK06YoYrjcnH5NW2EGjtemIc_00VIw
JWT身份认证流程
1、用户提供用户名和密码登录
2、服务器校验用户是否正确,如正确,就返回token给客户端,此token可以包含用户信息
3、客户端存储token,可以保存在cookie或者local storage
4、客户端以后请求时,都要带上这个token,一般放在请求头中
5、服务器判断是否存在token,并且解码后就可以知道是哪个用户
6、服务器这样就可以返回该用户的相关信息了
流程图如下:
jwt与session会话的对比
jwt:用户信息存在客户端(storage,cookie),
jwt-泄露后?
密码丢失后,修改密码!修改之后
jwt-每次传递token;
Session:
本地:jessionid-服务端:redis里的用户信息
有状态:

浙公网安备 33010602011771号