1、JWT简介



JWT:Json Web Token,是基于Json的一个公开规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,他的两大使用场景是:认证和数据交换



使用起来就是,由服务端根据规范生成一个令牌(token),并且发放给客户端。此时客户端请求服务端的时候就可以携带者令牌,以令牌来证明自己的身份信息。



作用:类似session保持登录状态 的办法,通过token来代表用户身份。



 



2,JWT生成




 



3,JWT校验




 



4,一些问题



a、token到底生成什么样最好?(规则),每个用户要 唯一



b、token返回给客户端之后,服务端还要 保存吗?



c、校验token时,怎么保证数据并没有被黑客拦截并篡改?( 安全)



d、token颁发给客户端之后,要不要有 过期时间?



e、 多次登录生成的token都是一样的吗?都是可用的吗?



 



5,JWT规则详解



一个JWT实际上就是一个字符串,它由三部分组成:头部、载荷与签名 header.payload.signature



一个正常的token为: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjYyNywiZXhwIjoxNTcwMDE0ODg1fQ.vPbQh4syxNCzkKXKPSM93LzzLqoJdzPDNeKz8tz9cFM4NzhIOdPrJcH2DG-9-9MCUufCgrAhhGjuo85GKV4bOQ



 




 



6,JWT令牌的优点:



a、jwt基于json,非常方便解析



b、可以再令牌中自定义丰富的内容,易扩展(payload可以扩展)



c、通过签名,让JWT防止被篡改,安全性高



d、资源服务使用JWT可不依赖认证服务即可完成授权



 



 



7,demo测试



1 /** 2 * JWT 测试controller 3 * 4 * @author wangmeng 5 * @date 2019/9/2 6 */ 7 @RestController 8 @RequestMapping(value = "/user", produces = { "application/json; charset=UTF-8" }) 9 public class JWTController { 10 11 12 private static final String SECRET = "wangmengtest.@163.com"; 13 14 15 @RequestMapping("/login/{username}/{password}") 16 public Map login(@PathVariable String username, @PathVariable String password) { 17 Map result = new HashMap(); 18 if (username.equals("admin") && password.equals("123456")) { 19 String jwt = Jwts.builder(). 20 setSubject(username). 21 signWith(SignatureAlgorithm.HS512, SECRET). 22 compact(); 23 result.put("token", jwt); 24 } else { 25 result.put("message", "账号密码错误"); 26 } 27 28 29 return result; 30 } 31 32 33 @RequestMapping("/goods/{token}") 34 public Map verifyToken(@PathVariable String token) { 35 Map result = new HashMap(); 36 Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token); 37 result.put("username", claimsJws.getBody().getSubject()); 38 return result; 39 } 40 }



 



 



请求测试:



1、生成token




java jwt token反解析 jwt token原理_服务端


 


2、使用token请求,获取username


java jwt token反解析 jwt token原理_服务端_02


 


 


8、问题解答


a、token到底生成什么样最好?(规则),每个用户要唯一


三部分组成:头部、载荷与签名 header.payload.signature


 


b、token返回给客户端之后,服务端还要保存吗?


服务端不需要保存


 


c、校验token时,怎么保证数据并没有被黑客拦截并篡改?(安全)


signature中有私钥来进行签名,可以保证安全性


 


d、token颁发给客户端之后,要不要有过期时间?


需要设置token过期时间


 


e、多次登录生成的token都是一样的吗?都是可用的吗?


可以再payload加上时间戳,来保证每次生成的token都不一样,都是可用的


 


 后记


JWT还有很多内容需要挖掘,这里只是入门篇,后面有时间还会看看JWT源码 以及一些常见的坑。