是什么保护 JWT 不被劫持并被用来冒充原始用户?

信息安全 验证 jwt
2021-08-15 09:44:04

抱歉这个可能很愚蠢的问题,我只是在学习 JWT,所以请多多包涵……

我广泛阅读了 JWT 文档,但我不明白是什么阻止了黑客劫持 JWT 并冒充其最初发布的用户。

这是我担心的场景:假设一个不良行为者能够以某种方式嗅探我公司网络上的流量,并且在我的网站上也有一个简单的帐户。如果他能够找到具有管理员或特殊权限的员工用户,他不能登录网站,接收他的 SSL cookie,然后劫持员工的 JWT 并立即冒充该用户并获得这些特殊权限吗?

由于我不会再次检查不良行为者的凭据,只检查他们的 JWT,在我看来,不良行为者可以通过他的简单帐户使用站点 SSL 提交 JWT...

我在这里错过了难题的哪一部分?谢谢!

4个回答

JWT 只是将信息封装成字符串,能够加密这些信息并检测篡改。JWT 本身并不能防止通过嗅探、XSS、CSRF、浏览器扩展或类似方式进行的 cookie 盗窃或滥用。

这意味着您仍然需要采用通常的方法来保护令牌或 cookie 免受滥用,即使用仅 http 的 cookie 来防止 XSS,使用 TLS 来防止嗅探,使用 CSRF 令牌或其他技术来防止 CSRF 等。您可能会在受保护的令牌中包含一些使误用更加困难的信息,例如浏览器的指纹、用户的源 IP 等 - 请参阅OWASP:将会话 ID 绑定到其他用户属性当然,每次使用cookie进行授权时,您都需要验证这些信息。

攻击者嗅探网络流量并窃取会话 cookie 以冒充其他用户会带来相当大的风险。然而,JWT 并不是为了解决这种风险而设计的。你有 SSL/HTTPS 来解决这个问题。您的浏览器和 Web 服务器之间的 SSL 连接提供了传输过程中的机密性和数据安全性。如果您在 HTTP 连接上使用 JWT,则无法阻止攻击者嗅探您的流量并滥用令牌。

JWT 是自给自足的令牌,用于在不同系统之间共享身份验证信息。它们解决了依赖第三方验证身份验证令牌的问题,因为验证 JWT 所需的所有信息都包含在令牌本身中。这简化了单点登录系统中的登录过程,因为所需的集成最少。JWT 也是 HTTP 友好的,因为它们只是 BASE-64 字符串。

JWT 过去曾遇到过安全问题阅读更多

PS 你仍然需要依靠第三方来获得正确的公钥来进行令牌验证。

我过去也面临过这个与安全相关的问题,但我可以在 laravel 中这样做。简单地制作一个中间件并像那样检查 Origin。

<?php
namespace App\Http\Middleware;
use Closure;
class CheckOrigin
{
    public function handle($request, Closure $next)
    {
        if($request->header('Origin') != 'http://yourapihost.com') {
            return response()->json([
                'meta' => [
                    'message' => 'You are Unauthorize person.',
                    'status_code' => 401,
                    'status' => false,
                ],
            ],401);
        }
        return $response;
    }
}

因此,如果有人劫持了您的 jwt 令牌,然后尝试从另一台服务器或本地主机调用请求,则中间件不允许此类请求。

我跳进去提供一些背景信息。

是什么保护 JWT 不被劫持并被用来冒充原始用户?

正如其他人所说,没有JWT 本身并没有对此提供保护。

即使通信通道受到损害,也有一些身份验证方案可以提供保护。这些被称为签名方案它们通过签署 HTTP 请求来工作,因此得名。它们很复杂,没有标准,主要用于后端通信。