XSRF 和双重提交 cookie JWT 替代方案 - 这种实现安全吗?

Posted

技术标签:

【中文标题】XSRF 和双重提交 cookie JWT 替代方案 - 这种实现安全吗?【英文标题】:XSRF and double submit cookie JWT alternative - is this implementation safe? 【发布时间】:2017-08-10 10:55:06 【问题描述】:

我正在研究我的 REST API 的 HTTP 安全性,我希望通过使用 Double Submit Cookie 模式使其更安全,但我很确定我实际上已经在做类似的事情(完全是偶然的)。

这是我的流程:

    客户端使用用户名和密码向服务器发出 POST 请求。 服务器使用 JWT 令牌进行响应。 客户端将令牌保存到 cookie 中。 在后续请求中,客户端读取令牌 cookie 并将令牌放入 Authorization 标头中(我很确定此步骤等同于双 cookie 提交技术)。 服务器根据授权标头中的有效令牌对用户进行身份验证。

现在这不是 100% 等效的,因为服务器没有检查 cookie 和 HTTP 标头是否匹配(如果我需要,这将很容易添加)。

到目前为止,我是否足以阻止 XSRF 攻击,还是我也应该添加一个 XSRF-TOKEN cookie?

【问题讨论】:

我觉得这个实现相当于double-submit-cookie,可以安全的防止CSRF攻击。此外,当使用 JWT 令牌时,这是一个非常干净的解决方案。但是,正如@mevdschee 所提到的,JWT 令牌内容会暴露给攻击者,因为它不能是 HttpOnly。 【参考方案1】:

我认为您可能可以安全地抵御 XSRF 攻击,但听起来,您无法抵御 XSS 攻击。为了防止 XSS 攻击,您还需要在 HttpOnly cookie 中存储一个秘密。

【讨论】:

但是他的客户端将无法读取 cookie 值以附加到 Header Authorization。所以我们回到第一方。 我觉得 JSON Web Tokens 最适合跨域边界(在单点登录解决方案中)或以其他方式获取会话令牌。 HttpOnly cookie 中的会话令牌最适合安全地执行一系列经过身份验证的请求。应使用表单字段中的双重提交和/或 XSFR 令牌来防止 XSRF。我不会尝试在一个解决方案中混合不同的安全目标。

以上是关于XSRF 和双重提交 cookie JWT 替代方案 - 这种实现安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

csrf 攻击和双重提交的 cookie

使用双重提交 cookie 的角度 SPA 中的 CSRF 保护

Cookie 中的 Angular JWT 如何防止 CSRF/XSRF 和 XSS

Jwt 中 token应该存储到哪里?

JWT

JWT 和签名 cookie 有啥区别?