使用 JWT 进行身份验证的最佳实践

Posted

技术标签:

【中文标题】使用 JWT 进行身份验证的最佳实践【英文标题】:Best practises using JWT for authentication 【发布时间】:2020-06-14 21:40:28 【问题描述】:

我已经阅读了很多与 JWT(JSON Web 令牌)用于身份验证相关的文章,并且感到非常困惑,因为每个人对什么是使用它们的安全方式都有不同的看法。说安全是指处理注销和密码更改。还有,哪些数据不应该保存在 JWT 有效负载中。

我的问题 - 使用 JWT 进行身份验证时是否有任何行业标准,如果有,它们是什么?如果不是,在 JWT 中保存密码哈希和注销日期以处理注销和密码更改是否安全,如果不是,还有哪些替代方法?

【问题讨论】:

【参考方案1】:

在使用 JWT 进行身份验证时是否有任何行业标准,如果有,它们是什么?

首先,访问令牌(作为任何类型的敏感信息)只能通过安全连接发送。

据我了解,您希望能够在发生某种事件时撤销令牌。在这种情况下,您应该考虑在服务器的某个位置跟踪令牌。

要实现它,您可以为每个令牌分配一个唯一标识符,然后将该标识符存储在您的服务器中。验证令牌时,除了检查签名和过期日期外,还必须检查令牌标识符是否列入白名单。

并且,要为每个令牌分配一个唯一标识符,您可以使用 jti 声明:

4.1.7. "jti" (JWT ID) Claim

jti(JWT ID)声明为 JWT 提供了唯一标识符。标识符值的分配方式必须确保相同的值被意外分配给不同的数据对象的概率可以忽略不计;如果应用程序使用多个发行者,也必须防止不同发行者产生的值之间的冲突。 jti 声明可用于防止 JWT 被重放。 jti 值是区分大小写的字符串。使用此声明是可选的。


如果不是,在 JWT 中保存密码哈希和注销日期以处理注销和密码更改是否安全,如果不是,还有哪些替代方法?

如果您的 JWT 是 JWS,则不应将任何被视为敏感的信息放入有效负载中。

【讨论】:

以上是关于使用 JWT 进行身份验证的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

通过安全令牌进行 API 身份验证的最佳实践(Node.js 服务器和移动应用程序)

在 nodejs 中使用 JWT 刷新令牌的最佳实践

同时从移动设备和 Web 刷新 JWT 令牌的最佳实践

在 SPA 中刷新 JWT 的最佳实践?

网关架构设计最佳实践

移动设备的最佳实践身份验证