如果 OpenID Connect id_token 和 access_token 标记为仅 HTTP,我能否将其安全地存储在 cookie 中?

Can I securely store an OpenID Connect id_token and access_token in a cookie if it's marked as HTTP only?

我正在将遗留应用程序(ASP.NET MVC 4 应用程序)与 OpenID Connect 集成。从我的 OIDC 提供商处获得 id_token 和 access_token 后,我需要存储它们。在典型的方式中,它们必须从客户端发送 'over the wire' 到服务器端,因为服务器端必须处理 id_token 以确定哪个用户发出了请求。我的应用程序未处理 access_token。它只是存储在我的应用程序中,直到我需要向需要 JWT Bearer 身份验证的 API 发出请求。

我的看法是 id_token 和 access_token 是从客户端和服务器以任何方式发送的 - 无论是 header 还是 cookie。如果 id_token 和 access_token 标记为仅 HTTP,我可以将其安全地存储在 cookie 中吗?

编辑: 我应该添加更多关于我的场景的信息。

1) 我的应用程序始终使用 HTTPS,并且所有 cookie 都标记为安全。这消除了 MITM(中间人)漏洞

2) 每个 PUT、POST 和 DELETE 请求都使用 ASP.NET 的防伪标记 类。这可以防止 XSRF。

3) 所有输入都使用 ASP.NET 库进行转义和清理,从而消除了 XSS 漏洞。

4) 包含 id_token 的 cookie 将被标记为仅限 http,从而无法从客户端读取和访问 cookie。

请不要指望这一点,HttpOnly 是一个标志,它告诉浏览器该 cookie 不应被客户端脚本访问,并且仅当浏览器支持时它才为真。 您可以在此处找到更多信息:https://www.owasp.org/index.php/HttpOnly 我还建议深入了解 OWASP 网站,因为他们有关于您列出的问题的最佳实践的文档。

您可以在此处查看您的浏览器是否支持 HttpOnlyhttps://caniuse.com/?search=httponly

截至 2021 年,95% 的浏览器都支持它。

您可能不应该将令牌存储在 cookie 中。理想情况下,访问令牌将存储在客户端的内存中。这样它们就不会随请求自动发送到服务器,这就是 cookie 存在风险的原因。任何其他地方都可能使您面临潜在的漏洞。

RFC 6819 规范,标题为“OAuth 2.0 威胁模型和安全注意事项”,涉及 OAuth 令牌的风险和漏洞。具体来说,我建议阅读以下部分:

在我编写的应用程序中,令牌已存储在本地存储和内存中。

我建议通读 OAuth 2.0 规范,以便了解使用 OAuth 2.0 时涉及的风险。