是否在服务器端存储未解码的 jwt 令牌?

Posted

技术标签:

【中文标题】是否在服务器端存储未解码的 jwt 令牌?【英文标题】:To store jwt token undecoded server-side or not? 【发布时间】:2015-11-26 09:47:26 【问题描述】:

如果这是一个愚蠢的问题,请原谅我。

正如标题所问,为每个请求在服务器端解码令牌不是很昂贵,存储和查找未解码的令牌不是更好吗? 您会将会话令牌存储在 nodejs 对象或 mongodb 中吗? Mongodb 将是另一个往返,但是您可以使用 _id 轻松查找。(如果我错了,请纠正我,我正在学习,所以建议/资源 = 非常欢迎!)

【问题讨论】:

【参考方案1】:

视情况而定

仅验证签名意味着确保令牌是使用您的密钥生成的。

存储和检查令牌意味着您可以验证令牌是由您的服务器创建的。这样,您还可以使单个令牌无效,例如如果用户丢失了他/她的手机,他/她可以使手机失效。

Redis 等键值数据库通常用于此类存储,因为它们对这些简单的 put/get 操作的性能非常非常好,每秒可为您提供数十万次操作。

【讨论】:

感谢您的回复,这已经很有帮助了,所以客户端我会将 JWT 和用户名存储在 cookie 中;它不会在客户端解码吗? 如果您愿意,您可以将 JWT 存储在 Cookie 中(请参阅 stormpath.com/blog/… )用户名通常是签名有效负载的一部分。您想将用户名存储在 JWT 本身中,例如:jwt.io 不,通常您不会在客户端对其进行解码,但是:JWT 中没有任何秘密,因为用户可以查看所有内容。请参阅上一个链接。 感谢您提供额外信息! :)【参考方案2】:

它现在存储在哪里?如果在 cookie 中,您不需要以解码形式将其存储在其他地方。访问任何像 mongo 这样的外部存储总是比从 base64 或 json 解码更昂贵。

同时,如果它根本不存储(并且仅用于获取访问权限),则不得将其存储在任何地方,因为 JWT 令牌就像密码一样。您必须避免将此类内容存储在您的数据库中。

【讨论】:

以上是关于是否在服务器端存储未解码的 jwt 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如果我们使用令牌,我们是不是需要会话

如何在前端和后端存储 JWT 刷新令牌?

JWT 令牌签名验证 javascript

如何从节点 api 中的获取请求中解码 JWT 令牌

使用 php 进行 jwt 服务器端身份验证

JWT实战