令牌被盗时如何添加额外的jwt安全层
Posted
技术标签:
【中文标题】令牌被盗时如何添加额外的jwt安全层【英文标题】:How to add extra layer of jwt security when the token is stolen 【发布时间】:2021-04-05 03:41:29 【问题描述】:我正在使用 jwt。我有一些管理路线。我将令牌保存在 localStorage 中。在我的令牌的有效负载中,我还有管理属性是真还是假。我想知道如果某个用户的“管理员”令牌被盗,并且恶意用户的 localStorage 中的旧“非管理员”令牌被“管理员”令牌替换,那么他将可以访问管理员路由。
以某种方式防止这种情况:
例如,我将在 10 分钟内刷新令牌(但恶意用户可以在那 10 分钟内做很多坏事——从数据库中删除用户,删除配置等...)。 有没有其他方法可以防止这 10 分钟的“可能的攻击”
将令牌保存在 httpOnly 和安全 cookie 中。是否 100% 确定如果我将令牌存储在这种 cookie 中,并且没有人可以编辑它?因此,当“管理员”令牌被盗时,恶意用户不能像在 localStorage 中那样复制粘贴新令牌?
【问题讨论】:
【参考方案1】:不要将令牌保存在LocalStorage中,因为js可以访问,这意味着任何XSS攻击都可以访问令牌。
使用两种标记,
-
短期访问令牌(10 分钟),它将附加到每个 api 请求,它必须包含无法“猜测”的某种哈希值,使用它您将在服务器端识别用户,它将保存在内存中。
长期刷新令牌(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
【讨论】:
以上是关于令牌被盗时如何添加额外的jwt安全层的主要内容,如果未能解决你的问题,请参考以下文章