Guns之安全机制之JWT

安全机制之JWT

一、JWT官方解释:

JWT简称Json web token,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

Guns之安全机制之JWT_第1张图片

经典图例

 

二、为什么要用JWT?

当客户端像服务端请求接口,获取数据的时候,每次都需要进行身份的验证,即基础的用户名和密码是否正确。服务端每次从数据库查询账号和密码作比较,会降低运行速度,这个时候就产生了JWT。

JWT的优点:

(1)无需保存在服务器,节约服务器内存开销

(2)无状态、可拓展性强。比如:由A、B组成服务器,若Session存在A机器上,就只能保存在A机器上,此时不能再访问B,因为B上没有存放该Session。使用Token就能够同时验证用户的合法性。

  关于Token和Session验证的区别:

     Token和Session都可以用作身份验证。而Session我们一般叫做一个会话周期,Token我们叫做令牌。

      方案 A :我发给你一张身份证,但只是一张写着身份证号码的纸片。你每次来办事,我去后台查一下你的 id 是不是有效。 
      方案 B :我发给你一张加密的身份证,以后你只要出示这张卡片,我就知道你一定是自己人。 (Token的无状态访问)

 

三、JWT组成:

Token由头部(header)、载荷(payload)和签名(signature)组成,将这三段信息文本用.链接一起就构成了Jwt字符串。像这样

 

Guns之安全机制之JWT_第2张图片

Header

Header是一个简单的声明对象,包括Signature使用生成签名的算法。比如:“alg”:“HS256”是通过HMAC-SHA256签名的。

Payload

载荷中存放了token的签发者(iss)、所面向的用户签发时间(sub)、接收jwt的一方(aud)、过期时间(exp)以及一些我们需要写进token中的信息(可以自定义在Claim当中)。

Guns之安全机制之JWT_第3张图片

Signature

由header+、payload拼接成字符串,再使用服务端生成的secret进行算法加密,生成我们需要的令牌,即token。

Guns之安全机制之JWT_第4张图片

 

四、在“XXXX”项目中JWT相关应用:

单设备登录

关于这个,我想区分一个概念。就是单设备登录(单机登录)和单点登录不是一个意思。

单设备登录:是只能在一个设备上登录,若在其它设备上登录则会被强制挤下线。比如,QQ被挤下线

单点登录(SSO):指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。例如:下图统一身份认证机制

Guns之安全机制之JWT_第5张图片

做这块的功能的时候,开始被这种概念混淆。但是后来发现,其实单点登录以后也是可以有实际意义的。比如以后可以统一管理后台系统,对不同的角色统一管理。

功能实现思路:

首先,有设备唯一标识符,标志设备的唯一性。(通过客户端传的UUID)

其次,对比存储的UUID和每次客户端传的是否一致,如果不一致,则给予提示;否则,放行。

功能实现:为了加强唯一标识符的唯一性,我们将UUID作为用户信息加密,存储到Token中。

如果被其它设备登录,返回客户端异常码,

Guns之安全机制之JWT_第6张图片

并且短信通知。

Guns之安全机制之JWT_第7张图片

登录口令时间过(T+X日)需重新登录

功能思路:首先,登录的时,返回客户端token和refreshToken,两个同时存储在客户端内存。

其次,当用户处于有效期登录状态,当token失效时,通过refreshToken请求出新的token,然后继续访问其它接口;直到长时间未登录使用,refreshToken失效为真正意义的失效,退出,并通知用户。

功能实现:当客户端传入refreshToken想重新获取token时,先解析refreshToken中的用户信息,然后重新组装新的token继续访问其它接口(此时的有效时间在此重新计算达到延长)。

Guns之安全机制之JWT_第8张图片

 

五、展望:

我们已经用JWT解决了单设备登录、登录口令时间过(T+X日)需重新登录。通过JWT还能实现黑名单功能,因为JWT是无状态存储。当用户注销后,将注销的token放在redis中们每次就可以校验黑名单

你是技术宅么?那就加入我们吧!点击下方链接 或 扫描二维码 即可。

欢迎加入 CSDN技术交流群2:(点击即可加群)QQ群:456543087

               CSDN技术交流群(已满员):(点击即可加群)QQ群:681223095。  

商务合作@群主,谢谢!

因经常有人留言,未能及时查看到和回复,所以特建此群,以方便交流。方便问题讨论,有问题和没有问题的小伙伴均可加入,用作自我学习和共同进步。本博主不一定长期在线,但是qq群里会有很多热心的小伙伴,大家一起讨论解决问题。

 

 

 

 

你可能感兴趣的:(java开发笔记)