将开发一个 REST API 来接受用户名和密码并执行
身份验证。要使用的 HTTP 方法是 POST,以便
没有缓存。此外,将有 SSL 以确保安全
过境
这是大多数人的做法,所以你在这里很好。
在认证的时候,会创建两个JWT——访问令牌
并刷新令牌。刷新令牌将具有更长的有效期。这俩
令牌将被写入 cookie,以便它们在每个
后续请求
将令牌存储在 cookie 中本身并不危险,但如果你以某种方式让你的服务器上的 JWT 模块从那里读取它们,你就容易受到 CSRF 攻击,其中任何网页都可以触发用户浏览器发送表单 + 你的站点cookie 到您的服务器,除非您使用 CSRF 令牌。所以通常它们存储在 localStorage 中,并且每次都“手动”添加到请求标头中。
每次调用 REST API 时,都会从 HTTP 检索令牌
标题。如果访问令牌未过期,请检查权限
用户并相应地允许访问。如果访问令牌已过期
但刷新令牌有效,重新创建新的访问令牌并刷新
具有新到期日期的令牌(进行所有必要的检查以确保
用户进行身份验证的权限不会被撤销)并通过
饼干
除了 cookie 的危险之外,它似乎是安全的。
提供一个注销 REST API,它将重置 cookie,因此
在登录完成之前,后续的 API 调用将被拒绝。
您甚至不需要进行 API 调用,只需清除 cookie 或 localStorage 对象并确保您的客户端不会因丢失令牌而中断。
express-jwt 模块的标准要求令牌位于其自己的“Authorization: Bearer [Token]”标头中,我强烈建议不要使用 cookie。 localStorage API 一直可用到IE8,所以你应该很好。
编辑:
首先,了解 XSS 和 CSRF 攻击之间的区别很重要,因为它们通常被认为是同一件事。
XSS 是指用户在其他用户的浏览器中在您的域上运行不安全的 JS,当这种情况发生时,localStorage 中的 JWT 或会话中的 JWT 和 cookie 中的 JWT 都不安全。使用 cookie 上的 httpOnly 标志,您无法直接访问它们,但浏览器仍会将它们与 AJAX 请求一起发送到您的服务器。如果发生这种情况,你通常会倒霉。为防止这种情况发生,请确保在将所有用户输入发送到浏览器时对其进行转义。
如果您使用脚本标签或 iframe 加载第 3 方 JS,除非您小心,否则这可能会危及 localStorage,但我在这方面的工作还不够,无法在这里为您提供帮助。
CSRF 仅在其他域试图通过让浏览器自动发送 cookie 来向您的服务器发送普通 HTML 表单时。框架通过插入唯一的随机字符串作为隐藏字段并在提交时再次检查它们来防止这种情况。 localStorage 中的 JWT 是安全的,因为每个域都有自己独立的 localStorage 区域。
但最终这一切都取决于您的服务是否将使用单个域,在这种情况下,httpOnly cookie 将非常安全且易于设置,但如果您想将服务分散到多个域(如 api.domain)上。 com + app.domain.com 或添加一个本机应用程序,您必须将您的 JWT 存储在 localStorage 或其他一些本机存储区域中。
希望这会有所帮助!