JWT提供了什么好处?

JWT提供了什么好处?,jwt,restful-authentication,Jwt,Restful Authentication,我已经在一个测试核心WebAPI REST项目中实现了基于JWT的安全性,它工作得很好,但我不确定我是否看到了它的好处。web说JWT很好,因为它是轻量级的,可以用来验证数据源,但在我的实现中: 客户端首先提供用户名和密码进行身份验证 如果user+pwd正常,将返回一个令牌,并且对api的每个后续调用都使用该jwt令牌(而不是用户名和密码)进行身份验证 这很好,但为什么不在每次调用api时使用用户名+密码(并跳过管理令牌的复杂过程)? 事实上,在我的例子中还有其他的复杂因素,因为我现在必须

我已经在一个测试核心WebAPI REST项目中实现了基于JWT的安全性,它工作得很好,但我不确定我是否看到了它的好处。web说JWT很好,因为它是轻量级的,可以用来验证数据源,但在我的实现中:

  • 客户端首先提供用户名和密码进行身份验证
  • 如果user+pwd正常,将返回一个令牌,并且对api的每个后续调用都使用该jwt令牌(而不是用户名和密码)进行身份验证
这很好,但为什么不在每次调用api时使用用户名+密码(并跳过管理令牌的复杂过程)? 事实上,在我的例子中还有其他的复杂因素,因为我现在必须考虑到存在于我系统之外的(代币的)到期日期


有人能解释一下我在这里遗漏了什么吗?

使用JWT的主要好处和动机之一是它允许服务器端应用程序将所有会话状态信息推送到应用程序之外。也就是说,从理论上讲,JWT实现实际上是无状态的

为了直接回答您的问题,我们可以比较每个请求中提交用户名/密码与提交JWT时的工作流

首先,JWT包含一个声明部分,该部分通常由令牌的颁发者(即服务器端应用程序)编写。其中一个字段名为
exp
,包含令牌的到期时间。JWT的一个特性是用户不可能篡改它们。这是通过校验和实现的,如果JWT的任何部分发生变化,校验和都会发生变化。总之,这意味着用户不能更改到期时间(或任何其他声明),服务器可以隐式信任此时间。当用户使用JWT提交请求时,理论上服务器只需检查
exp
,查看令牌是否仍然有效。也就是说,会话状态实际上位于应用程序之外,至少在理论上是这样

相反,当用户每次提交用户名/密码时,服务器无法仅根据该信息知道该做什么。相反,服务器必须维护会话状态本身,这在内存和性能方面都会很昂贵


实际上,JWT从来都不是完全无状态的,但是,使用良好的实现,通常可以获得非常小的内存占用,只需要缓存中的一点空间(例如Redis或类似工具).

使用JWT的主要好处和动机之一是,它允许服务器端应用程序将所有会话状态信息推送到应用程序之外。也就是说,从理论上讲,JWT实现实际上是无状态的

为了直接回答您的问题,我们可以比较每个请求中提交用户名/密码与提交JWT时的工作流

首先,JWT包含一个声明部分,该部分通常由令牌的颁发者(即服务器端应用程序)编写。其中一个字段名为
exp
,包含令牌的到期时间。JWT的一个特性是用户不可能篡改它们。这是通过校验和实现的,如果JWT的任何部分发生变化,校验和都会发生变化。总之,这意味着用户不能更改到期时间(或任何其他声明),服务器可以隐式信任此时间。当用户使用JWT提交请求时,理论上服务器只需检查
exp
,查看令牌是否仍然有效。也就是说,会话状态实际上位于应用程序之外,至少在理论上是这样

相反,当用户每次提交用户名/密码时,服务器无法仅根据该信息知道该做什么。相反,服务器必须维护会话状态本身,这在内存和性能方面都会很昂贵


实际上,JWT从来都不是完全无状态的,但是,使用良好的实现,通常可以获得非常小的内存占用,只需要缓存中的一点空间(例如Redis或类似工具)。

谢谢Tim,所以IIUC我可以在令牌中存储一堆东西,并且只使用令牌进行身份验证后调用,这将节省我每次读取数据库以查找用户和检查密码等的时间?这很好,但我肯定需要检查数据库(例如,查看用户是否已被禁用),因为令牌已生成-即使令牌过期仅一小时,我仍需要检查此项,因此我是否真的会在这里获得任何优势?您仍然会获得优势,因为您将使用缓存,而不是数据库,维护用户黑名单等。如果您正确地构建了JWT体系结构,您通常可以找到一种方法来保持黑名单相对较小(例如,用户总数的1-5%)。感谢您的输入。我需要重新审视我的设计,看看如何处理各种情况,仍然认为我最终会进行db调用…另一个复杂问题是无效性-对于任何感兴趣的人来说,这是一本很好的读物(实际上有一个回复问了一个与我非常相似的问题。)谢谢Tim,所以IIUC我可以在令牌中存储一堆东西,并且只使用令牌进行身份验证后调用,这将节省我每次读取数据库以查找用户和检查密码等的时间?这很好,但我肯定需要检查数据库(例如,查看用户是否已被禁用),因为令牌已生成-即使令牌过期仅一小时,我仍需要检查此项,因此我是否真的会在这里获得任何优势?您仍然会获得优势,因为您将使用缓存,而不是数据库,维护用户黑名单等。如果正确地构建JWT体系结构,通常可以找到一种方法来保持黑名单相对稳定