关于Jwt的一些思考
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Jwt的一些思考相关的知识,希望对你有一定的参考价值。
在使用jwt
的过程中发现了两个问题续期和退出的问题。
续期
因为jwt
的token
在签发之后是有过期时间的,所以就存在管理这个过期时间的问题。我看网上有提出解决方案的大致有下面几个
- 每次更新过期时间,跟session一样,每次请求的时候都会去更新下
token
过期时间.但是对于jwt
来说,更新过期时间就意味着jwt
的token
会变,那么前端就需要每个请求都去保存一次新的token
。这样使得前端的工作变的复杂起来。而且这样做的话,会存在多个令牌同时有效,可能会引起一些安全问题。 - 还有一个就是每隔一段时间去更新一次
token
。这种做法也是很多人采用的一种。比如:token
过期时间是一个小时。预设每五十五分钟去更新token
。这种模式也是需要前端去配合完成的。
退出
因为token
在签发之后在一段时间内是一直有效的,那么这种情况,我们怎么去管理登出呢?
- 简单的方式就是客户端直接删除
token
。但是这样的话,如果token
泄露了也是不安全的。 - 有人提出退出的时候将
token
存放在redis
中,过期时间设置为跟token
的时候一样。当用户在次用旧的token
访问的时候,如果发现redis
中存在token
,那么提示token
过期。
对于续期的话,个人觉得第二种方案是比较好的一种方案。而退出的话,如果不考虑泄露的问题,那么第一种方案是比较好的一种方案。但是如果做SSO
的话可能第二种方案是比较好的一种,但是在用到了redis
之后就违背了jwt
的设计初衷,需要与数据库交互。
其实个人觉得,jwt
的加密方式结合redis
这种也是可以采用的。毕竟这些都是为了解决问题。当利用到redis
之后,我们就可以将jwt
扩展下。在payload
部分加载一个生成的refresh token
,这个refresh token
也是有过期时间的,我们需要将这个refresh token
存放在redis
中。这样的话,我们就可以把jwt
的过期时间放在这个refresh token
中维护。续期也就是维护这个refresh token
的过期时间,退出的话 也就是删除这个refresh token
就可以了。
其实这样的话就跟传统的token
验证一样了,也就是外层加了一个jwt
的验证。
可能是我对于这方面了解的比较少,不能想到什么有效的方案。这些都是自己对jwt
的一些理解。如果哪位大佬有更好的方案,希望赐教。感谢
原文地址:https://segmentfault.com/a/1190000016650479
以上是关于关于Jwt的一些思考的主要内容,如果未能解决你的问题,请参考以下文章