• 生活小妙招免费各类生活中的小问题知识以及音乐简谱等,是你了解世界未知知识的好地方。

jwt与token+redis,哪种方案更好用?

十万个为什么 空空 2024-3-20 15:11:43 2次浏览

关于问题jwt 与 token+redis,哪种方案更好用?一共有 2 位热心网友为你解答:

【1】、来自网友【软件新视界】的最佳回答:

JWT 和基于 Token 和 Redis 的方案都是常见的身份验证和授权方案。它们各有优缺点,具体哪种方案更好用,需要考虑你的具体应用场景和需求。

JWT 是一种轻量级的身份验证和授权方案,它使用 JSON 对象作为安全令牌。JWT 包含三部分:头部、载荷和签名。头部通常包含令牌类型和签名算法信息,载荷包含用户 ID、角色等信息,签名用于验证令牌的合法性。JWT 的优点包括易于实现、跨语言和可扩展性好等。但是 JWT 也有缺点,比如一旦 JWT 被签发,其有效期不能被撤销,只能等待过期,这意味着如果某个用户的令牌被盗用,攻击者可以在令牌过期之前一直访问受保护的资源。

基于 Token 和 Redis 的方案使用 Token 作为令牌,将令牌信息存储在 Redis 中,并设置有效期。当用户进行身份验证时,服务器将令牌与 Redis 中存储的令牌进行比较,如果匹配,则认为用户已经通过身份验证。这种方案的优点包括:令牌可以被撤销、可扩展性好、并发性能好等。但是,这种方案也有缺点,例如需要在 Redis 中存储令牌信息,增加了存储和网络开销。

综上所述,具体哪种方案更好用取决于你的应用场景和需求。如果需要轻量级的身份验证和授权方案,且不需要撤销令牌,可以考虑使用 JWT;如果需要撤销令牌或者需要更好的并发性能,可以考虑基于 Token 和 Redis 的方案。

【2】、来自网友【夕阳雨晴】的最佳回答:

1. 问题描述

jwt 与 token+redis,哪种方案更好用?

问题结论

刚好最近有项目使用了 jwt,而且是定制化的 jwt 的认证机制,就个人的理解而言,各自有其优缺点,并且针对不同的场景需要进行约束性开发,如用户剔除、同一用户每 2h 只生成一次 jwt 等。

2. Token 机制简述

2.1 Token 的用途

  • 用户在登录 APP 时,APP 端会发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果验证成功,就会生成相应位数的字符产作为 token 存储到服务器中,并且将该 token 返回给 APP 端。
  • 以后 APP 再次请求时,凡是需要验证的地方都要带上该 token,然后服务器端验证 token,成功返回所需要的结果,失败返回错误信息,让用户重新登录。其中,服务器上会给 token 设置一个有效期,每次 APP 请求的时候都验证 token 和有效期。

在存储的时候把 token 进行对称加密存储,用到的时候再解密。文章最开始提到的签名 sign:将请求 URL、时间戳、token 三者合并,通过算法进行加密处理。

2.2 token+redis 机制

  • 用户验证通过后,服务端通过如 uuid 相关的方法,生成 token,存储用户信息。
  • 当请求服务时,客户端将 token 带上来,进行查询验证,如 token 存在并在有限期内,请求有效,否则请求非法。

token + redis 机制是中心化的,每次验证 token 有效性时,都需要访问 redis,其核心优点实服务端可以主动让 token 失效,缺点是每次都要进行 redis 查询。占用 redis 存储空间。

2.3 jwt 机制

这是一种无状态身份验证机制,因为用户状态永远不会保存在服务器内存中。 服务器受保护的路由将在授权头中检查有效的 JWT,如果存在,则允许用户访问受保护的资源。 由于 JWT 是独立的,所有必要的信息都在那里,减少了多次查询数据库的需求。

  • Java jwt 普遍选用 java-jwt 工具包依赖,gradle 依赖:compile ‘com.auth0:java-jwt:3.2.0‘
  • 用户发起登录请求,验证通过后,服务端创建一个加密后的 JWT 信息,作为 Token 返回。在后续请求中 JWT 信息作为请求头,发给服务端。服务端拿到 JWT 之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明 Token 无效或者已过期。

jwt 的有点主要有:a.其是去中心化的,便于分布式系统使用; 2. 基本信息可以直接放在 token 中。 user_id,session_id; 3. 功能权限信息可以直接放在 token 中。用 bit 位表示用户所具有的功能权限。 其缺点有:服务端无法主动让 token 失效,另一个是无法很好的控制 payload 的数据量。

3. 小结

jwt 和 token+redis 两种方案,没有最优,只有结合不同的业务场景,需求最适合的方案。就比如 token 2h 过期,同一用户每 1.5h 只生成一次 token,当两次 token 并存时,同时有效。大家可以考虑在这两种方案的前提下,分别如何实现?

作者:夕阳雨晴,欢迎关注我的头条号:偶尔美文,主流 Java,为你讲述不一样的码农生活。

喜欢 (0)