使用 OpenId Connect 隐式流时如何保护客户端中的令牌

How to protect the token in the client when using OpenId Connect Implicit Flow

使用 OpenID Connect 隐式流程,授权服务器在身份验证成功后重定向回客户端。 location header 将包含令牌作为 url 片段 (#id_token=xyz)。

这可以防止令牌通过引荐来源网址或类似方式从用户代理泄漏到包含的资源。

但是,如果像 javascript 文件这样的第 3 方资源包含在重定向目标页面中,那么这些脚本将通过文档位置访问令牌。

在包含第 3 方资源时保护客户端令牌的最佳做法是什么?例如。您通常会实施一个 'restricted' 重定向目标,在再次重定向之前用 url 片段交换 cookie 吗?

更新

更清楚一点:与@janhalasa 的回答一致,攻击场景不包括不受信任的 javascripts。攻击线是令牌的无意泄漏,例如到图书馆将文档 uri 传输到外部服务器(google 分析?)。通过将散列片段移动到 session 存储,它不会意外泄漏。

如果您不信任正在使用的外部库,最好停止使用它们。无论您在何处使用 JavaScript 代码隐藏 ID 令牌(cookie、sessionStorage、localStorage),库都能够找到它,因为您的代码和库代码 运行 在同一个 运行时间环境.

我认为通常的做法是将令牌保留在 sessionStorage 中,并且仅将其附加到需要它的请求。 sessionStorage 的优点是能够存活 reload/redirect 并且只能通过您的应用程序的文档访问。