存储身份验证令牌客户端的最佳位置

信息安全 Web应用程序 oauth 。网
2021-08-28 04:50:17

当我的用户通过身份验证时,他们会收到一个身份验证令牌,我需要使用此身份验证令牌来授权一些 asp.net WebAPI 调用。为此,我需要将令牌添加到该调用的头部,因此我需要可从用户浏览器访问的令牌。我认为将令牌存储在 cookie 中并不是最安全的方式,那么存储该令牌并且仍然可以在我的 javascript 中访问以进行 API 调用的最安全方式是什么?

4个回答

有两种方法可以在浏览器中保存身份验证信息:

  1. 饼干
  2. HTML5 网络存储

在每种情况下,您都必须相信浏览器已正确实现,并且网站 A 无法以某种方式访问​​网站 B 的身份验证信息。从这个意义上说,两种存储机制同样安全。但是,在您如何使用它们方面可能会出现问题。

如果您使用 cookie:

  • 浏览器将自动向 API 发送每个请求的身份验证信息。只要您知道它正在发生,这就会很方便。
  • 你必须记住 CSRF 是一个东西,并处理它。

如果您使用 HTML5 网络存储:

  • 您必须编写 Javascript 来准确管理发送到 API 的身份验证信息。

人们关心的一个很大的实际差异是,使用 cookie,您必须担心 CSRF。要正确处理 CSRF,您需要一个额外的“同步器令牌”。

一体式 Web 框架(如 Grails、Rails,可能是 asp.net)通常提供一种简单的方法来启用 CSRF 保护,并在您的 UI 中自动添加同步器令牌内容。但是,如果您正在使用仅限客户端的 Web 框架(如 AngularJS 或 BackboneJS)编写 UI,您将不得不编写一些 Javascript 来管理同步器令牌。因此,在这种情况下,您不妨只使用 HTML5 Web 存储方法,而只担心一个令牌。

保护访问令牌的最佳方法是根本不将其存储在客户端。

这是如何运作的?那么在生成访问令牌时,生成一些其他加密安全的PRNG(您将其映射到服务器上的访问令牌),将其映射到用户会话 ID 并将其返回给客户端。

这将减少攻击区域,因为您现在返回的是与会话绑定的令牌,并且两者都是授权令牌所必需的。当会话到期时,令牌自然也会到期,并且用户将被迫重新进行身份验证,从而生成新的访问令牌。

它仍然不是 100% 安全的,但是,您需要权衡在用户会话中发生类似事情的可能性。基于此,您可以调整您的会话/令牌到期时间以适应,尽管您还需要警惕可用性 - 您不希望在 5 分钟后到期会话,因为必须不断重新登录可能很乏味(或者也许你可以,取决于应用程序的类型)。

ARMOR 专为满足这一要求而设计。Anti-forgery 令牌可以存储在您认为合适的 UI 上的任何位置。该库配备了一个自定义 JavaScript 组件,该组件从 UI 中提取令牌并自动将其包含在 AJAX 标头中。

这是有关该主题的教程这里是 GitHub 存储库

我将令牌存储在具有以下三个标志的 cookie 中:1.安全:通过 https 传输 2.HttpOnly:客户端 JS 无法读取它(XSS 保护) 3.SameSite(Lax 或 Strict):CSRF 保护

这样你就可以免疫 XSS 和 CSRF。您只需要小心 SameSite,因为它相对较新,并且最近才得到 4 种主要浏览器(Chrome、FF、Safari、Edge)的支持,请参见:https ://caniuse.com/#feat=same-site- cookie 属性

有关 cookie 强化的更多信息,请参阅 https://odino.org/security-hardening-http-cookies/