JWT提供什么好处?

时间:2019-05-06 09:09:23

标签: jwt restful-authentication

我已经在一个测试Core Web API REST项目中实现了基于JWT的安全性,它工作正常,但是我不确定是否能从中受益。网络上说JWT很不错,因为它重量轻,可以用来验证数据源,但是在我的实现中:

  • 客户端首先提供用户名和密码进行身份验证
  • 如果用户+ pwd正常,则会返回一个令牌,随后对api的每次调用都使用该jwt令牌(而不是用户名和密码)进行身份验证。

这很好,但是为什么不在每次调用api时都使用用户名和密码(而跳过管理令牌的麻烦)呢? 实际上,就我而言,这还带来了其他麻烦,因为我现在必须考虑驻留在系统之外的(令牌的)到期日期。

有人可以解释我在这里缺少什么吗?

1 个答案:

答案 0 :(得分:0)

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

要直接回答您的问题,我们可以比较工作流中在每次请求中提交用户名/密码与提交JWT时发生的情况。

首先,JWT包含一个 claims 部分,该部分通常由令牌的发行方(即服务器端应用程序)编写。字段之一称为exp,其中包含令牌的到期时间。 JWT的一个特性是用户无法篡改它们。这是通过校验和强制执行的,如果JWT的任何部分发生更改,校验和都会更改。两者合计,这意味着用户无法更改到期时间(或任何其他声明),并且服务器可以隐式信任此时间。从理论上讲,当用户通过JWT提交请求时,服务器要做的只是检查exp,以查看令牌是否仍然有效。也就是说,至少在理论上,会话状态实际上位于应用程序之外。

相反,当用户每次提交用户名/密码时,服务器无法仅基于该信息就知道要做什么。相反,服务器必须自己维护会话状态,这在内存和性能方面都可能是昂贵的。

在实践中,JWT永远不会是完全无状态的,但是,使用良好的实现,通常可以使内存占用空间非常小,仅在缓存中仅需要一点空间(例如Redis或类似的工具)。 / p>