JWT spec条提到了jti的一项声明,据称该声明可以用作防止重播攻击的临时措施:

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

我的问题是,我将如何实施这一点?我是否需要存储以前使用的JTI,并在每次请求时发布新的JWT?如果是这样,这不是违背了JWTs的目的吗?为什么要使用JWT,而不是将随机生成的会话ID存储在数据库中?

我的REST API有一个Mongo数据库,我不反对添加Redis实例.有比JWT更好的身份验证选项吗?我主要不想在客户机上存储密码,这会消除HTTP身份验证的选项,然而,随着我对JWT的深入了解,我开始觉得定制令牌实现或不同的标准可能更适合我的需要.是否有支持令牌撤销和循环令牌的基于令牌的身份验证的node/express包?

如果您有任何建议,我将不胜感激.

推荐答案

实际上,存储所有发布的JWT ID会 destruct 使用JWT的无状态性.然而,JWT ID的目的是能够撤销之前发布的JWT.这最容易通过黑名单而不是白名单来实现.如果你已经包含了"exp"声明(你应该),那么你最终可以清理黑名单上的JWT,因为它们会自然过期.当然,您可以同时实施其他撤销选项(例如,基于"iat"和"aud"的组合撤销一个客户端的所有令牌).

Node.js相关问答推荐

如果非SQL函数在事务内部运行失败,PG-Promise事务会回滚吗?

Puppeteer 的 BrowserFetcher 发生了什么?

FHIR 服务器:尽管 JSON 格式正确,但在 POST 请求中接收未定义请求正文

遇到 - TypeError:try 使用 Express(Node.js) 从 JSON 文件访问数据时无法读取未定义的属性(读取帖子)

在全局对象上声明的函数

几个 lambda 共有的函数

如何从mongoose 对象内嵌套的数组中提取数组元素?

如果我在父文件夹中运行,子进程生成不起作用

在父模式中设置默认值.

如何在 node /快速服务器上配置 mongoDB

ResponseError:键空间ks1不存在

NestJS 共享模块的问题

为什么需要在 NodeJS 应用程序中创建服务器?

Socket IOFlutter 未连接

这到底是什么';拒绝未经授权';对我来说是什么意思?

Node.JS 中的基本 HTTP 身份验证?

代理(如提琴手)可以与 Node.js 的 ClientRequest 一起使用吗

如何判断MongoDB本机nodejs驱动程序中是否存在集合?

Nodejs将字符串转换为UTF-8

mongoose 填充与对象嵌套