JWT 签名令牌过期即使在代码中更改后浏览器应用程序中也不会更改

JWT signed token expiresIn not changing in browser application even after changed in the code

原代码:

const token = jwt.sign({ _id: user._id }, process.env.JWT_SECRET, { expiresIn: '1d' });
        
res.cookie('token', token, { expiresIn: '1d' });

这成功了。令牌在创建后整整一天后过期。

变化:

const token = jwt.sign({ _id: user._id }, process.env.JWT_SECRET, { expiresIn: '1m' });
        
res.cookie('token', token, { expiresIn: '1m' });

我注销了,重启了服务器,还是没有任何变化!令牌仍将自己设置为一天后过期。我正在学习一门课程,当课程讲师在他的代码中进行此更改时,它按预期工作。令牌在一分钟后过期。

我什至尝试过:

const token = jwt.sign({ _id: user._id }, process.env.JWT_SECRET, { expiresIn: '10' });
        
res.cookie('token', token, { expiresIn: '10' });

期望令牌在十秒或十毫秒后过期(我不确定默认单位是什么)但结果仍然相同。令牌仍设置为一天后过期。

这是缓存的东西吗?我对缓存的了解几乎为零,它是什么,它是如何工作的,但我很难想象对此的解释是在 NodeJS 编码本身的常规范围内。如果是的话,那将是非常简单的。 jwt 模块或我的应用程序在整个应用程序中处理 cookie 或令牌的方式没有其他“配置”。

我包含了 next.js 标签,因为我在 next.js 应用程序中使用它(虽然我怀疑这是否相关,但我当然可能是错的)。

我明白了。不要责怪任何对潜在解决方案发表评论的人,因为缺少我没有意识到的信息。

这是一个 NextJS 应用程序,前端有单独的逻辑来设置此 cookie 的到期日期。此到期日期设置为一天,我没有更改它(我忘记它存在)。一旦我更改它,更改就会反映在浏览器中。

我想您可以为已签名的 jwt 设置一个与前端的 cookie 过期日期不同的过期日期。这是多余的,也是不可取的。我将不得不寻找一个不同的长期解决方案。我认为这对现实世界的应用程序没有好处,因为它很难理解正在发生的事情。

今天早上早些时候,在我弄明白之前,10 毫秒的 jwt 过期终于开始起作用了,但只在后端起作用。我收到一个后端错误,说我的 jwt 会话已过期,这是意料之中的。在我的前端页面上向后端发出的请求失败,因为它没有经过身份验证,所以我得到了预期的行为,但不是我期望的那样。

编辑: 我相信我已经找到了我困惑的症结所在。下面的代码是旨在在响应中设置 cookie 的后端代码,但是因为我们使用单独的逻辑在前端设置 cookie,所以我相信这段代码实际上没有做任何事情。我查看了前端代码接收签名的 jwt 令牌,但没有引用 res.cookie 的地方。我相信这一定只是教师认为必要的额外代码行。我今天 运行 没时间了,但我会尝试 运行 没有这行代码的应用程序,看看我是否能获得相同的功能。

res.cookie('token', token, { expiresIn: '1d' });

对此:

I guess you can set an expiration date for the signed jwt that is separate from the cookie expiration date on the front end. It's redundant and not desirable. I'll have to look for a different long-term solution. I wouldn't find this to be good for real world applications as it makes it difficult to understand what is happening.

我开始明白,这是一个额外的安全层,值得拥有。问题不在于后端的 jwt 逻辑。这里的问题很简单,我有额外的逻辑在两个不同的地方在浏览器中设置 cookie,并调整了应用程序和浏览器未使用的逻辑。