
一. 日常啰嗦
按照日常惯例先来一段官方给出的简介:
🔘JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。
🔘JWT作为一个开放的标准(RFC 7519)定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的。
🔘JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。
针对上述简介给出的特点,进行辅助理解:
🔘简洁(Compact):可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快;
🔘自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库;
那到底JWT组成的样子是什么呢?
![]()
二. JWT组成
JWT组成格式类似:xxxx.xxxx.xxxx的字符串,这里JWT的官网(https://jwt.io/)给出了JWT生成与验证的工具。
JWT主要由三个部分组成:头部(HEADER),载荷(PAYLOAD),签证(SIGNATURE)。
![]()
2.1 头部(HEADER)
HEADER主要为了描述该JWT的最基本信息,主要包含两个部分:声明类型和声明加密算法(通常直接使用HMAC,SHA256)。
![]()
2.2 载荷(PAYLOAD)
载荷主要是存放有效信息,这些信息按照职能可以分成三个部分。标准的注册声明,公共的声明,私有的声明。
![]()
标准的注册声明:(建议使用但是不强制要求)
![]()
公共的声明 :公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。但不建议添加敏感信息,因为该部分在客户端可解密。
私有的声明 :私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为BASE64是对称解密的,意味着该部分信息可以归类为明文信息。
然后对载荷按照BASE64进行编码(该编码是可以对称解密),这样就构成了JWT的第二部分。
2.3 签证(SIGNATURE )
JWT的第三部分是一个签证信息,这个签证信息主要由三个部分组成:Header(BASE64后),Payload(BASE64后),secret。
首先这个部分需要BASE64加密后的header和payload,然后使用进行连接组成的字符串,然后通过header中指定的加密方式,进行加盐值secret组合加密,然后就构成了JWT的第三部分。
![]()
三.JWT认证流程
![]()
四.整合JWT实例
按照日常的习惯这个时候应该来一个例子:按照SpringBoot进行整合。
![]()
工程结构:
![]()
🔘JwtCfg类: 这个类中声明了一个@Bean ,用于生成一个过滤器类,对/secure 链接下的所有资源访问进行JWT的验证。
![]()
🔘JwtFilter类:这个类声明了一个JWT过滤器类,从HTTP请求中提取JWT的信息,并使用了“secretkey”这个密匙对JWT进行验证。
![]()
🔘UserController类: 这个类模拟了一个用户的注册的登陆,生成JWT的字符串的过程。
![]()
🔘SecureController类:用于测试JWT功能,当用户认证通过才能访问,/secure下的资源文件。
![]()
五. 功能测试
1.模拟用户登陆获成功之后获取JWT字符串。
![]()
2.不带JWT直接访问受限制的资源,这个时候服务器返回500错误。
![]()
3.将获取到的JWT作为 Authorization属性提交,然后对资源进行访问。
![]()
👌OK ! that's all👌