JWT 访问令牌是否应包含 PII?

时间:2021-03-19 15:02:35

标签: oauth-2.0 jwt openid-connect

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

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

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

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

1 个答案:

答案 0 :(得分:1)

这里有几点需要说明:

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

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

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

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