【问题标题】:Is JWT necessary over HTTPS communication?HTTPS 通信是否需要 JWT?
【发布时间】:2018-02-09 04:57:54
【问题描述】:

我正在开发一个 MEAN 堆栈应用程序,并且我目前正在设置一个帐户系统。我看过几个关于身份验证的教程,都使用 JWT

我想知道,JWT 是否可以用作通过 HTTP 等非安全连接来保护通信传输的方式?

我已设置 HTTPS 以从我的 Angular 4 前端与我的 NodeJS + Express 后端进行通信,因此想知道是否需要 JWT 来保护我的通信?

【问题讨论】:

  • “安全”有两种不同的概念:通信安全与安全。帐户和网站内容的安全。 HTTPS 通信不需要 JWT。
  • JWT 通过 HTTP 等非安全连接进行安全通信传输。 JWT 主要是一种身份验证系统,只能用于使用 HTTPS 但 JWT 不会提高 HTTPS 的安全级别。也许你的倒置问题会更有意义

标签: node.js angular jwt mean-stack


【解决方案1】:

我是智威汤逊的新手。这是我在 http 而不是 https 中攻击 JWT 的场景。假设向用户 A 发出 JWTa 以访问服务器上的资源 A。黑客也是服务器的合法用户,他获得了JWTh来访问资源H。没有https保护,黑客可以嗅探网络,从A的请求中获取http头中的JWTa,并将其放入黑客的请求中。由于 JWTa 是有效令牌,所以黑客可以访问资源 A。我猜 JWT 协议可以防止这种情况,但我不知道如何。签名验证后,还需要验证声明。似乎“aud”可以防止这种情况,但我不知道它是如何工作的。

【讨论】:

    【解决方案2】:

    如今,开发人员更喜欢基于令牌的身份验证而不是会话。基于令牌的身份验证比会话有很多优势。 我们使用 JWT 即 JSON Web Token 在用户身份验证后生成一个令牌,每次您的前端应用程序进行 API 调用时,因此您的系统应该检查请求是否具有有效的令牌,如果它存在并且它是有效的那么它被视为有效用户。

    简而言之,我们使用 JWT 来验证我们的 API 调用,它与 HTTP 或 HTTPS 无关

    【讨论】:

    【解决方案3】:

    JWT 不应与加密相混淆。来自jwt.io

    JSON Web Token (JWT) 是一个开放标准(RFC 7519),它定义了一个 用于安全传输信息的紧凑且独立的方式 在各方之间作为 JSON 对象。

    JWT 使用公钥/私钥对进行签名,因此可以验证发送者,并验证有效负载没有被修改。但是,JSON Web Token 是明文形式。

    var token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ";
    
    var payload = token.split('.')[1];
    
    console.log('Payload: '+atob(payload))

    下图来自jwt.io,显示了使用 JWT 时的身份验证流程。

    您需要 SSL/HTTPS 来加密通信。如果没有 SSL/HTTPS,攻击者可以嗅探网络流量并获取 JWT,因此您的应用程序容易受到中间人攻击。

    【讨论】:

    • 我认为 OP 对 2 个不同的“安全”概念感到困惑:通信安全与安全。帐户和网站内容的安全
    • 就是这样,我没有真正了解 JWT 的用法,事实上它是用来替换 sessions 的,我认为它的作用与HTTPS
    • 实际上是 JWS(JWT 的一个分支),而 JWE(JWT 的另一个分支)实际上加密了有效载荷。
    • 这是最好最彻底的答案。我使用 JWE 进行身份验证管理,因为它会加密所有数据,如果它通过 HTTPS,则会再次加密。我觉得这是最好的解决方案。它确实有缺点。虽然它确实加密了整个令牌以及令牌中包含的所有数据(不仅仅是签名),但它使令牌变得如此之大(由于高加密标准和令牌中的少量数据)以至于它几乎不适合大多数浏览器的 cookie 的最大大小。所以,就是这样。
    • 是的,我同意,这是关于这个问题的最佳解释,特别是当 JWT 可以使用 MITM 攻击被嗅探时,如果通过 HTTP 传递,同样适用于基于 JSESSIONID cookie 的会话令牌例子。
    【解决方案4】:

    不,当您的服务器支持 HTTPS 时,不需要 JWT。 HTTPS 协议确保请求和响应在两端(客户端和服务器)都加密。

    我相信您希望在每个请求中向服务器发送跨用户凭据,然后服务器在从服务器发送任何响应之前验证用户。

    虽然您可以执行上述操作,但在服务器端,您最终会在每个请求中针对数据库验证用户凭据,这是一项昂贵的任务,您可以在使用 JWT 时避免这种情况。

    JWT 基本上对用户进行一次身份验证,并发出一个可以在一段时间内有效的访问令牌。

    【讨论】:

    • 不,我不想泄露用户凭据。这是一个非常大的漏洞!我想加密客户端和 API 之间交换的数据,因此,HTTPS 可以完成这项工作。但是,我还需要确保用户经过身份验证。在不存在会话的无状态配置中,JWT 是一种解决方案,因为此“协议”具有身份验证属性 + 它保证了消息的完整性。
    • 我寻找的最后一个属性是标识属性,它由 HTTPS 证书验证提供(在客户端完成,在接收域的证书时)。当我说“标识属性”时,我使用的是这个词的加密含义,即一种机制来确保 Bob 从 Alice 收到的数据实际上是由 Alice 发送的(而不是由伪装成 Alice 的攻击者发送的)。
    【解决方案5】:

    通过 HTTPS 通信是否需要 JWT?

    不。通信协议(HTTP vs HTTPS)是一回事,认证机制(JWT vs Session)是另一回事——这是两个完全不同的领域。

    对于通信协议(HTTP vs HTTPS),HTTPS 可以单独使用,无需任何 JWT 令牌或会话。例如,可以制作一个静态网站(仅 HTML+CSS)并使用 HTTPS 提供服务。这样网站就可以通过CA认证,防止伪造攻击。

    即使您需要在 Web 应用程序中进行身份验证,JWT 令牌也不是唯一的选择。 Session 是老技术,但它仍然可靠,这使得 JWT 绝对不是必要的

    【讨论】:

    • 是的,这不是必需的,但我的问题是:是否需要通过 HTTPS 使用 JWT?但是感谢您指出会话可用于验证用户的身份验证!
    • @MaximeFlament 好吧,对于“通过 HTTPS 使用 JWT”,我仍然认为没有必要——当然,这是一个很好的解决方案,但也有许多其他的好解决方案。有些网站甚至没有自己的账户系统,而是使用 3rd-party 登录服务——在这种情况下,网站不维护自己的 JWT 令牌
    • JWT 可以通过 HTTP 连接使用。它仅取决于应用程序上下文。也可以加密:见tools.ietf.org/html/rfc7516
    • “JWT 可以通过 HTTP 连接使用” 请通过 HTTPS 传输您的令牌/会话标识信息!
    猜你喜欢
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多