为了项目的安全性,我正在学习 JWT,但我有一个问题。如果我在登录后正确收到令牌,但其他地方的其他人(黑客)窃取了这个特定令牌,他可以访问我的会话吗?使用 JWT 身份验证的服务器能够检测到这一点并保护我吗?怎么办?
只有服务器应该知道用于生成 JWT 的“秘密”。如果有人修改 JWT 中包含的数据,服务器将无法对其进行解码。因此服务器可以信任它可以解码的任何 JWT。
但是,如果黑客访问了您的计算机,他们就可以看到存储在浏览器中的 JWT 并使用它。同样的威胁也存在于 cookie 中,所以这并不是 JWT 的真正缺陷。
减轻这种威胁的一种方法是设置 JWT 的过期日期。对于银行应用程序,您的 JWT 可能会在几分钟后过期。对于 Facebook 来说,它可能会在几个月后过期。但是,如果有人访问您的浏览器,则没有万无一失的解决方案。
黑客的另一种方法是“中间人”攻击,拦截客户端和服务器之间的网络流量并获取 cookie/JWT。 cookie/JWT 应始终通过 HTTPS 发送,以防止出现这种情况。
重要编辑
最后,回答你标题中的问题“JWT 安全性如何?”:这取决于你如何存储令牌。本地存储不如使用 cookie 安全(参考),但 cookie 可能会受到 CSRF 或 XSRF 攻击。
这个答案曾经说过JWT比cookie更安全,因为cookie会受到CSRF攻击。但将 JWT 存储在本地存储中也不安全。因此,我不再将 JWT 存储在本地存储中,也不再使用众所周知的技术来减轻 CSRF 攻击。
如果有人正在阅读这篇关于使用 JWT 处理会话的想法,请注意。此用例存在太多安全陷阱。
只需使用安全的 HTTPOnly cookie 即可,并在缓存中跟踪会话 ID。请注意,这些 cookie 传统上容易受到 CSRF 攻击,但由于严格的 cookie,这已不再是一个问题。
这里有一些阅读材料: