JWT篇1:JWT基础知识

1、JWT简介

   JWT,全称是Json Web Token, 是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权;官网:https://jwt.io。

 GitHub上jwt的java客户端:https://github.com/jwtk/jjwt。

【JWT的执行流程】

2、JWT的数据格式

一个jwt实际上由三部分组成,分别是:头部Header、载荷playload、签名signature。

2.1、JWT的头部Header

JWT的头部Header通常有两部分组成:

(1)声明的类型,一般是JWT;

(2)加密算法,通常都是自定义。

通常会对头部进行base64加密(可解密),得到第一部分数据。头部header用于描述关于JWT的最基本的信息,例如期类型以及签名所用的算法等,也可以被表示成为一个JSON对象。

{"type":"JWT","alg":"HS256"}
#type类型是JWT,alg表示签名加密算法是HS256。

 【注意】(1)上面的代码进行BASE64编码(参考http://base64.xpcha.com/)后得到的字符串是eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

扫描二维码关注公众号,回复: 4595809 查看本文章

(2)Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。JDK 中
提供了非常方便的 BASE64Encoder 和 BASE64Decoder,用它们可以非常方便的完成基于 BASE64 的编码和解码。

2.2、JWT的载荷playload

载荷Playload就是存放有效信息的地方。载荷playload包含三个部分:

(1)标准中的声明,官方建议使用但是不强制使用的原则;

iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

(2)公共的声明:公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为这部分内容在客户端可解密。

(3)私有的声明:私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称加密的,因为该部分内容信息是明文信息。

     我们现在自定义一个Playload载荷:

#定义playload载荷内容
{"sub":"1234567890","name":"kefei","roles":"admin"}
#对以上载荷内容进行base64加密之后得到:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImtlZmVpIiwicm9sZXMiOiJhZG1pbiJ9

 2.3、JWT的签名signature

  JWT签名信息是由三部分组成:header部分base64加密之后、playload部分内容base64加密之后的内容、secret。

     JWT签名signature部分需要base64加密后的header和base64加密后的playload使用符号点.连接组成的字符串,然后通过header头部声明的加密方式进行加盐secret组合加密,最后形成JWT的第三部分。

【注意】签名部分secret是确保在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以它就是你服务器端的私钥,在任何场景都不应该公开。

JWT的头部header、载荷playload、签名signature三部分之间通过符号点.连接组成一个完整的字符串,最终形成jwt:

         使用JWT实现单点登录时,需要注意token时效性。token是保存在客户端的令牌数据,如果永久有效,则有被劫持的可能。token在设计的时候,可以考虑一次性有效或一段时间内有效。如果设置有效时长,则需要考虑是否需要刷新token有效期问题。

3、token存储

3.1、token的存储

         使用JWT技术生成的token,客户端在保存的时候可以考虑cookie或localStorage。cookie保存方式,可以实现跨域传递数据。localStorage是域私有的本地存储,无法实现跨域。

3.2、webstorage

      webstorage可保存的数据容量为5M。且只能存储字符串数据。webstorage分为localStorage和sessionStorage
      localStorage的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失。localStorage除非主动删除数据,否则数据永远不会消失。
      sessionStorage是会话相关的本地存储单元,生命周期是在仅在当前会话下有效。sessionStorage引入了一个“浏览器窗口”的概念,sessionStorage是在同源的窗口中始终存在的数据。只要这个浏览器窗口没有关闭,即使刷新页面或者进入同源另一个页面,数据依然存在。但是sessionStorage在关闭了浏览器窗口后就会被销毁。同时独立的打开同一个窗口同一个页面,sessionStorage也是不一样的。
 

猜你喜欢

转载自blog.csdn.net/u013089490/article/details/84443667
jwt
今日推荐