JWT 授权和令牌泄漏

JWT authorization and token leaks

我需要帮助了解用于登录功能的 JWT 令牌的安全性。具体来说,它如何防止可以看到用户数据包的攻击者的攻击?我的理解是,无论是否加密,如果攻击者获得对令牌的访问权限,他们将能够复制令牌并使用它来登录自己并访问受保护的资源。我读到这就是令牌的生存时间应该很短的原因。但这实际上有多大帮助?抢占资源不需要很长时间。如果攻击者可以窃取令牌一次,他们不能在刷新后再次窃取令牌吗?

没有办法验证客户端发送的令牌是从您发送到的同一客户端发送的吗?还是我没抓住要点?

how does it prevent an attack from an attacker who can see the user's packets?

仅仅因为您可以看到某人的数据包并不意味着您可以看到其中的内容。 HTTPS 对流量进行加密,因此即使有人设法捕获您的流量,他们也无法从中提取 JWT。每个使用身份验证的网站都应该只 运行 通过 HTTPS。如果有人能够执行中间人攻击,那就是另一回事了。

they'll be able to copy the token and use it to login themselves and access a protected resource

是的,但仅作为他们从中窃取令牌的用户。 JWT 已签名,这意味着您不能在不破坏服务器将检测到的签名的情况下修改它们的内容(至少在计算上无法找到哈希冲突,这样您就可以修改 JWT 的内容)。对于高度敏感的访问(银行帐户、医疗数据、企业云管理员帐户...),您至少需要 2 因素身份验证。

And if the attacker could steal a token once, can't they do it again after the refressh?

有可能,但这取决于令牌的公开方式。如果被攻击者位于你和服务器之间的未加密通道上,那么确保他们可以重复相同的过程,但这种暴露可能是临时 glitch/human 错误的结果,可能很快就会修复,这将阻止攻击使用令牌一旦过期。

Is there no way to verify that a token being sent by a client is being sent from the same client that you sent it to?

如果攻击者成功执行中间人攻击,他们可以伪造任何您可能用来验证客户端的信息,所以答案是否定的,没有 100% 可靠的方法来验证客户端。


我看到的关于 JWT 的最大问题不是 JWT 本身,而是某些人处理它们的方式(存储在未加密的浏览器本地存储中,包含 PII,没有 HTTPS,必要时没有双因素身份验证等。 ..)

添加到 Matus 的出色回答中:

大多数现实世界的客户端往往是浏览器和移动用户界面,它们无法保守秘密并自行进行安全加密。您所描述的风险同样会发生在其他类型的消息凭据上,例如 cookie。

我的 blog post 详细探讨了浏览器案例,以帮助您思考。

对于你的情况,我可能会按照类似的方式进行:

  • 有哪些选择?
  • 不记名代币在哪些方面存在问题?
  • 在这些方面有更好的选择吗?

对于某些类型的客户端,您可以加强身份验证,例如基于 Mutual Trust,但并非所有授权服务器都支持此功能。