当我们有客户端会话时,为啥我们需要 JWT?

Posted

技术标签:

【中文标题】当我们有客户端会话时,为啥我们需要 JWT?【英文标题】:Why do we need JWT when we have client sessions?当我们有客户端会话时,为什么我们需要 JWT? 【发布时间】:2015-07-11 21:56:00 【问题描述】:

我了解 JWT 是无状态令牌,用于存储有关客户端声明的签名信息,并通过 Authorization HTTP 标头传递给服务器。

我的问题是,当我们已经拥有客户端会话 (https://github.com/mozilla/node-client-sessions) 时,为什么还需要 JWT?客户端会话在概念上是相同的。它们是包含签名信息的 cookie,经过验证意味着 cookie 没有经过修改。此外,客户端会话存储在 cookie 中并通过 Cookie HTTP 标头传递。只是用不同的词是一样的。我错了吗?

那么,为什么 JWT 还存在呢?我可以理解,也许重点是标准化身份验证令牌的工作方式,但是没有基于会话 ID 的标准,我们相处得很好(每个实现都以自己的方式做事)。另外,为什么 JWT 不使用 cookie 作为传输手段。使用 cookie,您不需要为每个请求显式发送正确的标头(简化 Ajax 请求)。

我错过了什么吗?

【问题讨论】:

【参考方案1】:

JWT 令牌是已签名的 JSON 格式文档,用于断言有关用户(或任何委托人)的声明。如果您信任令牌的颁发者,则您信任令牌中的声明,并且可以根据此做出授权决策。

JWT 令牌通常用于调用外部 Web API。这些 API 不一定与您的网站位于同一域中,因此不能使用与您的网站相同的 cookie。 JWT 令牌用于 REST 服务,因为它们不需要存储在服务器上的任何会话信息。使用 JWT 令牌也不易受到CSRF 攻击。

【讨论】:

注意:这里的 Stormpath 人员 (stormpath.com/blog/… ) - 如果存储在 cookie 中,JWT 令牌很容易受到 CSRF 攻击。 当然,如果您将 JWT 存储在 cookie 中并使用它来验证您的 API,那么您将返回隐式验证。 JWT 令牌通常不存储在 cookie 中,而是在 Authorization HTTP 标头中作为不记名令牌发送。另见这篇文章:leastprivilege.com/2015/04/01/…

以上是关于当我们有客户端会话时,为啥我们需要 JWT?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当android在java中调用第二次Web服务时会创建新的会话

哪种 JWT 刷新策略更安全?

我需要在哪里使用 JWT?

JWT, 为啥需要刷新令牌?

微服务统一登陆认证怎么做?JWT ?

为啥机密和公共客户端需要应用程序来处理 spring/keycloak 适配器中的会话?