【发布时间】:2018-02-06 02:21:02
【问题描述】:
在前端使用 React,以 RESTful API 作为后端并通过 JSON Web Token (JWT) 进行授权,我们如何处理会话?例如,登录后,我从 REST 获得了一个 JWT 令牌。如果我将它保存到 localStorage 我很容易受到 XSS 的攻击,如果我将它保存到 cookie 中,除了我将 cookie 设置为 HttpOnly 之外,同样的问题,但 React 无法读取 HttpOnly Cookies(我需要读取 cookie 以从中获取 JWT,并使用这个带有 REST 请求的 JWT),我也没有提到跨站点请求伪造(CSRF)问题。如果您使用 REST 作为后端,则不能使用 CSRF Tokens。
因此,React with REST 似乎是一个糟糕的解决方案,我需要重新考虑我的架构。是否可以为您的用户提供一个安全的 React 应用程序来处理 REST API 端的所有业务逻辑,而不必担心丢失他们的数据?
更新:
据我了解,可以这样做:
- React 对 REST API 进行 AJAX 调用
- React 从 REST API 获取 JWT 令牌
- React 写入 HttpOnly cookie
- 由于 React 无法读取 HttpOnly cookie,我们在所有需要身份验证的 REST 调用中按原样使用它
- REST API 调用检查 XMLHttpRequest 标头,这是某种 CSRF 保护
- REST API 端检查 cookie,从中读取 JWT 并执行操作
我在这里缺乏理论知识。逻辑看起来很安全,但我仍然需要回答我的问题并批准这个“工作流程”。
【问题讨论】:
-
first.. 如果您使用 JWT 令牌进行身份验证,您为什么还要在前端读取它。它应该是 http-only 和安全的.. 其次.. 很有可能将 CSRF 令牌与 REST 一起使用。作为参考,您可以查看 OWASP 的指南。希望这会有所帮助owasp.org/index.php/…
-
@TasmineRout 但我如何在后端读取它?例如,我获取 rest api 来获取 JWT,我如何才能读取并保存它而不是在前端?
-
@MyMomSaysIamSpecial 您可以阅读有关 HTTP Only Cookies here 的信息。当您发出其余请求以获取令牌时,服务器会将其作为仅 HTTP cookie 发送回,浏览器将其与您域的其他 cookie 一起存储在其末尾。然后在每个请求中将相同的 cookie 与所有其他 cookie 一起发送到您的服务器(ajax 或其他)。您无需在客户端执行任何操作即可实现这一点。事实上,浏览器不允许使用 Javascript 读取 cookie。所以他们不能被劫持。
-
@MyMomSaysIamSpecial 您可以读取后端的所有 cookie。您可以从 Http 标头中获取它。 CSRF 令牌是为了防止跨站点请求。它们用于确保对 Web 服务的请求仅来自相应的 UI/用户。它们不用于对请求者进行身份验证或授权。它们仅用于保护 Web 服务免受来自外部的欺诈性请求。它们可以是特定于会话/请求的,因此没有其他人可以使用您的令牌。
-
你看过这篇文章吗? stackoverflow.com/questions/27067251/…