authentication - 使用 JWT 进行身份验证的最佳实践
问题描述
我已经阅读了很多与 JWT(JSON Web 令牌)用于身份验证相关的文章并且非常困惑,因为每个人对什么是使用它们的安全方式都有不同的看法。说安全是指处理注销和密码更改。此外,哪些数据不应该保存在 JWT 有效负载中。
我的问题 - 使用 JWT 进行身份验证时是否有任何行业标准,如果有,它们是什么?如果不是,在 JWT 中保存密码哈希和注销日期以处理注销和密码更改是否安全,如果不是,还有什么替代方法?
解决方案
使用 JWT 进行身份验证时是否有任何行业标准,如果有,它们是什么?
首先,访问令牌(作为任何类型的敏感信息)只能通过安全连接发送。
据我了解,您希望能够在发生某种事件时撤销令牌。在这种情况下,您应该考虑在服务器的某个位置跟踪令牌。
为此,您可以为每个令牌分配一个唯一标识符,然后将该标识符存储在您的服务器中。验证令牌时,除了检查签名和到期日期外,还必须检查令牌标识符是否列入白名单。
并且,要为每个令牌分配唯一标识符,您可以使用jti
声明:
(
jti
JWT ID) 声明为 JWT 提供唯一标识符。标识符值的分配方式必须确保相同的值被意外分配给不同的数据对象的可能性可以忽略不计;如果应用程序使用多个发行者,则必须防止不同发行者产生的值之间的冲突。该jti
声明可用于防止 JWT 被重放。该jti
值是区分大小写的字符串。使用此声明是可选的。
如果不是,在 JWT 中保存密码哈希和注销日期以处理注销和密码更改是否安全,如果不是,还有什么替代方法?
如果您的 JWT 是 JWS,则不应将任何被视为敏感的信息放入有效负载中。
推荐阅读
- javascript - href 属性在 iOS 13 上的 Safari 中不起作用
- r - 查找出现次数相等的年份
- javascript - 服务人员和客户沟通。获取事件完成
- python - 如何将多个 python 数据帧转储/写入到保留其标题行的文本文件中?
- java - 计算数组java的偶数,奇数和完美数?
- c++ - 这里的问题是使用右值而不是左值创建的引用吗?
- neo4j - 使用 Spring Data Neo4J 提高关系性能
- java - 如何从 Firebase 实时数据库的推送方法中删除自动生成的项目
- spring - 使用 CommandLineRunner 和 @PostConstruct 准备数据
- python-3.x - 为逻辑回归“预测变量(所需目标)创建逆数据的最佳方法