如果我使用JWT和Redis混合存储会话数据在我的应用程序中实现身份验证层,我是否需要在JWT令牌本身中包含过期?
例如,当您登录应用程序时,会生成会话ID并将其添加到redis数据库,并且有效期为3天。然后,该会话ID(以及用户名)用于创建JWT有效负载。在所有auth请求中,我确保redis数据库中存在来自令牌的会话ID。如果没有,会话已过期,我发出新令牌。
此实施是否存在安全问题?
答案 0 :(得分:1)
没有安全问题,但有人可能会争辩说,通过在JWT中包含一个到期字段,可以使Redis层过时。原则上,JWT允许应用程序成为无状态。如果你的应用程序无论如何都要在Redis中存储它的所有会话数据(因为JWT太大了),人们可能会争辩说,使用JWT而不是普通随机会话标识符的好处就不复存在了。
底线:JWT中的exp
字段是可选的,您可以自由地实现另一种机制来实现相同的目标。
答案 1 :(得分:1)
这取决于您如何实施身份验证/授权层。
您的身份验证/授权流程是有状态,因此到期与会话非常相关。我想包括到期只是为了让整个JWT的消费者知道什么时候到期并根据这些信息采取行动。
还有无状态方法,其中没有会话标识符,并且没有服务器存储信息,但JWT是自我描述的,包含到期和其他数据为声明。由于JWT的消费者依赖于JWT生产者,并且通过使用像HTTPS / SSL这样的传输级安全方法来保护通信,因此不需要维护状态,但状态是JWT本身。
最着名和标准化的认证/授权流程之一是OAuth2。我会说你应该在行业标准之上建立你的安全层。这很好,因为你避免了很多R& D,安全漏洞和时间。