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

JSON Web Tokens (JWT) - Validate Client

本文关键字:验证 客户端 JWT Web 令牌 JSON      更新时间:2023-09-26

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

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

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

是否不支持此操作?有没有其他方法可以验证浏览器是谁?如果我的客户有一个泄露代币的安全漏洞怎么办?如果客户端没有经过验证,难道没有人可以使用这些令牌吗?我认为"短到期时间"不是解决这个问题的好办法。

有人能帮我把JWT的这个部分包起来吗?

为了补充Tim B所说的内容,我使用了令牌,其中密钥上附加了浏览器和ip,如下所示:(PHP示例(

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

然而,这似乎确实有效,如果你从一个网络跳到另一个网络,那么你每次都必须登录,在这种情况下,你可以只使用用户代理,而不是ip。

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

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

验证客户端没有被泄露是不可能的,因为它肯定会泄露令牌。令牌过期有助于缓解泄露的令牌在太长时间内的危险,但正如您所提到的,这并不是一个愚蠢的解决方案。您可以使用请求用户的当前IP地址作为签名密钥的一部分来帮助缓解在其他地方使用的泄漏令牌。它仍然可以通过XSS在本地使用,但不太容易被钓鱼者使用。

我的理解是,客户端不会将信息添加到令牌中,只会将其与附加信息一起传递。单独的POST变量——一个用于"验证"身份的令牌,其他变量用于定义其他参数。