JWT的刷新问题
想对新REST API实施基于JWT的身份验证,但是令牌中设置了到期时间,感觉使用不太方便,那么问题来了,是否可以自动延长这个过期时间呢?如果用户频繁使用应用程序,就不希望用户每X分钟后需要重新登录。老是要用户登录,从用户体验的角度来说,肯定是非常糟糕的。
但延长过期时间会创建一个新的令牌(而且同时旧的令牌仍然有效,直到它过期)。并且在每个请求之后生成一个新的令牌,感觉是比较愚蠢的做法。另外,当有多个令牌同时有效时,感觉还会有安全问题。当然,我可以使用黑名单使旧的令牌失效,但是我需要存储令牌。而JWT的优点之一就是无需存储空间。
我找到了Auth0如何解决它的方式。他们不仅使用JWT令牌,还会刷新令牌:https://docs.auth0.com/refresh-token
但是还是同样的问题,为了实现这一点(不使用Auth0),我需要存储刷新令牌并维护它们的到期时间。那么这么做到底有什么用呢?为什么不只有一个令牌(不是JWT)并且在服务器上保持到期?
是否还有其他选择?是不是JWT不适合这种情况呢?
最佳解决方法
我在Auth0公司工作,我参与了刷新令牌功能的设计。
这一切都取决于应用的类型,下面是我们推荐的方法。
Web应用程序
一个好的模式是在它过期之前刷新令牌。
将令牌过期时间设置为一周,并在每次用户打开Web应用程序并每隔一小时刷新令牌。如果用户超过一周没有打开过应用程序,那他们就需要再次登录,这是可接受的Web应用程序UX(用户体验)。
要刷新令牌,API需要一个新的端点