【问题标题】:Is JWT in URI a bad practice?URI 中的 JWT 是一种不好的做法吗?
【发布时间】:2019-01-24 17:33:00
【问题描述】:

我有一个存储在 Redis 中的令牌后备列表 (JWT),我希望我的网站用户能够以 RESTful 方式将他们的令牌列入黑名单。

我可以:

  1. 使用 DELETE 方法构建路由 /sessions/<token>
  2. 使用 DELETE 方法和请求正文中发送的令牌构建路由 /sessions/

第一个解决方案很简单,但令牌存储在服务器的日志和用户浏览器的历史记录中。

第二种解决方案似乎更好,但我不确定通过发送带有正文的 DELETE 请求是否违反了 HTTP RFC 的幂等性原则。

在这种情况下,最佳做法是什么?

【问题讨论】:

    标签: http jwt


    【解决方案1】:

    URI 中的 JWT 是不是一种不好的做法?

    语法而言,JWT 令牌是 URL 安全的。来自RFC 7519

    JWT 表示为一系列 URL 安全部分,由句点 (.) 字符分隔。每个部分都包含一个 base64url 编码的值。 [...]

    但是,当使用 JWT 作为不记名令牌时,建议避免在 URL 中发送它们。请参阅RFC 6750 中的以下引用:

    不要在页面 URL 中传递不记名令牌:不记名令牌不应该是 传入页面 URL(例如,作为查询字符串参数)。

    相反,不记名令牌应该在 HTTP 消息头中传递,或者 对其采取保密措施的消息正文。

    浏览器、网络服务器和其他软件可能不够安全 浏览器历史记录、Web 服务器日志和其他数据中的 URL 结构。如果不记名令牌在页面 URL 中传递,攻击者可能 能够从历史数据、日志或其他不安全的 地点。


    对于您问题中提到的情况,您可能不需要发送完整的令牌。您可以为令牌提供唯一标识符(存储在 jti 声明中),然后仅将令牌标识符发送到服务器。

    查看上述 RFC 中如何定义 jti 声明:

    4.1.7. "jti" (JWT ID) Claim

    jti(JWT ID)声明为 JWT 提供了唯一标识符。 标识符值的分配方式必须确保 相同值的概率可以忽略不计 意外分配给不同的数据对象;如果申请 使用多个发行者,必须防止值之间的冲突 也由不同的发行人制作。可以使用jti 声明 以防止 JWT 被重放。 jti 值是一个案例- 敏感字符串。使用此声明是可选的。

    UUID 应该是 unique enough 以在没有冲突的情况下识别您的令牌。

    您也不需要将完整令牌存储在黑名单中:仅存储 jti 声明的值以及您可能认为相关的一些其他声明(例如 subexp,例如)。


    DELETE 请求不应包含正文。所以您可以使用DELETE /sessions/{id},其中{id} 是您的令牌的唯一标识符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 2011-10-23
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多