JWT认证和刷新令牌实施

我正在开发一个具有自己的认证和授权机制的REST应用程序。 我想使用JSON Web令牌进行身份验证。 以下是一个有效和安全的实施?

  • REST API将被开发为接受用户名和密码并进行身份验证。 要使用的HTTP方法是POST,因此不存在缓存。 此外,在过境时还会有SSL安全
  • 在身份验证时,将创建两个JWT - 访问令牌和刷新令牌。 刷新令牌将具有更长的有效性。 这两个令牌都将写入Cookie中,以便在每个后续请求中发送这些令牌
  • 在每个REST API调用中,都会从HTTP头中检索令牌。 如果访问令牌未过期,请检查用户的权限并相应地允许访问。 如果访问令牌已过期但刷新令牌有效,则重新创建新的访问令牌并刷新具有新的过期日期的令牌(执行所有必要的检查以确保用户的身份验证权限未被吊销)并通过Cookie发回
  • 提供一个注销REST API来重置该Cookie,因此在登录完成之前,后续的API调用将被拒绝。
  • 我对这里的刷新标记的理解是:

    由于刷新令牌的存在,我们可以保持访问令牌的有效期较短,并且频繁(在访问令牌到期时)检查用户仍然有权登录。

    如果我错了,请纠正我。


    REST API将被开发为接受用户名和密码并进行身份验证。 要使用的HTTP方法是POST,因此不存在缓存。 此外,在过境时还会有SSL安全

    大多数人都这样做,所以你很好。

    在身份验证时,将创建两个JWT - 访问令牌和刷新令牌。 刷新令牌将具有更长的有效性。 这两个令牌都将写入Cookie中,以便在每个后续请求中发送这些令牌

    在Cookie中存储令牌我自己并不危险,但如果您以某种方式让服务器上的JWT模块从那里读取它们,您就容易受到CSRF攻击,其中任何网页都可以触发用户浏览器发送表单+您的站点cookie到你的服务器,除非你使用CSRF令牌。 所以通常它们存储在localStorage中,并且每次都“手动”添加到请求标题中。

    在每个REST API调用中,都会从HTTP头中检索令牌。 如果访问令牌未过期,请检查用户的权限并相应地允许访问。 如果访问令牌已过期但刷新令牌有效,则重新创建新的访问令牌并刷新具有新的过期日期的令牌(执行所有必要的检查以确保用户的身份验证权限未被吊销)并通过Cookie发回

    除了cookie的危险外,它似乎是安全的。

    提供一个注销REST API来重置该Cookie,因此在登录完成之前,后续的API调用将被拒绝。

    您甚至不需要进行API调用,只需简单地清除Cookie或localStorage对象,并确保客户端不会丢失缺少的令牌。

    express-jwt模块的标准要求令牌位于其自己的“授权:承载[令牌]”标头中,我强烈建议通过Cookie。 localStorage API可以一直返回到IE8,所以你应该很好。

    编辑:

    首先,了解XSS和CSRF攻击之间的区别很重要,因为它们通常被认为是相同的。

    XSS是当用户在其他用户浏览器中在您的域中运行不安全的JS时,在这种情况下,localStorage中的JWT或Cookie中的JWT都不安全。 使用cookie上的httpOnly标志,您不能直接访问它们,但浏览器仍然会向您的服务器发送AJAX请求。 如果发生这种情况,你通常会不幸运。 为防止发生这种情况,请确保在所有用户输入发送到浏览器时将其转义。

    如果您使用脚本标记或iframe加载第三方JS,除非您小心,否则这可能会危及localStorage,但我没有足够的工作来帮助您。

    CSRF仅在其他域试图通过让浏览器自动发送cookie来将正常的HTML表单发送到您的服务器时。 框架通过插入唯一的随机字符串作为隐藏字段来防止这种情况,并在提交时再次检查它们。 JWT的localStorage是安全的,因为每个域都有自己独立的localStorage区域。

    但最终所有这一切取决于您的服务是否将使用单个域名,在这种情况下,httpOnly cookies将具有足够的安全性并且更容易设置,但是如果您想将服务分散到多个域名,如api.domain.com +应用.domain.com或添加一个本地应用程序,您不得不将其存储在localStorage或其他本地存储区域中的JWT。

    希望这可以帮助!


    我对这里的刷新标记的理解是:

    由于刷新令牌的存在,我们可以保持访问令牌的有效期较短,并且频繁(在访问令牌到期时)检查用户仍然有权登录。

    如果我错了,请纠正我。

    假设你在谈论如何在OAuth中使用JWT作为持票人令牌(我强烈建议遵循OAuth 2.0协议),这是正确的。

    如果在JWT中使用额外的auth-time(认证时间戳)声明,则甚至可以丢弃第二个令牌并将其作为刷新令牌发送(如果令牌有效,auth-server可以发出新的访问令牌&auth-time在允许的范围内)......但确定,遵守标准也是很好的;)

    无论如何,在使用JWT作为更新令牌之前,您应该考虑一些额外的方面(这些方面往往会变得困难或甚至违背JWT的基本概念),因为这基本上意味着您会引入长期存在的JWT:

  • 你是否需要按主题强制用户注销/令牌撤销(例如,如果用户被识别为欺诈)?
  • 你是否需要像撤销特定的令牌(例如,如果用户丢失设备)?
  • ...
  • 根据您的使用情况,您应该考虑所有可能的影响,长寿命令牌通常会要求您在服务器端引入某种状态(例如允许撤销/列入黑名单)。 请记住,JWT概念的美丽和安全性在于JWT短暂。

    链接地址: http://www.djcxy.com/p/22029.html

    上一篇: JWT authentication & refresh token implementation

    下一篇: Handling JWT expiration and JWT payload update