Learn-json-web-tokens: 为什么“一次性使用”可以解决MITM?

创建于 2017-03-12  ·  5评论  ·  资料来源: dwyl/learn-json-web-tokens

关于 MITM(Man-in-the-MiddleAttack) 的部分说“使用一次性(单次使用)令牌(在单击链接后过期)”是 MITM 的解决方案。

我的问题是,如果令牌只使用一次,它会导致用户每次发送请求后都必须重新登录。另一方面,如果服务器每次都销毁令牌并返回新令牌,则新令牌仍然可以被中间人拦截。

如果我错了,请告诉我,谢谢!

question

最有用的评论

@NE-SmallTown 我很抱歉没有立即回复。
JWT 规范没有一次性失效的声明/机制
见: http :

@jbspeakr有一篇关于如何一次性使用 JWT 的帖子,
见: https :

所有5条评论

@NE-SmallTown 好问题。
使用一次性令牌是应用程序安全性的良好做法。
如果你想使用这个模式,你可以设置一个onPreResponse钩子,它会为每个响应自动更新 JWT。

您必须回答的问题是:您打算如何确保_不_重新使用令牌?
您需要将标识符存储在某种数据库中(_我们通常在我们的应用程序中为此使用redis )并检查令牌是否已被使用。

@nelsonic感谢您的回复。我有点困惑。

有一个问题。

正如你所说,过程是:

用户访问主页并在标题中发送令牌(假设他们已登录)

                                       |
                                       |
                                       ↓

服务器收到令牌,然后通过解码令牌得到userId ,然后去数据库(假设我使用数据库而不是redis )取userId对应的令牌==操作符检查它们是否相等。如果相等,则销毁令牌并生成一个新令牌并将其推送到数据库并将其和数据响应给客户端。

有个问题,我们只是用==操作符来检查,但是我们知道token本身有验证机制,我们不使用它?例如:

JWT.require(Algorithm.RSA256((RSAKey) publicKey))
                .withIssuer("auth")
                .withSubject("ne-smalltown")
                .withAudience(userId)
                .withArrayClaim("jwt-role", userRole)
                .build()

如果我错了,您能告诉我如何以及在何处使用上述令牌本身的验证机制吗?

IMO,我唯一可以使用令牌本身验证机制的地方是我获取旧令牌的 exp 参数并将其放入新令牌的地方,以便我可以检查令牌是否已过期以使用户重新登录。

                                        |
                                        |
                                        ↓

客户端收到新令牌并将其推送到localstorage以替换旧令牌。在下一个请求中,它将使用它。

@nelsonic你好?

@NE-SmallTown 我很抱歉没有立即回复。
JWT 规范没有一次性失效的声明/机制
见: http :

@jbspeakr有一篇关于如何一次性使用 JWT 的帖子,
见: https :

@nelsonic感谢您分享帖子。

帖子说:

理论上,这也适用于除密码重置令牌之外的用例,例如电子邮件激活、帐户确认

我同意这些案例适合一次性使用jwt,但我的案例是jwt包含用户角色信息并且角色是恒定的,它不喜欢密码重置、电子邮件激活、帐户确认等。

所以,回到问题,就我而言,现在我认为没有必要验证令牌,只需将 == 运算符与数据库的令牌一起使用即可。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

nelsonic picture nelsonic  ·  4评论

KumarS-Naveen picture KumarS-Naveen  ·  3评论

rhewitt22 picture rhewitt22  ·  5评论

nelsonic picture nelsonic  ·  5评论

rjmk picture rjmk  ·  9评论