【问题标题】:Securing a JWT token保护 JWT 令牌
【发布时间】:2019-12-15 12:06:18
【问题描述】:

一般来说,JWT 有一个带有签名的编码消息。签名用于检查数据的真实性。我的问题是,这个签名是为了向客户端保证服务器,但是服务器如何信任客户端?换句话说,如果客户端向服务器发送 JWT,服务器如何确定这是正确/经过身份验证的客户端?

我的第二个问题是关于 JWT 的生命周期。我知道有一个声明(exp)可以设置为指示 JWT 的到期。但是,如果客户更改了该声明怎么办?我应该在服务器上保留到期日期以确保 JWT 仍然有效吗? Wikipedia 说:要验证存储在令牌中的会话未被撤销,必须根据数据存储检查令牌断言。这使得令牌不再是无状态的,削弱了 JWT 的主要优势。

【问题讨论】:

  • 希望创建 JWT 签名的密钥只有服务器知道,这样可以防止客户端创建服务器可以接受的假 JWT(假设您没有实现问题)。跨度>
  • @TheGreatContini,客户端应该知道这个秘密,以验证它真的来自服务器。
  • 这不是一个好的设计。如果您使用公钥加密(ECC 或 RSA),客户端不需要知道秘密,可以只使用公钥进行验证。

标签: api oauth-2.0 jwt


【解决方案1】:

给定一个 JWT,服务器通过验证标头和有效负载的 HMAC 是否等于签名来知道客户端是合法的。服务器有一个密钥,它在计算 HMAC 时使用它,所以如果有人想创建一个具有正确签名的假 JWT,他们将需要访问这个密钥。

您的第二个问题与第一个问题的想法相同。如果客户想要更改其 JWT 的到期时间,他们将不得不重新计算签名,并且要成功执行此操作,他们必须知道密钥。

使用 JWT 的重点不是在服务器上存储过期日期等数据,所有这些数据都存在于令牌本身中,并且这些数据的完整性受到用于计算签名的密钥的保护。

【讨论】:

  • 感谢您的评论。我这里有个疑问,JWT 是由 OAuth 服务器生成的,对吧?并且秘密应该与客户端共享,以便它可以验证令牌的真实性。这样,客户端可以生成 JWT,并扩展(已过期)令牌。有什么我错过的吗?
  • @Amir 密钥应该只有服务器知道! OAuth 提供者和客户端都不应访问密钥。通常它是这样工作的:服务器向 OAuth 提供者询问 OAuth 代码,将其转换为 JWT 令牌,并将 JWT 提供给客户端。从那时起,客户端每次发出请求时都会将 JWT 传递给服务器。
  • 哦,我明白了。我以为是在服务器和客户端之间。
【解决方案2】:

JSON 网络令牌 (JWT) 有两种形式。典型的,最广泛使用的形式是使用带有 JSON Web 签名 (JWS) 的 JWT。在安全领域,这提供了完整性。其他形式是带有 JSON Web 加密 (JWE) 的 JWT。此表单提供完整性和机密性。

因此,如果您有特定要求来确定您获得了有效、机密的 JWT,那么您应该采用基于 JWE 的方法。您可以在RFC7516 中阅读更多相关信息。对于加密,您可以使用对称或非对称密钥。收到基于 JWE 的 JWT 后,您可以通过成功解密 JWT 有效负载来验证它是由预期方发送的。

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2017-05-13
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多