jwt
基本介绍
jwt 全称是jsonWebToken, 简单的说就是一种能够携带信息的token。
在传统的web环境中,浏览器和后端通过记录在浏览器的cookie 和存储在服务端的session 来实现登录状态,而cookie session的方式在多分布式环境下可能带来session复制,跨域访问,单点登录等问题;
直接使用后端生成token的方式,服务端也需要存储生成的token信息,因为token是无意义的。而使用jwt ,能够携带一些必要得信息比如用户id 和用户名称等;
后端就不需要对生成的token做存储,同时jwt也有时间的有效期。能够做到请求接口无状态;
缺点:
- 安全性,payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据。而session的信息是存在服务端的,相对来说更安全。
- 无法废弃,只能等待过期失效,或增加其他的黑名单类似的逻辑处理失效。
jwt 官网: https://jwt.io/
格式
在使用过程中是一个base64编码的字符串
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
此字符串通过逗号分割是由3部分组成
第一部分是 header 区域,只要表示当前签名的加密方式;
第二部分是 plaoyload 区域,存储了当前的token携带的信息,包含颁发给谁,有效期等
第三部分是 将前2部分通过加密生成的,主要用于服务端校验token的合法性;
使用
基本依赖
引用对应的依赖,关于jwt的工具类有很多,这里使用 https://github.com/jwtk/jjwt
引入maven依赖
<!--api->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<!---实现-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
创建token使用
//设置自定义header 信息
JwtBuilder jwtBuilder = Jwts.builder().setHeaderParam("a", "b");
Calendar instance = Calendar.getInstance();
instance.add(Calendar.MINUTE,30);
Date expire = instance.getTime();
//设置playload信息
jwtBuilder = jwtBuilder.setIssuer("me") //谁颁发的
.setSubject("Bob") // token的主体是什么 ,是关于什么的
.setAudience("you") // 给谁的
.setExpiration(expire) //失效时间
.setNotBefore(new Date()) //不能在此时间之前获取
.setIssuedAt(new Date()) //签发时间
.setId(UUID.randomUUID().toString());//id
//设置自定义的playload信息
jwtBuilder.claim("key","value");
//构建签名算法,更多签名算法查看 SignatureAlgorithm
Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
jwtBuilder = jwtBuilder.signWith(key);
//执行压缩 使生成的字符串变小
jwtBuilder = jwtBuilder.compressWith(CompressionCodecs.DEFLATE);
System.out.println(jwtBuilder.compact());
解析读取token
JwtParserBuilder jwtParserBuilder = Jwts.parserBuilder();
//设置解析的签名算法
jwtParserBuilder = jwtParserBuilder.setSigningKey(key);
Jws<Claims> claimsJws = jwtParserBuilder.build().parseClaimsJws(jwtStr);
String signature = claimsJws.getSignature();
System.out.println("<========>");
Syste