令牌被盗时如何添加额外的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安全层的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 ASP.NET Core Web API 免受被盗 JWT 令牌以进行模拟

Spring OAuth/JWT 从访问令牌中获取额外信息

如何在微服务中添加基于 Jwt 令牌的安全性

刷新令牌如何比长寿命的 JWT 更安全?

如何将 jwt 令牌添加到 url?

保护 JWT 的最佳方法是啥?