您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

如何利用Token实现分布式Session?

时间:2020-01-07 10:04:42  来源:  作者:

一、前言

这篇文章中我们来了解一下JWT是何方神圣?以及JWT来实现分布式Session。

二、JWT是什么

JWT一看就是简称,它的全称JSON Web Token,从字面上我们看出

1、数据是JSON格式

2、用于Web应用

3、是一个Token,也就是一个令牌方式

看看官方的说明,它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象进行安全传输信息。这些信息可以通过对称/非对称方式进行签名,防止信息被串改。

紧凑的含义:就是JWT比较小,数据量不大,可以通过URL、POST参数或Header请求头方式进行传输。

自包含的含义:jwt可以让用户自定义JWT里面包含的用户信息,如:姓名、昵称等(不要放隐密的信息)。从而避免了多次查询数据库。

三、JWT数据结构

  • JWT由三个部分组成

1、Header

2、Payload

3、Signature

  • 三者组合在一起
Header.Payload.Signature
  • 案例
如何利用Token实现分布式Session?

 

看上去是不是满乱,我们来依次看下里面的结构。

四、Header

这个是JWT第一段数据,表示头部信息,主要的作用是描述JWT的元数据,上面的案例就是:

{ alg: "HS256", typ: "JWT"}

1、alg属性表示签名的算法,默认算法为HS256,可以自行别的算法。

2、typ属性表示这个令牌的类型,JWT令牌就为JWT。

上面的JSON数据会通过Base64算法进行编码而成,看工具图

如何利用Token实现分布式Session?

 

五、Payload

此为JWT第二段数据,用来存放实际需要传递的数据。JWT官方也规定了7个字段供选用

如何利用Token实现分布式Session?

 

当然除了官方字段,我们可以自定义字段,以上面的案例,我们看下实际的数据

如何利用Token实现分布式Session?

 

注意:这段也是用Base64算法,JWT默认是不加密的,任何人都可以获取,只要进行Base64解码就行了,所以不要把隐密的信息放到JWT中

六、Signature

此为JWT第三段数据,主要作用是对前面两段的数据进行签名,防止数据篡改。一般我们进行签名的时候会有个密钥(secret),只有服务器知道,然后利用Header中的签名算法进行签名,公式如下:

HmacSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

算出签名后,把Header、Payload、Signature三个部分拼成一个字符串,之间用(.)分隔,这样就可以把组合而成的字符串返回给用户了。

七、JWT的工作方式

在用户进行认证登录时,登录成功后服务器会返回一个JWT给客户端;那这个JWT就是用户的凭证,以后到哪里去都要带上这个凭证token。尤其访问受保护的资源的时候,通常把JWT放在Authorization header中。要用 Bearer schema,如header请求头中:

Authorization: Bearer <token>
如何利用Token实现分布式Session?

 

八、基于JWT的身份认证

上面的JWT的工作方式,其实就是一个完整的身份认证流程,我们这里把这个讲的在通俗一点。

1、用户提供用户名和密码登录

2、服务器校验用户是否正确,如正确,就返回token给客户端,此token可以包含用户信息

3、客户端存储token,可以保存在cookie或者local storage

4、客户端以后请求时,都要带上这个token,一般放在请求头中

5、服务器判断是否存在token,并且解码后就可以知道是哪个用户

6、服务器这样就可以返回该用户的相关信息了

这个流程小伙伴们有没有发现,用户信息是放在JWT中的,是存放在客户端(cookie,local storage)中的,服务器只需解码验证就行了,就可以知道获取到用户信息。而我们之前的Session方式就不一样。

九、与Session-Cookie方式的区别

Session-Cookie方式的这里就不多作介绍了,之前文章已经介绍了。直接上图说明区别

如何利用Token实现分布式Session?

 

上图是Sesson服务器方式,我们发现Session用户信息是在服务器端存储的。

我们再来看看JWT方式

如何利用Token实现分布式Session?

 

上面的token即用户信息是存储在客户端的,服务器端只要解码即可。

十、JWT方式认证的好处

1、因为token存储在客户端,服务器只负责解码。这样不需要占用服务器端资源。

2、服务器端可以无限扩展,负载均衡器可以将用户传递到任何服务器,服务器都能知道用户信息,因为jwt里面包含了。

