最近了解了 spring security,oauth2.0 以及 spring security oauth2 的搭建。
spring security oauth2 默认 token 放在内存,也可以配置把 token 放在 redis 里。这样每次请求生成一个 token 就把 token 存起来。
在客户端发出的默认 token 调用业务接口时 ,要去服务器 里存贮( redis )的地方去查找一次 ,才知道 这个令牌包含什么信息,并且确认令牌是否有效。
这些 token 是一种无意义的字符串( uuid ),本身并不包含任何的信息。
但 jwt 这种 token 自带了一些用户信息的 token,可以直接从令牌中解析出用户信息。就比如服务端配置了 jwt 的令牌模式,第一次通过密码模式请求 oauth/token 获得了一个 jwt。接着去访问一个 /hello 的接口 我带着这个用户信息的令牌 ,去访问 。访问成功,这一步服务端,有没有去一个存储的地方去确认?是怎么确认你发的 jwt 是有效的呢
1
Vegetable 2020-02-26 10:43:03 +08:00
jwt 本身能证明自己不是伪造的,只要你的签名没泄露。这也是它存在的意义——避免服务端储存“状态信息”
然后实际应用中经常有人会保存一些”状态信息“或者 jwt 本身,因为 jwt 是无法单独作废的。 |
2
Jacky23333 2020-02-26 10:52:15 +08:00 via Android 3
jwt 包含三个东西,第一个是 header,里面指定了加密算法,第二个是 payload,里面包含了需要传递的数据,通常包括标识用户身份的信息比如用户 id,还有签发人跟过期时间等等,第三部分是签名,就是通过算法对前面 payload 进行加密得到加密串。所以当你服务端收到 token 之后,你就通过相同的算法对 payload 进行加密,加密完和签名进行对比,如果一致那就说明 payload 没被篡改过,数据都是可信的,所以你也就可以知道了用户的真实身份,相反的,如果跟签名不符合,那就说明 payload 被修改过,token 无效。如果只是简单的鉴权功能,服务端是不需要保存 token 信息的,除非你系统需要把某个 token 拉黑等等操作才需要保存 token 进行对比
|
3
lianglianglee 2020-02-26 15:37:26 +08:00 1
简单来说 JWT 分为部分 header, payload, signature,签名包含:header(base64) payload(base64) secret
服务端只需要验证签名,签名有效则 JWT 里的 playload 就有效 一般 playload 存放当前用户的唯一标识 |
4
ymz 2020-02-26 18:11:14 +08:00
@Jacky23333 如果篡改了 payload,同时再根据 header 里算法加密修改后的 payloy,然后将现在的加密串替换原来的。 不就整个篡改了?
|
8
Jacky23333 2020-02-26 21:46:48 +08:00 via Android
@ymz 要加盐的,因为回复篇章原因,就没有说得那么详细
|