Spring-cloud学习笔记—分布式架构统一认证主流实现方案JWT简介
1.JWT改造统⼀认证授权中⼼的令牌存储机制前的思考
- 当我们第⼀次登陆之后,认证服务器颁发
token
并将其存储在认证服务器中,后期我们访问资源服务器时会携带token
,资源服务器会请求认证服务器验证token有效性
,如果资源服务器有很多,那么认证服务器压⼒会很⼤ - 另外,资源服务器向认证服务器
check_token
,获取的也是⽤户信息UserInfo
,能否把⽤户信息存储到令牌中,让客户端⼀直持有这个令牌,牌的验证也在资源服务器进⾏,这样避免和认证服务器频繁的交互 - 我们可以考虑使
JWT
进⾏改造,使⽤JWT机制
之后资源服务器不需要访问认证服务器 - 在引入OAuth2的starter的时候,JWT就已经以来过来了
2. JWT令牌的介绍
通过上边的测试我们发现
,当资源服务和授权服务不在⼀起时资源服务使⽤RemoteTokenServices
远程请求授权 服务验证token
,如果访问量较⼤将会影响系统的性能。解决上边问题
: 令牌采⽤JWT格式即可解决上边的问题,⽤户认证通过会得到⼀个JWT令牌
,JWT令牌
中已经包括了⽤户相关的信 息,客户端只需要携带JWT访问资源服务
,资源服务根据事先约定的算法⾃⾏完成令牌校验,⽆需每次都请求认证 服务完成授权。
3. 什么是JWT
JSON Web Token(JWT)
是⼀个开放的⾏业标准(RFC 7519),它定义了⼀种简介的、⾃包含的协议格式,⽤于 在通信双⽅传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使⽤HMAC算法
或使⽤RSA的公钥/私钥
对来签名,防⽌被篡改。
4. JWT令牌结构
- JWT令牌由三部分组成,每部分中间使⽤点(.)分隔,⽐如:
xxxxx.yyyyy.zzzzz
Header
:头部包括令牌的类型(即JWT)及使⽤的哈希算法(如HMAC SHA256或RSA){ "alg": "HS256", "typ": "JWT" }
Payload
:第⼆部分是负载,内容也是⼀个json对象,它是存放有效信息的地⽅,它可以存放jwt提供的现成字段,⽐如
:iss(签发者),exp(过期时间戳), sub(⾯向的⽤户)等,也可⾃定义字段。 此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。 最后将第⼆部分负载使⽤Base64Url编码,得到⼀个字符串就是JWT令牌的第⼆部分。{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } ``
Signature
:第三部分是签名,此部分⽤于防⽌jwt内容被篡改。 这个部分使⽤base64url将前两部分进⾏编码,编码后使⽤点(.)连接组成字符串,最后使⽤header中声明签名算法进⾏签名。
base64UrlEncode(header):jwt令牌的第⼀部分。HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
base64UrlEncode(payload):jwt令牌的第⼆部分。
secret:签名所使⽤的密钥。