近似乎裸奔的认证方式 --- JWT(JSON Web Token)

一. 日常啰嗦

按照日常惯例先来一段官方给出的简介:

🔘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👌