首页 > 解决方案 > SPA 中的令牌存储和刷新选项

问题描述

我一直在阅读 Aaron Parecki 的基于浏览器的应用程序草案(意思是使用 React 或 Angular 开发的 SPA)认证最佳实践与 OAuth 2 以及 OWASP 安全指南,这让我非常困惑:

  1. RFC 草案提到了轮换刷新令牌。现在我将如何在遵守 REST 的无状态约束的同时做到这一点?我是否在 cookie 和刷新令牌中包含一些随机字符串的摘要并检查它们是否相等?
  2. 在浏览器中存储刷新令牌的正确方法(或者更确切地说,一些更安全的方法)是什么?我检查了 okta 的 JS auth 库,它localStorage默认使用,OWASP 指南建议反对。它有某种额外的保护吗?我应该在其中添加一些额外的摘要并将其放入 cookie 中并匹配它们吗?
  3. OWASP 建议会话 ID 应该对客户端完全不透明,但是如果我们使用 JWT,是否违反了这个原则?这是否意味着我应该始终使用对称密码加密我的 JWT?

一些参考资料:

标签: angularreactjsoauth-2.0jwtowasp

解决方案


传统水疗流程

在传统的 SPA 流程中,使用iframe 静默更新令牌是标准做法。

同时,访问令牌最好只存储在内存中,并且也应该是短暂的。在运输过程中仍然存在捕获令牌的威胁,其中一些在我的这篇文章中进行了探讨。

2021 更新

与 SPA 令牌刷新相关的浏览器有两个重大变化:

  • 浏览器积极丢弃第三方 cookie,这意味着传统的 SPA 令牌刷新不再可靠地工作(例如在 Safari 浏览器中)

  • 浏览器 cookie 的安全性通过 cookie 变得更加强大,并且对XSS 威胁(视频)SameSite=strict的担忧有所增加

前端的后端

因此,现在建议将刷新令牌存储在仅 HTTP 加密的SameSite=strictcookie 中。这最好以 API 驱动的方式完成,以避免影响 Web 架构。有关一些最新的最佳实践和资源链接(包括 React 代码示例),请参阅此博客文章。


推荐阅读