【问题标题】:How do I implement remember me functionality in Oauth 2.0 with refresh_token?如何使用 refresh_token 在 Oauth 2.0 中实现记住我的功能?
【发布时间】:2019-05-29 20:46:40
【问题描述】:

我阅读了很多资料,包括 OAuth 2.0 的 RFC,以使用此协议进行安全登录。我实现的流程是授权码授予,因为我有一个安全的 NET CORE 后端来存储客户端密码。我已经按照 RFC 或其他 Oauth 2.0 实施工作流程表中的描述实施了该协议。

目前我有 access_token 和 refresh_token,但我希望实现记住我的功能。我以不同的方式思考它,但我不知道如何以安全的方式实现它。

如果我将通过服务器将刷新保存在浏览器的 http 安全 cookie 中,我很容易受到 CSRF 攻击,如果我将其保存在本地存储中则更糟糕,因为我很容易受到 XSS 攻击和它可能被盗。

简单来说,我需要缓解 XSS 和 CSRF 漏洞,具有记住我的功能。 (我也想过使用浏览器的同站cookie属性来缓解se CSRF漏洞,但我需要获得背靠背兼容性,该功能仅在最新版本的浏览器中可用。

我的问题是:如何实现记住我功能同时兼顾安全方面?

【问题讨论】:

  • 您的浏览器现在如何授权后端请求(OAuth2 登录后)?您是否使用标识后端会话的 cookie 或始终随请求发送的令牌(令牌存储在哪里)?您的经过身份验证的会话的安全模型是否比“记住我”功能的模型(使用 cookie 或 localStorage)更强?
  • 我的客户端应用程序在 Vue JS 中的浏览器上运行,将 access_token 存储在代码内的全局变量中,然后在对资源服务器的每个请求中使用它(我不使用本地存储或曲奇饼)。事实上,每次刷新页面时,令牌都会被删除,并向用户请求新的登录。如果我找到安全存储 refresh_token 的方法,即使使用其他安全机制而不是简单地保存 refresh_token,我的应用程序也不会受到攻击。

标签: javascript c# security oauth-2.0


【解决方案1】:

如果您的应用程序存在 XSS 漏洞,那么您将令牌保存在内存(变量)还是 localStorage 中都没有关系。恶意代码访问它不会有问题。因此,我认为在 localStorage 中保留“记住我”信息不会降低您当前的安全级别。为了保护您的应用程序免受 XSS 攻击,您可以使用内容安全策略之类的东西,以便只执行您信任的 JavaScript 代码。有关详细信息,请参阅OWASP XSS prevention cheat sheet

我认为您可以将访问令牌保存在 sessionStorage 而不是变量中,这样用户在重新加载页面时就不必登录。

如果您将“记住我”信息存储在仅 HTTP 的 cookie 中,它可能会使您的应用程序容易受到 CSRF 攻击,但同样,有一些方法可以防止它 (OWASP CSRF prevention),例如 CORS 并发送额外的每个请求中的令牌,需要通过 JavaScript 代码从 cookie 中读取。

“记住我”功能可能会增加某种风险,因为用户会长时间保持登录状态。因此,您可以自行评估风险和用户便利性之间的平衡。

您可以查看OAuth 2.0 for Browser-Based Apps。它没有讨论“记住我”功能,但讨论了良好做法和安全注意事项。

【讨论】:

  • 您向我指出,关于 access_token,我现在可能容易受到 XSS 攻击,但请记住,在 OAuth2.0 协议中指定 access_token 必须是短暂的,所以关于如何存储它,不如 refresh_token 重要。所以 refresh_token 比 access_token 更重要,所以我的模型对此的安全性必须更强。关于您指出的文件,我已经简单阅读了,但我只是问是否有人已经有过如何以安全方式保存它的经验。
  • 好的,如果您发现一些有趣的东西,请将其发布为答案。您可以从 security.stackexchange.com 查看thisthis 的答案。
猜你喜欢
  • 2018-09-05
  • 2012-08-08
  • 2019-02-16
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
相关资源
最近更新 更多