初学对 jwt 的一点疑惑

2020-02-26 10:35:44 +08:00
 rqxiao

最近了解了 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 是有效的呢

1572 次点击
所在节点    问与答
8 条回复
Vegetable
2020-02-26 10:43:03 +08:00
jwt 本身能证明自己不是伪造的,只要你的签名没泄露。这也是它存在的意义——避免服务端储存“状态信息”

然后实际应用中经常有人会保存一些”状态信息“或者 jwt 本身,因为 jwt 是无法单独作废的。
Jacky23333
2020-02-26 10:52:15 +08:00
jwt 包含三个东西,第一个是 header,里面指定了加密算法,第二个是 payload,里面包含了需要传递的数据,通常包括标识用户身份的信息比如用户 id,还有签发人跟过期时间等等,第三部分是签名,就是通过算法对前面 payload 进行加密得到加密串。所以当你服务端收到 token 之后,你就通过相同的算法对 payload 进行加密,加密完和签名进行对比,如果一致那就说明 payload 没被篡改过,数据都是可信的,所以你也就可以知道了用户的真实身份,相反的,如果跟签名不符合,那就说明 payload 被修改过,token 无效。如果只是简单的鉴权功能,服务端是不需要保存 token 信息的,除非你系统需要把某个 token 拉黑等等操作才需要保存 token 进行对比
lianglianglee
2020-02-26 15:37:26 +08:00
简单来说 JWT 分为部分 header, payload, signature,签名包含:header(base64) payload(base64) secret
服务端只需要验证签名,签名有效则 JWT 里的 playload 就有效
一般 playload 存放当前用户的唯一标识
ymz
2020-02-26 18:11:14 +08:00
@Jacky23333 如果篡改了 payload,同时再根据 header 里算法加密修改后的 payloy,然后将现在的加密串替换原来的。 不就整个篡改了?
yimity
2020-02-26 18:20:40 +08:00
@ymz 去看下实现或者说规范,你这个人家也考虑到了。
rqxiao
2020-02-26 18:32:48 +08:00
@ymz 3l 说到了 还有个 secret sercet 是服务端的 不能泄露的,应该是这个
ymz
2020-02-26 19:18:49 +08:00
@rqxiao 就类似盐的
Jacky23333
2020-02-26 21:46:48 +08:00
@ymz 要加盐的,因为回复篇章原因,就没有说得那么详细

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/647626

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX