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

Posted

技术标签:

【中文标题】服务器如何在基于令牌的授权中将 JWT 发送给客户端?【英文标题】:How server sends the JWT to client in Token Based Authorization? 【发布时间】:2021-01-28 15:57:49 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

JWT 呢?为什么它更可靠?

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

authorization: Bearer jwt

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

【讨论】:

很好的解释!我终于了解了基于令牌的身份验证。谢谢!

以上是关于服务器如何在基于令牌的授权中将 JWT 发送给客户端?的主要内容,如果未能解决你的问题,请参考以下文章

spring boot - 假装客户端发送基本授权标头|将 jwt 令牌从一个微服务传递到另一个微服务

OAuth授权后如何向客户端发送jwt令牌?

ReactJS-在http请求的axios方法中将JWT令牌作为授权传递

在基于 Web 浏览器的客户端上存储授权(或 JWT)令牌的位置?

springboot 微服务中的自定义 JWT 令牌

使用 Postman 在标头中发送 JWT 令牌