jwt 是什么 ? json web token 的 简称,是一种无状态的 认证机制
原理:客户端 向服务器端请求一个 jwt 生成的 token ,这个token 带有 一些信息,下次 客户端请求 接口的时候带上这个 token,服务器端 检查这个 token,以此 判断用户的请求是否合法。所以 jwt是做认证的,不要理解成加密的了。
jwt生成的 token 组成: 头部.负载.签名
头部: 是 base64 编码的 包含有签名算法的 json 字符串
比如 header 为 {"alg":"HS512"} 加密以后就是 eyJhbGciOiJIUzUxMiJ9
负载: 有承载的数据 和 时间的 json 字符串 被 base64 转码以后得到的 数据
比如: playload 为 {"sub":"18508280881,100","exp":1532672451} 对应着 eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI2NzI0NTF9
签名:签名是验证 jwt token 是否合法的 签名= 头指定的算法( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
secret 是 一个 只有服务器 知道的 秘钥;
上面的 完整token:eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxODUwODI4MDg4MCwxMDAiLCJleHAiOjE1MzI2NzI0NTF9.sJaL2dpYAQdi3ZloDjIHzuIUetHEupMVD5dnnNjWdHFOrLZXgZi2C68FG1O5UGZ0_JMNW8rqYDECw9ligoc1RQ
secret 是:abc=
Java 代码例子如下
结果
总结 jwt的 用途是做认证,并且这种认证是无状态的和restful 天生一对, jwt 也有明显的缺点 如果 jwt 生成的 token被获取,那么 在token过期的这短时间内 可以一直被利用。 但是这个不是jwt 关心 的重点,可以通过 https 来保证数据传输的安全,可以通过 后端别的机制认证 token 是否过期(不仅仅依赖 token 里面 的 过期时间 )
采坑了:
如果验证在别人那里,被人给你的secretKey 是没有加密的。那么 你 用 base64转码以后再 生成token。 secretKey = Base64.getEncoder().encodeToString( secretKey.getBytes() ); 。否者这边对的,两边一对接就出错。