安全性 - JWT 令牌签名验证 JavaScript
我正在制作一个使用 JWT 令牌连接到 API 的 JavaScript 客户端。在服务器端没有问题,我可以创建令牌、签署它,并且稍后验证签名,从而确保没有人篡改令牌。
但是我如何在客户端执行此操作。我可以解码 JWT 令牌并查看头部、有效载荷和签名。但我如何在客户端验证签名呢?有没有用于此的库,我如何将公钥传输到客户端?
如果我不验证签名,我怎么知道令牌没有被篡改?
答案#1
如果我不在客户端验证签名,我如何确保令牌确实来自服务器?也许有中间人正在更改令牌
签名验证不能避免中间人攻击。攻击者即使使用有效的令牌,也可能嗅探通道以捕获凭证或篡改消息
使用 SSL/TLS 通道 (https)
如果我不验证签名,我怎么知道令牌没有被篡改?
由 TLS 受信任服务器提供的令牌 可能 是有效的。(它可能已在本地存储中被篡改)。你可以验证签名。这个操作通常在服务器端完成(参见 @sakuto 的回答),但你也可以在浏览器中完美地执行它。
但我如何在客户现场验证签名?
这些是步骤
- 从可信服务器下载公钥
- 从 JWT 提取签名并解码它(base64url)
- 使用加密库验证数字签名
我建议使用 Webcrypto。这里有一个 RSA 导入密钥和验证的示例:https://github.com/diafygi/webcrypto-examples/blob/master/README.md#rsassa-pkcs1-v1_5
答案#2
你通常不会在客户端进行验证,也不会在令牌上存储重要数据。每一个控制和权限都在后端进行检查。这意味着即使用户篡改了自己的令牌,他也无法通过后端的控制,只可能在前端看到一个额外的选项。