JWT 提供什么好处?
What benefit does JWT provide?
我已经在测试核心 Web API REST 项目中实现了基于 JWT 的安全性,它工作正常,但我不确定我是否看到了这样做的好处。网上说JWT好是因为它是轻量级的,可以用来验证数据的来源但是在我的实现中:
- 客户端首先提供用户名和密码进行身份验证
- 如果 user + pwd 正常,则返回 a 令牌,并且每次对 api 的后续调用都使用该 jwt 令牌(而不是用户名和密码)进行身份验证。
这很好,但为什么不在每次调用 api 时只使用用户名 + 密码(并跳过管理令牌的复杂性)?
事实上,在我的情况下还有额外的复杂性,因为我现在必须考虑驻留在我的系统之外的(令牌的)到期日期。
有人可以解释一下我在这里缺少什么吗?
使用 JWT 的主要好处和动机之一是它允许您的服务器端应用程序将所有会话状态信息推送到应用程序外部。也就是说,在理论上的限制下,一个 JWT 实现实际上是 stateless.
为了直接回答您的问题,我们可以比较在每个请求中提交 username/password 与提交 JWT 时发生的工作流程。
首先,JWT 包含一个 claims 部分,这通常由令牌的发行者编写,即服务器端应用程序。其中一个字段称为 exp
,其中包含令牌的到期时间。 JWT 的一个 属性 是用户无法篡改它们。这是通过校验和强制执行的,如果 JWT 的任何部分发生变化,校验和就会发生变化。总之,这意味着用户无法更改到期时间(或任何其他声明),并且服务器可以隐式信任这个时间。当用户使用 JWT 提交请求时,理论上服务器要做的只是检查 exp
以查看令牌是否仍然有效。也就是说,会话状态实际上存在于应用程序之外,至少在理论上是这样。
相比之下,当用户每次提交 username/password 时,服务器无法仅根据该信息知道要做什么。相反,服务器必须自己维护会话状态,这在内存和性能方面都可能代价高昂。
在实践中,JWT 从来都不是完全无状态的,但是,使用一个好的实现,通常可以获得非常小的内存占用,只需要缓存中的一点 space(例如 Redis 或一个类似的工具)。
我已经在测试核心 Web API REST 项目中实现了基于 JWT 的安全性,它工作正常,但我不确定我是否看到了这样做的好处。网上说JWT好是因为它是轻量级的,可以用来验证数据的来源但是在我的实现中:
- 客户端首先提供用户名和密码进行身份验证
- 如果 user + pwd 正常,则返回 a 令牌,并且每次对 api 的后续调用都使用该 jwt 令牌(而不是用户名和密码)进行身份验证。
这很好,但为什么不在每次调用 api 时只使用用户名 + 密码(并跳过管理令牌的复杂性)? 事实上,在我的情况下还有额外的复杂性,因为我现在必须考虑驻留在我的系统之外的(令牌的)到期日期。
有人可以解释一下我在这里缺少什么吗?
使用 JWT 的主要好处和动机之一是它允许您的服务器端应用程序将所有会话状态信息推送到应用程序外部。也就是说,在理论上的限制下,一个 JWT 实现实际上是 stateless.
为了直接回答您的问题,我们可以比较在每个请求中提交 username/password 与提交 JWT 时发生的工作流程。
首先,JWT 包含一个 claims 部分,这通常由令牌的发行者编写,即服务器端应用程序。其中一个字段称为 exp
,其中包含令牌的到期时间。 JWT 的一个 属性 是用户无法篡改它们。这是通过校验和强制执行的,如果 JWT 的任何部分发生变化,校验和就会发生变化。总之,这意味着用户无法更改到期时间(或任何其他声明),并且服务器可以隐式信任这个时间。当用户使用 JWT 提交请求时,理论上服务器要做的只是检查 exp
以查看令牌是否仍然有效。也就是说,会话状态实际上存在于应用程序之外,至少在理论上是这样。
相比之下,当用户每次提交 username/password 时,服务器无法仅根据该信息知道要做什么。相反,服务器必须自己维护会话状态,这在内存和性能方面都可能代价高昂。
在实践中,JWT 从来都不是完全无状态的,但是,使用一个好的实现,通常可以获得非常小的内存占用,只需要缓存中的一点 space(例如 Redis 或一个类似的工具)。