【问题标题】:What benefit does JWT provide?JWT 提供什么好处?
【发布时间】:2019-09-23 21:40:07
【问题描述】:

我已经在一个测试 Core Web API REST 项目中实现了基于 JWT 的安全性,它工作正常,但我不确定我是否看到了这样做的好处。网上说 JWT 很好,因为它是轻量级的,可以用来验证数据的来源,但在我的实现中:

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

这很好,但为什么不在每次调用 api 时使用用户名 + 密码(并跳过管理令牌的复杂性)? 事实上,在我的情况下还有其他复杂性,因为我现在必须考虑驻留在我的系统之外的(令牌的)到期日期。

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

【问题讨论】:

    标签: jwt restful-authentication


    【解决方案1】:

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

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

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

    相比之下,当用户每次提交用户名/密码时,服务器无法仅根据该信息知道该做什么。相反,服务器必须自己维护会话状态,这在内存和性能方面都可能代价高昂。

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

    【讨论】:

    • 谢谢蒂姆,所以 IIUC 我可以在令牌中存储一堆东西,并且只使用令牌进行身份验证后调用,这将节省我读取数据库以查找用户和检查密码等的时间。时间?这很好,但我肯定需要检查数据库(例如,查看用户是否已被禁用),因为生成了令牌 - 即使令牌到期只有一小时,我仍然需要检查这个,所以我会真的在这里获得任何优势吗?
    • 您仍然会获得优势,因为您将使用缓存而不是数据库来维护例如用户黑名单。如果您正确构建 JWT 架构,通常可以找到一种方法来保持该黑名单相对较小(例如,占用户总数的 1-5%)。
    • 感谢您的意见。我需要重新审视我的设计,看看如何处理各种情况,但我仍然认为我最终会进行 db 调用......另一个复杂的问题是失效 - 任何有兴趣的人都可以在这里阅读(实际上一个回复问了一个非常相似的我的问题。)stackoverflow.com/questions/21978658/…
    猜你喜欢
    • 2018-09-13
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2010-10-10
    相关资源
    最近更新 更多