关于 MITM(Man-in-the-MiddleAttack) 的部分说“使用一次性(单次使用)令牌(在单击链接后过期)”是 MITM 的解决方案。
我的问题是,如果令牌只使用一次,它会导致用户每次发送请求后都必须重新登录。另一方面,如果服务器每次都销毁令牌并返回新令牌,则新令牌仍然可以被中间人拦截。
如果我错了,请告诉我,谢谢!
@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你好?
@nelsonic感谢您分享帖子。
帖子说:
理论上,这也适用于除密码重置令牌之外的用例,例如电子邮件激活、帐户确认
我同意这些案例适合一次性使用jwt,但我的案例是jwt包含用户角色信息并且角色是恒定的,它不喜欢密码重置、电子邮件激活、帐户确认等。
所以,回到问题,就我而言,现在我认为没有必要验证令牌,只需将 == 运算符与数据库的令牌一起使用即可。
最有用的评论
@NE-SmallTown 我很抱歉没有立即回复。
JWT 规范没有一次性失效的声明/机制
见: http :
@jbspeakr有一篇关于如何一次性使用 JWT 的帖子,
见: https :