服务器如何在基于令牌的授权中将 JWT 发送给客户端?

How server sends the JWT to client in Token Based Authorization?

我正在学习 Java 和 Spring 中的身份验证以及 session 和基于令牌的身份验证之间的区别。

我知道在基于 session 的身份验证中,用户将 username/password 发送到服务器。它可以使用 html 表单或基本身份验证发送凭据。之后,服务器创建一个 session 并在 cookie header 中发送 session id,就像这样 set-cookie: sessionid,当用户发出另一个请求时,它将使用 session cookie 中的 ID header 像这样 cookie: sessionid。服务器将存储在cookie中的session id与存储在内存中的session信息进行比较,以验证用户身份并发送相应状态的响应。

我不确定基于令牌的身份验证中发生了什么。用户将以与第一种情况相同的方式将 username/password 发送到服务器:html 表单,基本身份验证等。服务器通常在本地存储中创建 JWT 并将 JWT 发送到用户浏览器.但是我不明白的是服务器如何将JWT发送给客户端?它会像这样 set-authorization: jwt 在 Header 中发送 JWT 吗?放置 jwt 的 header 的名称是什么?之后,当客户端发出新请求时,JWT 将处于这样的授权 header 中 Authorization: Bearer jwt。所以我不明白JWT是如何从服务器发送到浏览器的。任何反馈将不胜感激!谢谢!

您所说的基本身份验证在某种程度上是正确的,但不完全。在基本身份验证中,客户端几乎总是将用户名和密码发送到服务器,服务器通过这些信息对用户进行身份验证(这意味着客户端在每个请求中发送这些信息)。您所说的关于 coockie 的内容在基本身份验证中不是强制性的。客户端可以在存储中存储用户名和密码等信息,并在每次请求时将它们发送到服务器。

JWT 呢?为什么这更可靠?

在 JWT 客户端中使用身份验证路径从服务器获取令牌,因此服务器为客户端提供 API 类似 /user/authenticate 并且此路径通常由其他一些安全机制保护(它也可以是基本身份验证)所以客户端将用户的用户名和密码发送到 header 中的此路径,它将在响应 Body[=27= 中获得 JWT 令牌 ],然后在向其他资源(例如 /products)发送请求后,客户端在这些请求的 header 中发送该令牌,如下所示:

authorization: Bearer jwt

在 JWT 和其他基于令牌的身份验证机制中,客户端不应将用户的用户名和密码保存在其存储中的某个位置。他们可以(或者更确切地说应该)保存在他们的存储中的东西是他们从服务器收到的令牌,因此在每个请求中发送的东西是令牌而不是用户的用户名和密码,因此这种机制更安全.