JSON Web Tokens (JWT) 在 web 应用程序的认证中已被广泛采用,得益于其简单性和无状态特性。它们允许在两个方之间传输经过验证的数据,常被用于登录系统。然而,虽然它们很受欢迎,许多安全专家建议小心使用 JWT,特别是用于会话维持时。
在本文中,我们将深入了解JWT引发了哪些担忧,以及为什么许多开发人员更倾向于采用其他方法。
你知道什么是JWT吗?JWT是“JSON Web Token”的缩写,通常被称为“JSON网络令牌” (JWT)。
JWT(JSON Web Token,简称JWT)是一种紧凑、URL安全的传输声明的方法。它带有数字签名,因此可以检测是否被篡改。典型的JWT结构包含三个部分:
- 头部:指定签名算法。
- 负载:包含声明或数据。
- 签名:用来确保头部和负载完整性的哈希值。
JWT通常用于身份验证。当用户登录时,服务器会发放一个JWT,客户端会保存它并在后续请求安全资源时附上。服务器通过验证该令牌来确认用户身份,而无需维护会话数据。
为什么很多人建议不要使用JWT?
1.: JWT 的规模:可能超乎你的想象使用JWT的一个显著缺点是其大小。JWT自身携带负载(包括用户ID、角色等),这意味着它们比传统的会话cookie要大得多。
一个存储用户ID的会话cookie可能只有几个字节大小。
然而,JWT不仅包含用户ID,还包括额外的元数据、载荷和签名,使其大小更大得多。
这个额外的大小导致更高的带宽消耗,因为每次请求时都会发送令牌。在带宽不足或移动设备上,这尤其成问题。
JWT最重要的限制之一是无法方便地撤销。一旦JWT被颁发,它就会一直有效直到过期,这可能带来安全风险。
注销问题:
当用户注销时,你期望会话能立即失效。但JWT令牌是无状态的,服务器没有直接的方法来使一个令牌失效,除非它被存储在服务器端,这实际上与JWT的无状态特性相悖。在这种情况下,如果JWT令牌的过期时间较长,攻击者甚至可以继续利用被盗的令牌,即使用户已经注销。
失效的令牌:
在传统的会话系统中,当用户的权限被更新(例如,管理员被降级为普通用户)时,服务器会话可以立即反映这一变化。使用JWT时,这种情况不会发生,直到JWT过期。这可能导致用户比预期更长时间保留失效的权限,从而可能引发安全问题。
JWTs 通常因其数字签名能力而受到称赞,这保证了载荷未被修改。然而,现代 web 框架自动签名和保护会话 cookie,在很多情况下使得 JWT 的签名变得多余。
问题是:
如果你在 cookie 中使用 JWT,你的 cookie 已经被框架自动签名,有时甚至加密了。
让 cookie 和 JWT 都携带签名其实是多余的。
实际上,使用传统的会话 cookie 可以达到与 JWT 相同的安全级别,但没有额外的复杂性和体积。
JWT通常不进行加密。这意味着base64编码的载荷中包含敏感用户信息,但没有被加密隐藏。如果有人截获了该令牌,他们可以轻松解码载荷查看内容。
某些情况下的漏洞:
中间人攻击:如果JWT未通过HTTPS传输,攻击者可以拦截该令牌并访问用户的会话。
令牌篡改:虽然签名确保令牌未被篡改或修改,但使用弱签名算法时会出现问题。
在某些情况下,攻击者能通过算法欺骗绕过JWT签名,引发严重的安全问题。
为缓解这些问题,务必始终使用HTTPS和强大的签名算法,但即便如此,仍可能存在某些漏洞。
JWT确实包含一个过期时间(exp),但这个过期时间是客户端的,意味着客户端会一直使用该令牌直到它过期。如果令牌被泄露,攻击者可以一直使用该令牌直到它过期,不管还剩多少时间。
这可能导致严重的安全风险,特别是对于长时间有效的令牌。相比之下,传统的会话管理允许你立即失效会话,从而更好地控制活跃会话。
6. 使简单的用例变复杂对于许多认证系统来说,在很多情况下使用 JWT 可能是过于复杂或过于繁琐的。传统的会话认证方式(使用 cookies 和服务器端存储的会话数据)通常可以有效地处理大多数用例,既不需要复杂的令牌管理,也不需要承担无状态 JWT 带来的额外风险。
zh:比如说:
如果你的应用只需要跟踪已登录的用户,一个简单的基于 cookie 的方法能提供相同的安全性,而且更简单。许多现代 web 框架自动管理 cookie、签名和加密,使得 JWT 在标准登录和登出流程中变得多余。
结论:什么时候不该用JWT(JWT)尽管 JWT 在特定场景下(如 API 授权或一次性数据传输)非常有用,但它通常不是大多数网页应用会话管理的最佳选择。传统会话维持,特别是现代框架提供的那些,更小巧、更安全、也更易管理。
JWTs不适合的情况:
- 你需要易于撤销的令牌。
- 你希望避免过量使用带宽。
- 你正在处理敏感且长期有效的会话。
简而言之,虽然JWT提供了一种无状态性、自包含特性的身份验证方法,但它也引入了潜在的安全隐患和性能瓶颈,许多开发人员应仔细考虑。在为您的项目采用JWT之前,,评估您的具体需求并确保它适合您的项目需求。
今天就这样吧。
另外,分享你最喜欢的 web 开发资源,帮助这里的初学者们吧!
来看看我的 YouTube 频道号!觉得有用的话,别忘了关注哦。
请在我的GitHub项目上给我点赞 ⭐️
感谢31784!🤗,真的谢谢你!
共同学习,写下你的评论
评论加载中...
作者其他优质文章