JSON Web 令牌 (JWT) - 验证客户端

Posted

技术标签:

【中文标题】JSON Web 令牌 (JWT) - 验证客户端【英文标题】:JSON Web Tokens (JWT) - Validate Client 【发布时间】:2015-09-20 07:35:09 【问题描述】:

我一直在研究 JWT,我对使用它非常感兴趣。由于数字签名和有效负载内容,我喜欢它不需要对服务器进行状态检查。

我遇到的困难是验证客户。我知道签名允许服务器说“是的,我发出了这个令牌,它是有效的”,但我不完全理解服务器如何验证客户端就是它所说的那个人。

数字签名在服务器端是有意义的,但客户端不能签署任何东西来验证它是谁,因为浏览器不能保密。这是我无法理解的一部分。如果浏览器无法保密,它如何将数据添加到令牌(如随机数,或有关它请求的资源的信息)以包含在签名中,类似于 oAuth 1.0 的工作方式。

不支持吗?还有其他方法可以验证浏览器的身份吗?如果我的客户有泄漏令牌的安全漏洞怎么办?如果客户端没有经过验证,任何人都不能使用这些令牌吗?我不认为“短过期时间”是解决这个问题的好方法。

有人可以帮我了解一下 JWT 的这一部分吗?

【问题讨论】:

【参考方案1】:

为了补充 Tim B 所说的,我使用了令牌,其中密钥具有浏览器和 ip,如下所示:(php 示例)

$secret_key = 'kajsdfkljk' . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'];

这似乎确实有效,但是,如果您在网络之间跳来跳去,那么您每次都必须登录,在这种情况下,您可以只使用用户代理而不是 ip。

这里要注意的另一件事是,如果发生某种泄漏,您可以随时更改密钥,这样从您的服务器发出的所有令牌都将不再有效。

此外,如果不使用 https 连接,使用令牌进行身份验证可能非常危险。

【讨论】:

“此外,如果不使用 https 连接,使用令牌进行身份验证可能非常危险” - 这同样适用于公平地使用会话。如果不使用 HTTPS,您将无法真正安全地进行任何 Web 身份验证。【参考方案2】:

验证客户端没有受到威胁实际上是不可能的,因为它肯定会泄漏令牌。令牌过期有助于减轻泄漏令牌的危险时间过长,但正如您所提到的,这不是一个万无一失的解决方案。您可以使用请求用户的当前 IP 地址作为签名密钥的一部分来做一些事情,以帮助减轻在其他地方使用泄露的令牌。它仍然可以在本地通过 XSS 使用,但不那么容易被网络钓鱼者使用。

我的理解是客户端不会向令牌添加信息,它只会在附加信息旁边传递它。单独的 POST 变量 -- 用于“验证”身份的令牌,其他变量用于定义附加参数。

【讨论】:

嗯,我没有想过使用与客户端相关的秘密,这是个好主意。 Oauth 1.0a 通过让“客户端”(实际上是另一台服务器)签署他们的整个请求来处理这个问题。在浏览器中并没有真正的方法可以做到这一点,但我喜欢使用来自客户端的动态密钥的想法。

以上是关于JSON Web 令牌 (JWT) - 验证客户端的主要内容,如果未能解决你的问题,请参考以下文章

了解 Web 身份验证上下文中的 JSON Web 令牌 (JWT)

如何跨不同 API 对 JSON Web 令牌 (JWT) 进行身份验证?

Json Web 令牌 JWT

如何以安全的方式为客户提供 JSON Web 令牌(JWT)?

Express、Passport 和 JSON Web 令牌 (jwt) 身份验证

如何在 Web API 中验证 Azure B2C JWT 令牌?