3、数据安全,因为有签名,防止了篡改,但信息还是透明的,不要放敏感信息。

4、放入请求头提交,很好的防止了csrf攻击,

说了这么多的好处,那是不是JWT就非常适合替换掉Session方式呢?

十一、JWT方式的坏处

1、token失效问题

JWT方式最大的坏处就是无法主动让token失效,小伙伴们会说token不是有过期时间吗?是的,token本身是有过期时间,但token一旦发出,服务器就无法收回。

如:一个jwt的token的失效时间是3天,但我们发现这个token有异常,有可能被人登录,那真实的用户可以修改密码。但是即使修改了密码,那个异常的token还是合法的,因为3天的失效时间未到,我们服务器是没法主动让异常token失效。

2、数据延时,不一致问题

还有个问题就是因为jwt中包含了用户的部分信息,如果这些部分信息修改了,服务器获取的还是以前的jwt中的用户信息,导致数据不一致。

十二、总结

小伙伴们怎么去选择Session的方式,是用传统的Sesion-Cookie服务器方式,还是用JWT方式,具体集合业务看。不过老顾这里推荐还是用传统的方式,因为以后的业务很有可能会用到用户Session。好了,谢谢!!!



Tags:Session   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
从状态说起原文:「链接」我们知道,HTTP 是无状态的。也就是说,HTTP 请求方和响应方之间无法维护状态,都是一次性的,它不知道前后的请求都发生了什么。但有的场景下,我们需要维护状...【详细内容】
2021-07-29  Tags: Session  点击:(94)  评论:(0)  加入收藏
cookie、session、token区别关于token,session,cookie的概念和区别1.token是 服务经过计算发给客户端的,服务不保存,每次客户端来请求,经过解密等计算来验证是否是自己下发的2.se...【详细内容】
2021-01-18  Tags: Session  点击:(1112)  评论:(0)  加入收藏
老板的苦恼假如你在繁华的街角开了一家店,每天客人络绎不绝。不过你作为老板却有一些苦恼,你想知道自己的顾客上一次是什么时候来的?在店里的时候买了什么商品,方便购物的时候进...【详细内容】
2021-01-07  Tags: Session  点击:(139)  评论:(0)  加入收藏
在单体项目中,我们将用户信息存在 session 中,那么在该 session 过期之前,我们都可以从 session 中获取到用户信息,通过登录拦截,进行操作 但是分布式部署的时候,我们请求的服务器...【详细内容】
2020-10-22  Tags: Session  点击:(118)  评论:(0)  加入收藏
一同事求援:后台系统的登录成功了,但不能成功登进系统,仍然跳转到登录页,但同一套代码另一个环境却没有问题。背景经了解,他对同一个项目使用tomcat部署了两个环境,一个在开发服务...【详细内容】
2020-07-13  Tags: Session  点击:(69)  评论:(0)  加入收藏
为什么要分布式 Session 呢?请参考下图: 当后台集群部署时,单机的 Session 维护就会出现问题。假设登录的认证授权发生在 Tomcat A 服务器上, Tomcat A 在本地存储了用户 Sessio...【详细内容】
2020-03-29  Tags: Session  点击:(46)  评论:(0)  加入收藏
一、前言这篇文章中我们来了解一下JWT是何方神圣?以及JWT来实现分布式Session。二、JWT是什么JWT一看就是简称,它的全称JSON Web Token,从字面上我们看出1、数据是JSON格式2、...【详细内容】
2020-01-07  Tags: Session  点击:(87)  评论:(0)  加入收藏
一、什么是会话?会话可简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。会话过程中要解决一些问题:每个用户与...【详细内容】
2019-12-30  Tags: Session  点击:(82)  评论:(0)  加入收藏
前言Nginx+Tomcat对Session的管理一直有了解,但是一直没有实际操作一遍,本文从最简单的安装启动开始,通过实例的方式循序渐进的介绍了几种管理session的方式。nginx安装配置1....【详细内容】
2019-10-30  Tags: Session  点击:(84)  评论:(0)  加入收藏
php中Session默认都是用文件存储的,thinkphp是提供了redis和Memcache的存储类,但是没有提供Mysql的储存类,现在修改为用数据库的方式储存,直接上代码:<?php/** * session 存mysql...【详细内容】
2019-10-24  Tags: Session  点击:(143)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条