学习自深入理解微服务
采用Spring Security OAuth2 和 JWT的方式,Uaa服务只需要验证一次,返回JWT。返回的JWT包含了用户的所有信息,包括权限信息
从三个方面讲解:
- JWT详解
- Spring Security Oauth2和JWT保护微服务案例详解
- 总结
JWT简介
什么是JWT
JSON Web TOken(JWT)是一种开放的标准(RFC7517),JWT定义了一种紧凑且自包含的标准,该标准旨在将各个主体的信息包装成JSON对象。主体信息通过数字签名进行加密和验证的。常使用HMAC算法或RSA算法(公钥/私钥非对称性加密)算法对JWT进行签名,安全性很高,下面解释JWT的特点:
- 紧凑型(compact):由于是加密后的字符串,JWT数据体积非常小,可以通过POST请求或者Http请求头发送,另外,数据体积小意味着传输速度很快
- 自包含(self-contained):JWT包含了主体的所有信息,所以避免每个请求都需要向Uaa服务验证身份,降低了服务器的负载
JWT的结构
JWT由三个部分组成,分别以’.'分隔,组成部分如下。
- header(头)
- Payload(有效载荷)
- Signature(签名)
因此JWT的通常格式如下
xxxxxxxxxxx.yyyyyyy.zzzzzz
下面来讲解这三个组成部分
- Header
header通常有两部分组成,令牌的类型(即JWT)和使用的算法类型,如HMAC,SHA256和RSA。例如:
{
"alg":"HS256"
"typ":"JWT"
}
将Header用Base64编码作为JWT的第一部分
2. Payload
这是JWT的第二部分,包含了用户的一些信息和Claim(声明,权利)。有三种类型的claim:保留,私人和公开。一个典型的Payload如下:
{
"sub":"1234567890"
"name":"John Doe"
"admin":true
}
将Payload用Base64编码作为JWT的第二部分
3. Signature
要创建签名部分,需要将base64编码后的Header,PayLoad和密钥进行签名,一个典型的格式如下:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
JWT的应用场景
什么时候使用JWT呢?JWT的使用场景如下:
- 认证:这是使用JWT的最常见的场景。一旦用户登录成功获取JWT之后,后续每个请求将携带该JWT。该JWT包含了用户信息,权限点等信息,根据JWT包含的信息,资源服务可以控制该JWT可以访问的资源范围,因为JWT的开销很小,并且能够在不同的域中使用,因此单点登录是一个广泛使用JWT的场景
- 信息交换:JWT是在各方之间安全传输信息的一种方式,JWT使用签名加密,安全性很高。另外,当使用Header和PayLoad计算签名时,还可以验证内容是否被篡改
如何使用JWT
下面来看最常见的应用场景,即认证
—先吃饭