【问题标题】:How to add extra layer of jwt security when the token is stolen令牌被盗时如何添加额外的jwt安全层
【发布时间】:2021-04-05 03:41:29
【问题描述】:

我正在使用 jwt。我有一些管理路线。我将令牌保存在 localStorage 中。在我的令牌的有效负载中,我还有管理属性是真还是假。我想知道如果某个用户的“管理员”令牌被盗,并且恶意用户的 localStorage 中的旧“非管理员”令牌被“管理员”令牌替换,那么他将可以访问管理员路由。

以某种方式防止这种情况:

  • 例如,我将在 10 分钟内刷新令牌(但恶意用户可以在那 10 分钟内做很多坏事——从数据库中删除用户,删除配置等...)。 有没有其他方法可以防止这 10 分钟的“可能的攻击”

  • 将令牌保存在 httpOnly 和安全 cookie 中。是否 100% 确定如果我将令牌存储在这种 cookie 中,并且没有人可以编辑它?因此,当“管理员”令牌被盗时,恶意用户不能像在 localStorage 中那样复制粘贴新令牌?

【问题讨论】:

    标签: node.js express jwt jwt-auth


    【解决方案1】:

    不要将令牌保存在LocalStorage中,因为js可以访问,这意味着任何XSS攻击都可以访问令牌。

    使用两种标记,

    1. 短期访问令牌(10 分钟),它将附加到每个 api 请求,它必须包含无法“猜测”的某种哈希值,使用它您将在服务器端识别用户,它将保存在内存中。
    2. 长期刷新令牌(12 小时或更长时间),它将保存在httpOnly + secure cookie 中。它有一个目的,你的应用程序可以生成一个新的访问令牌(当它过期时)。它必须包含不可“猜测”的哈希来识别用户。

    这将使您的系统更加健壮。如果有人以某种方式获得了 accessToken,它将在 10 分钟内过期,没有它,您的 api 将拒绝请求。 httpOnly + secure cookie 的盗取难度要大得多,如果有人盗取了,你可以“撤销”token 里面的hash,这样就没有用了。

    通过撤销,为特定用户/整个数据库在数据库中生成新哈希很简单。

    我总是推荐阅读这个https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/

    关于 accessToken + refreshToken 的整个思路在此解释。

    我的一些代码示例,Axios Interceptor Response Token Refresh API called but getting Token is expired regardless in refreshToken API & lator all APIs

    【讨论】:

      猜你喜欢
      • 2019-08-09
      • 2013-08-15
      • 2021-10-28
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2021-10-03
      相关资源
      最近更新 更多