智威汤逊:为什么受众很重要?

信息安全 jwt
2021-09-01 16:18:54

JWT 通常包含一个受众声明我在很多地方(文章、代码示例、规范本身)都读到,您必须检查该令牌是否适用于您而不是其他受众。

我很高兴接受这一点。我不打算构建任何将 JWT 发送给错误受众的东西。但我很好奇为什么拒绝它很重要。

您应该能够验证令牌是由您信任的身份验证服务器颁发的。所以你必须接受那里的说法不是捏造的。

我能想到的唯一风险是,如果身份验证服务器针对相同的声明针对不同的受众产生不同的值。除了糟糕的命名空间之外,我想不出会发生这种情况的原因。

例如

{
  "aud": "foo",
  "roles": ["admin"]
}

代替:

{
  "aud": "foo",
  "foo.roles": ["admin"]
}

也许这个问题可以更好地表述为:

如果我接受其他受众的(有效)JWT 令牌,会发生什么坏事?

2个回答

假设我经常使用 JWT 从AUTH SERVER登录几个网站,包括AB. 如果没有aud声明,JWT 将是相同的。这将允许恶意管理员A使用我的 JWT 对B.

我会争辩说,从某种意义上说,您是正确的,因为观众声称您无法通过命名空间声明和自定义安全检查来处理自己,这并没有什么特别之处。

JWT 规范指出 aud 声明(以及其他已注册的声明)是可选的,应用程序需要定义何时使用或不使用它们。

至于为什么通常建议对受众进行身份验证,它基本上是一种简单且标准化的方法来测试传入的 JWT 是否适用于您的应用程序。为您希望身份工作的每个应用程序创建命名空间令牌可能很麻烦。如果您需要与 3rd 方应用程序或身份服务集成,遵循标准方法也会使事情变得更容易。

我能想到的唯一真正的危险是,如果您或下一个开发人员由于不使用受众检查而忘记执行现在必要的任何额外检查。