1·介绍:JSON Web Token(JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。
2·组成:
1·头部(Header)(非敏感)
头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。
{"typ":"JWT","alg":"HS256"}在头部指明了签名算法是HS256算法。 我们进行BASE64编码https://www.qqxiuzi.cn/bianma/base64.htm/,编码后的字符串如下:(BASE64不是加密算法,可以进行编码和解码处理的)
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
由于头部是可以被反编译的,有泄露风险,不建议存放敏感数据
2·载荷(playload)(非敏感数据)
载荷就是存放有效信息的地方。该部分的信息是可以自定义的
定义一个payload:
{"sub":"1234567890","name":"John Doe","admin":true}然后将其进行base64编码,得到Jwt的第二部分。
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG7CoERvZSIsImFkbWluIjp0cnVlfQ
载荷同理,也有泄露风险
3·签证(signature)
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
签名算法( header (base64后的).payload (base64后的) . secret )这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret秘钥组合加密,然后就构成了jwt的第三部分。
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
简单来讲,使用 头部+载荷密文+salt(盐)进行加密后,组成jwt第三部分。
3·使用方法:
~导入依赖
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency><dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
~生成令牌
public void createJWT(){
// secret 自定义的秘钥,不能泄露
String secret="Wen";
String compact = Jwts.builder()
.setId(UUID.randomUUID().toString())//设置唯一标识
.setSubject("JRZS") //设置主题
.claim("name", "nineclock") //自定义信息
.claim("age", 88) //自定义信息
.setExpiration(new Date()) //设置过期时间
.setIssuedAt(new Date()) //令牌签发时间
.signWith(SignatureAlgorithm.HS256, secret)
.compact();//签名算法, 秘钥System.out.println(compact);
}
~校验令牌 通过自定义秘钥,可以反编译得到需要的数据
public void testVerify(){
String jwt = " exampleCompact ";
Claims claims = Jwts.parser().setSigningKey("Wen").parseClaimsJws(jwt).getBody();
System.out.println(claims);
}
小结: JWT提供的加密方式,轻量化容易上手,但是秘钥在后台是透明的,有泄露风险。更合理的加密方式在SpringSecurity中.