SPA 中的令牌存储和刷新选项
Options for token storage and refresh in SPAs
我一直在阅读 Aaron Parecki 的基于浏览器的应用程序草案(意思是使用 React 或 Angular 开发的 SPA)OAuth 2 身份验证最佳实践以及 OWASP 安全指南,它离开了我真的很困惑:
- RFC 草案提到轮换刷新令牌。现在我将如何在遵守 REST 的无状态约束的同时做到这一点?我是否在 cookie 和刷新令牌中包含一些随机字符串的摘要并检查它们是否相等?
- 在浏览器中存储刷新令牌的正确方法(或者更确切地说,一些更安全的方法)是什么?我检查了 okta 的 JS auth 库,它默认使用
localStorage
,OWASP 指南建议不要这样做。它有某种额外的保护吗?我是否应该在其中添加一些额外的摘要并将其放入 cookie 中并匹配它们?
- OWASP 建议session ID 对客户端完全不透明,但是如果我们使用JWT,岂不是违反了这个原则?这是否意味着我应该始终使用对称密码加密我的 JWT?
一些参考资料:
- https://datatracker.ietf.org/doc/html/draft-ietf-oauth-browser-based-apps-04#section-4
- https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/HTML5_Security_Cheat_Sheet.md
- https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/JSON_Web_Token_Cheat_Sheet_for_Java.md
- https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Session_Management_Cheat_Sheet.md
传统水疗流程
在传统的 SPA 流程中,标准使用 iframes to silently renew tokens。
同时,访问令牌最好只存储在内存中,并且也应该是短暂的。仍然存在在传输过程中捕获令牌的威胁,this post of mine 中探讨了其中一些威胁。
2021 年更新
浏览器有两个与 SPA 令牌刷新相关的重大变化:
浏览器积极丢弃第三方 cookie,这意味着传统的 SPA 令牌刷新不再可靠地工作(例如在 Safari 浏览器中)
浏览器 cookie 的安全性通过 SameSite=strict
cookie 变得更强,并且对 XSS threats (video) 的担忧增加了
后端换前端
因此现在建议将刷新令牌存储在仅 HTTP 加密的 SameSite=strict
cookie 中。这最好以 API 驱动的方式完成,以避免影响网络架构。请参阅此 blog post 了解一些最新的最佳实践和资源链接,包括 React 代码示例。
我一直在阅读 Aaron Parecki 的基于浏览器的应用程序草案(意思是使用 React 或 Angular 开发的 SPA)OAuth 2 身份验证最佳实践以及 OWASP 安全指南,它离开了我真的很困惑:
- RFC 草案提到轮换刷新令牌。现在我将如何在遵守 REST 的无状态约束的同时做到这一点?我是否在 cookie 和刷新令牌中包含一些随机字符串的摘要并检查它们是否相等?
- 在浏览器中存储刷新令牌的正确方法(或者更确切地说,一些更安全的方法)是什么?我检查了 okta 的 JS auth 库,它默认使用
localStorage
,OWASP 指南建议不要这样做。它有某种额外的保护吗?我是否应该在其中添加一些额外的摘要并将其放入 cookie 中并匹配它们? - OWASP 建议session ID 对客户端完全不透明,但是如果我们使用JWT,岂不是违反了这个原则?这是否意味着我应该始终使用对称密码加密我的 JWT?
一些参考资料:
- https://datatracker.ietf.org/doc/html/draft-ietf-oauth-browser-based-apps-04#section-4
- https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/HTML5_Security_Cheat_Sheet.md
- https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/JSON_Web_Token_Cheat_Sheet_for_Java.md
- https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Session_Management_Cheat_Sheet.md
传统水疗流程
在传统的 SPA 流程中,标准使用 iframes to silently renew tokens。
同时,访问令牌最好只存储在内存中,并且也应该是短暂的。仍然存在在传输过程中捕获令牌的威胁,this post of mine 中探讨了其中一些威胁。
2021 年更新
浏览器有两个与 SPA 令牌刷新相关的重大变化:
浏览器积极丢弃第三方 cookie,这意味着传统的 SPA 令牌刷新不再可靠地工作(例如在 Safari 浏览器中)
浏览器 cookie 的安全性通过
SameSite=strict
cookie 变得更强,并且对 XSS threats (video) 的担忧增加了
后端换前端
因此现在建议将刷新令牌存储在仅 HTTP 加密的 SameSite=strict
cookie 中。这最好以 API 驱动的方式完成,以避免影响网络架构。请参阅此 blog post 了解一些最新的最佳实践和资源链接,包括 React 代码示例。