我在Redis中存储了令牌的后备列表(JWT),并希望使我网站的用户能够以RESTful方式将其令牌列入黑名单。
我可以:
/sessions/<token>
/sessions/
。第一种解决方案很简单,但是令牌存储在服务器的日志和用户浏览器的历史记录中。
第二种解决方案似乎更好,但是我不确定通过发送带正文的DELETE请求不会违反HTTP RFC的幂等性原则。
在这种情况下,最佳做法是什么?
答案 0 :(得分:4)
URI中的JWT是不好的做法吗?
JWT令牌在语法上是URL安全的。来自RFC 7519:
JWT表示为由句点(
.
)字符分隔的一系列URL安全部分。每个部分都包含一个base64url编码的值。 [...]
但是,将JWT用作承载者令牌时,建议避免在URL中发送它们。请参见RFC 6750中的以下引用:
请勿在页面网址中传递承载令牌:承载令牌不应 传入页面URL(例如,作为查询字符串参数)。
相反,承载令牌应在HTTP消息头中传递,或 采取机密措施的邮件正文。
浏览器,Web服务器和其他软件可能没有足够的安全性 浏览器历史记录,Web服务器日志和其他数据中的URL 结构。如果在页面URL中传递了承载令牌,则攻击者可能 能够从历史记录数据,日志或其他不安全的东西中窃取它们 位置。
对于问题中提到的情况,您可能不需要发送完整的令牌。您可以为令牌提供一个唯一的标识符(存储在jti
声明中),然后仅将令牌标识符发送到服务器。
查看上述RFC中如何定义jti
声明:
jti
(JWT ID)声明为JWT提供了唯一的标识符。 标识符值的分配方式必须确保 具有相同值的可能性很小 不小心分配给另一个数据对象;如果申请 使用多个发行者,必须防止值之间发生冲突 也由不同的发行人发行。可以使用jti
号声明 以防止重播JWT。jti
值是一种情况- 敏感字符串。使用此声明是可选的。
UUID应该是unique enough,以标识没有冲突的令牌。
您也不需要将完整令牌存储在黑名单中:仅存储jti
声明和您可能认为相关的其他声明(例如sub
和{{ 3}})。
exp
请求中不应包含正文。因此,您可以使用DELETE /sessions/{id}
,其中{id}
是令牌的唯一标识符。