我需要在哪里使用 JWT?

Where do I need to use JWT?

撇开 structure and protocol,我想知道 JWT 在 client/server 通信中的位置?

IMO JWT 在发行者(生成 JWT)和接收者(验证 JWT)属于不同自治方时最有用。虽然可以,但是没必要把authentication/session-cookie/token-storage/etc换成JWT

JWT 只是一种流行的基于 JSON 的安全令牌格式。

JWT 令牌并不是为了取代 session cookie 而发明的。它们主要用于保护网络 APIs(请求数据)。 Session 另一方面,cookie 用于 Web 应用程序,您在其中登录用户并在每次请求(请求页面)时自动发送 cookie。

JWT 令牌作为承载身份验证方案的一部分包含在授权 HTTP header 中。使用不记名方案身份验证的主要优点是它不易受到 CSRF 攻击,因为您的脚本需要明确地将令牌附加到请求并且可以使用 cross-domain(与 cookie 不同)。

不记名方案身份验证确实需要 HTTPS 连接,因为只要令牌有效,任何设法窃取令牌的人都可以使用它来访问 API。

OAuth2 等安全协议使用 JWT 令牌来保护 API。 OpenID Connect 使用 JWT 令牌对 Web 应用程序进行身份验证,但将令牌存储在 cookie 中。

由于 JWT 令牌由发行者(执行身份验证的服务器)进行数字签名,因此无需再次与服务器对话即可对其进行验证。数字签名允许您使用私钥对一段数据(在本例中为 JWT 令牌)进行签名,接收令牌的服务器只需要 public 密钥来验证数据的 none 是否已更改。所以 API 服务器只需要来自授权服务器的 public 密钥(不是秘密的)来信任它发布的令牌。 API 的客户端带上令牌,API 服务器无需与授权服务器对话即可对其进行验证。

JWT 到底是什么?

它是一个只有服务器才能生成的令牌,可以包含数据的有效负载。

有什么意义?

JWT 负载可以包含用户 ID 等内容,这样当客户端向您发送 JWT 时,您可以确保它是由您发出的,并且您可以看看发给谁了。

它可以用在什么地方?

通常,在 RESTful APIs, 服务器不得使用任何类型的会话。

它与使用会话有何不同?

  • 在典型的会话流程中,浏览器发送一个包含令牌的 cookie,然后在服务器[=56]匹配=] 到服务器使用 对用户进行身份验证的一些数据。

  • 在 JWT 流程中,令牌本身包含数据。服务器 解码令牌以仅对用户进行身份验证。服务器上没有存储数据。

使用 JWT 的典型身份验证流程是什么?

  • 用户凭据已发送至 /signin
  • /signin returns 一个 JWT(使用密钥签名)
  • JWT 存储在localStorage
  • 每次请求都会发送 JWT(到 API)
  • 服务器可以读取 JWT 并从中提取用户 ID

Jwt 包含 algorithm.data.signature 的编码形式,因此如果用户尝试 fiddle 使用用户 ID 或 jwt 中保存的任何其他数据,则 jwt 签名将无效。

Jwt 是经过编码的(未加密),因此任何人都可以读取 jwt 的数据组件(参见 jwt.io 示例)。因此建议不要在 jwt 中存储密码等任何秘密。

还建议在发出包含 jwt 的 Web 请求时使用加密连接 (SSL/TLS),否则攻击者可以窃取 jwt 并使用它来冒充您。