URI中的JWT是不好的做法吗?

时间:2018-08-17 16:14:45

标签: http jwt

我在Redis中存储了令牌的后备列表(JWT),并希望使我网站的用户能够以RESTful方式将其令牌列入黑名单。

我可以:

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

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

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

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

1 个答案:

答案 0 :(得分:4)

  

URI中的JWT是不好的做法吗?

JWT令牌在语法上是URL安全的。来自RFC 7519

  

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

但是,将JWT用作承载者令牌时,建议避免在URL中发送它们。请参见RFC 6750中的以下引用:

  

请勿在页面网址中传递承载令牌:承载令牌不应   传入页面URL(例如,作为查询字符串参数)。

     

相反,承载令牌应在HTTP消息头中传递,或   采取机密措施的邮件正文。

     

浏览器,Web服务器和其他软件可能没有足够的安全性   浏览器历史记录,Web服务器日志和其他数据中的URL   结构。如果在页面URL中传递了承载令牌,则攻击者可能   能够从历史记录数据,日志或其他不安全的东西中窃取它们   位置。


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

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

  

4.1.7. "jti" (JWT ID) Claim

     

jti(JWT ID)声明为JWT提供了唯一的标识符。     标识符值的分配方式必须确保     具有相同值的可能性很小     不小心分配给另一个数据对象;如果申请     使用多个发行者,必须防止值之间发生冲突     也由不同的发行人发行。可以使用jti号声明     以防止重播JWT。 jti值是一种情况-     敏感字符串。使用此声明是可选的。

UUID应该是unique enough,以标识没有冲突的令牌。

您也不需要将完整令牌存储在黑名单中:仅存储jti声明和您可能认为相关的其他声明(例如sub和{{ 3}})。


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