我是一个试图找出如何保护我的 SPA 的安全新手,并且完全迷失在 RFC、BCP、草稿和博客文章的森林中。如果可能的话,我想从 CDN 静态地提供我的 SPA。起初我被Okta的这篇文章所鼓舞,它解释了为什么以及如何用代码+PKCE 流替换隐式流。然而,这个BCP 草案似乎也很有希望(强调我的)......
然后浏览器中的代码使用上面的 PKCE 扩展(在第 7 节中描述)(B)启动授权代码流,并通过 POST 请求(C)获取访问令牌。然后,JavaScript 应用程序负责使用适当的浏览器 API 安全地存储访问令牌。
使用适当的浏览器 API 安全地存储访问令牌——这甚至可能吗?
如果我理解正确的话,公共客户端的代码+PKCE流程只比隐式流程好,因为它没有将访问令牌放在地址栏和历史记录中,但它仍然存在令牌需要存储的缺点在 localstorage/sessionstorage/non-httponly-cookies 中。
对?
所以我仍然容易受到 XSS 和恶意浏览器扩展的攻击。
我正在考虑两种选择:
- 使用为我的公共 SPA 客户提供服务的机密客户端后端。机密客户端在反向通道中接收令牌,并将它们设置为 HttpOnly-cookies。公共客户端现在可以与受保护的资源对话,而无需在每个请求上使用机密客户端作为代理。
- 将令牌存储在机密客户端后端,以便它们永远不会到达公共客户端。相反,公共客户端会获得一个会话 cookie,引用令牌。公共客户端将需要使用机密客户端作为对受保护资源的每个请求的代理。
将令牌存储在 HttpOnly-cookies 中似乎比将它们存储在 localstorage/sessionstorage 中要好得多,但代价是从机密客户端而不是直接从 cdn 提供 SPA。
对这些方法有什么建议吗?是否有任何文献更深入地解释了这些方法(或其他规范方式)?