Jwt的新手入门教程

1.Jwt究竟是什么东东?
学习交流君羊【】暗号:67
再贴官方的定义:
What is JSON Web Token?
JSON Web Token (JWT) is an open(RFC 7519) thataand self- way foras a JSON . Thiscan beandit is. JWTs can beusing a(with the HMAC ) or a / key pair using RSA or ECDSA.
JWTs can beto also
, we will focus on.canthe
of theit, while
hide thosefrom other . Whenareusing
/ key pairs, thealsothat only the
partythekey is the one thatit.
我的理解总结:Jwt全称是Json Web Token,顾名思义就是一种通过Json方式来传输的令牌,并且他最大的特点就是,签发者可以使用各种的加密方式对信息进行签名,更重要的是Jwt还能验证token是否被篡改或者token是否正确 。当然了,这种方式注定是不安全的 。我们很容易地就可以在官网得到这一结论 。文章来源乐字节
可以看到,只要我们获得token字符串,就可以获取到里面的大部分信息,除了签名的密钥 。
所以Jwt简单来说,就是简单地存储部分不那么重要的信息,通过Json,对客户端进行验证的一种方式 。
2.Jwt的组成
? 从官网的界面,我们可以得知,Jwt由三部分组成 。

Jwt的新手入门教程

文章插图
"alg": "HS256","typ": "JWT"
这个的含义就是"alg"–(算法) 是HS256 。
{"sub": "1234567890","name": "John Doe","admin": true}
但是要注意的是,记录的这些信息是完全公开的,所以千万不能把用户或者系统的敏感数据放到中,只是负责记录简单信息,并不具备加密的功能 。
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
可以说这部分是Jwt的重点,因为他承担着两个作用,第一个:验证在传输过程中没有受到篡改 第二个:验证签发人的身份
? 详细说一下这两个作用 。
验证在传输过程中没有受到篡改,这个原理就比较好理解,因为中有一个字符串,也就是,这个是由我们来设置的,相当于私钥,只有我们自己才知道,别人是不知道的 。那么在后续验证过程中,只要我们自己生产的Token与客户端传来的Token进行比对,如果一致那就证明该Token没有受到篡改,反之则证明客户端传来的Token是非法的 。
验证签发人的身份,其实第二个作用是从第一个作用中展现而来的,因为如果能证明Token在传输过程中没有受到篡改,那就更加说明服务端是这个签名的签发者,因为只有签发者才知道私钥 。
? 其实我们也可以认为是盐(salt),我们知道如果单纯地在数据库中存储明文密码,或者是只经过一重MD5加密的密码,是非常的不安全,因为就算是经过MD5加密,仍然可以通过暴力穷举的方式来进行破解,可是如果在用户密码的基础上,加上我们生成的随机或固定的字符串,然后再进行加密,那么安全程度会大大提升 。
? 如果不知道盐(salt)的童鞋,可以去bind搜索一下相关资料,其实理解起来就是用户密码+我们设置的随机或固定字符串再进行多重加密 。
3.编码实现
? 我们来创建这几个类 。
配置类:
@Configurationpublic class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(authenticationInterceptor()).addPathPatterns("/**").excludePathPatterns("/login");}@Beanpublic JwtInterceptor authenticationInterceptor() {return new JwtInterceptor();}}
控制类:
@RestControllerpublic class UserController {@PostMapping("/login")public Map, Object> login(@RequestBody User user) {Map, Object> map = new HashMap