为了账号安全,请及时绑定邮箱和手机立即绑定

为什么许多人不推荐使用JWT(JSON Web Tokens)?

JSON Web Tokens (JWT) 在 web 应用程序的认证中已被广泛采用,得益于其简单性和无状态特性。它们允许在两个方之间传输经过验证的数据,常被用于登录系统。然而,虽然它们很受欢迎,许多安全专家建议小心使用 JWT,特别是用于会话维持时。

在本文中,我们将深入了解JWT引发了哪些担忧,以及为什么许多开发人员更倾向于采用其他方法。

你知道什么是JWT吗?

JWT是“JSON Web Token”的缩写,通常被称为“JSON网络令牌” (JWT)。

JWT(JSON Web Token,简称JWT)是一种紧凑、URL安全的传输声明的方法。它带有数字签名,因此可以检测是否被篡改。典型的JWT结构包含三个部分:

  1. 头部:指定签名算法。
  2. 负载:包含声明或数据。
  3. 签名:用来确保头部和负载完整性的哈希值。

JWT通常用于身份验证。当用户登录时,服务器会发放一个JWT,客户端会保存它并在后续请求安全资源时附上。服务器通过验证该令牌来确认用户身份,而无需维护会话数据。

为什么很多人建议不要使用JWT?

1.: JWT 的规模:可能超乎你的想象

使用JWT的一个显著缺点是其大小。JWT自身携带负载(包括用户ID、角色等),这意味着它们比传统的会话cookie要大得多。

一个存储用户ID的会话cookie可能只有几个字节大小。
然而,JWT不仅包含用户ID,还包括额外的元数据、载荷和签名,使其大小更大得多。
这个额外的大小导致更高的带宽消耗,因为每次请求时都会发送令牌。在带宽不足或移动设备上,这尤其成问题。

2. 令牌撤销问题:一个重大的安全问题

JWT最重要的限制之一是无法方便地撤销。一旦JWT被颁发,它就会一直有效直到过期,这可能带来安全风险。

注销问题:
当用户注销时,你期望会话能立即失效。但JWT令牌是无状态的,服务器没有直接的方法来使一个令牌失效,除非它被存储在服务器端,这实际上与JWT的无状态特性相悖。在这种情况下,如果JWT令牌的过期时间较长,攻击者甚至可以继续利用被盗的令牌,即使用户已经注销。

失效的令牌:
在传统的会话系统中,当用户的权限被更新(例如,管理员被降级为普通用户)时,服务器会话可以立即反映这一变化。使用JWT时,这种情况不会发生,直到JWT过期。这可能导致用户比预期更长时间保留失效的权限,从而可能引发安全问题。

3. 多余的签名

JWTs 通常因其数字签名能力而受到称赞,这保证了载荷未被修改。然而,现代 web 框架自动签名和保护会话 cookie,在很多情况下使得 JWT 的签名变得多余。

问题是:

如果你在 cookie 中使用 JWT,你的 cookie 已经被框架自动签名,有时甚至加密了。
让 cookie 和 JWT 都携带签名其实是多余的。
实际上,使用传统的会话 cookie 可以达到与 JWT 相同的安全级别,但没有额外的复杂性和体积。

4. 安全隐患

JWT通常不进行加密。这意味着base64编码的载荷中包含敏感用户信息,但没有被加密隐藏。如果有人截获了该令牌,他们可以轻松解码载荷查看内容。

某些情况下的漏洞:
中间人攻击:如果JWT未通过HTTPS传输,攻击者可以拦截该令牌并访问用户的会话。
令牌篡改:虽然签名确保令牌未被篡改或修改,但使用弱签名算法时会出现问题。
在某些情况下,攻击者能通过算法欺骗绕过JWT签名,引发严重的安全问题。
为缓解这些问题,务必始终使用HTTPS和强大的签名算法,但即便如此,仍可能存在某些漏洞。

5. 没有内置的过期控制机制

JWT确实包含一个过期时间(exp),但这个过期时间是客户端的,意味着客户端会一直使用该令牌直到它过期。如果令牌被泄露,攻击者可以一直使用该令牌直到它过期,不管还剩多少时间。

这可能导致严重的安全风险,特别是对于长时间有效的令牌。相比之下,传统的会话管理允许你立即失效会话,从而更好地控制活跃会话。

6. 使简单的用例变复杂

对于许多认证系统来说,在很多情况下使用 JWT 可能是过于复杂或过于繁琐的。传统的会话认证方式(使用 cookies 和服务器端存储的会话数据)通常可以有效地处理大多数用例,既不需要复杂的令牌管理,也不需要承担无状态 JWT 带来的额外风险。

zh:比如说:

如果你的应用只需要跟踪已登录的用户,一个简单的基于 cookie 的方法能提供相同的安全性,而且更简单。许多现代 web 框架自动管理 cookie、签名和加密,使得 JWT 在标准登录和登出流程中变得多余。

结论:什么时候不该用JWT(JWT)

尽管 JWT 在特定场景下(如 API 授权或一次性数据传输)非常有用,但它通常不是大多数网页应用会话管理的最佳选择。传统会话维持,特别是现代框架提供的那些,更小巧、更安全、也更易管理。

JWTs不适合的情况:

  1. 你需要易于撤销的令牌。
  2. 你希望避免过量使用带宽。
  3. 你正在处理敏感且长期有效的会话。

简而言之,虽然JWT提供了一种无状态性、自包含特性的身份验证方法,但它也引入了潜在的安全隐患和性能瓶颈,许多开发人员应仔细考虑。在为您的项目采用JWT之前,,评估您的具体需求并确保它适合您的项目需求。

今天就这样吧。

另外,分享你最喜欢的 web 开发资源,帮助这里的初学者们吧!

关注我:@ LinkedIn,还可以浏览我的作品集

来看看我的 YouTube 频道号!觉得有用的话,别忘了关注哦。

请在我的GitHub项目上给我点赞 ⭐️

感谢31784!🤗,真的谢谢你!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消