【问题标题】:Should JWT access tokens contain PII?JWT 访问令牌是否应该包含 PII?
【发布时间】:2021-06-17 00:10:00
【问题描述】:

据我所知,JWT 访问令牌不应包含个人身份信息 (PII)。这是为了使它们保持小,但如果被截获,也会减少所包含信息的暴露。

OIDC 协议要求实现用户信息端点。可以使用访问令牌调用它,它会返回一堆关于用户的声明。实际上是 id 令牌包含的内容,但可能包含更多信息。

因此,即使访问令牌本身不携带此 PII,但如果被截获,它肯定可以用来暴露所有这些信息。所以关于访问令牌中 PII 的争论并没有真正站得住脚。

这是否意味着我应该可以在访问令牌中包含电子邮件,因为除了 sub 声明之外,API 可能还需要它?

【问题讨论】:

  • 您的问题可能没有实际意义,因为 JWT 就像数字护照,任何持有它的人理论上都可以伪装成那个人。因此,丢失代币的风险可能远远大于少数索赔。相反,可能会发生更糟糕的事情,例如丢失数字钱包中的所有资金。

标签: oauth-2.0 jwt openid-connect


【解决方案1】:

这里有几点需要说明:

  1. 并非所有访问令牌都必须允许访问 userinfo 端点。首先,您的系统必须公开一个 userinfo 端点。其次,用户必须同意将 userinfo 端点中的信息发布给给定的客户端。因此,在某些访问令牌的情况下,不会有恶意方可以访问 userinfo 端点的威胁。有时用户可以同意只公开他们的用户名,因此即使您可以访问用户信息,您仍然无法阅读电子邮件。 (当然还要看OIDC Provider的实现)

  2. 在大多数情况下,oauth 访问令牌用作不记名令牌。这意味着拥有令牌的任何人都可以访问可以使用该令牌访问的任何数据。如果有人设法窃取了该令牌,他们可以做任何原始客户可以做的事情。如果您担心,您可以使用发件人受限令牌而不是承载令牌(例如mTLS constrained tokens 或实施DPoP)。这些令牌与最初请求它们的客户端相关联。攻击者不仅要窃取访问令牌,还要窃取用于验证所有权证明的证书。实现比不记名令牌要复杂一些,但安全性大大提高。

  3. 我会避免将任何 PII 放入 JWT。 JWT 可以像这样被解码,任何人都可以读取其中保存的任何信息。假设有人设法获取了从您的系统发出的 JWT,但它已过期。他们将无法访问 API 或用户信息,但他们仍然可以从 JWT 中提取数据。最好使用不透明令牌作为访问令牌并在网关中交换它们(称为a Phantom Token approach)。

有趣的是,我最近才就该具体主题进行了一次演讲 - 使用 JWT 作为访问令牌和 Phantom 令牌流程 :)(如果您有兴趣,可以在此处查看 :)link)

【讨论】:

    猜你喜欢
    • 2019-03-19
    • 2016-12-12
    • 2017-12-12
    • 2019-09-19
    • 2022-12-18
    • 2019-12-08
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多