基本身份验证是基于会话的身份验证吗?为什么更推荐 Jwt?

elv*_*vis 6 basic-authentication jwt bearer-token

我正在学习 Java 和 Spring 的基本身份验证和 Jwt 身份验证,我想问您基本身份验证是否是基于会话的身份验证?

我知道在基于会话的身份验证中,当客户端登录时,sessionId 存储在客户端浏览器上的 cookie 中,之后当客户端发出另一个请求时,服务器将 sessionId 与存储在服务器内存中的数据进行比较。另外我想问一下sessionId是如何从客户端浏览器发送到服务器的?它是像令牌一样在标头中发送还是如何发送?

最后一个问题是服务器如何验证 Jwt 令牌?我知道在会话身份验证的情况下,将从客户端发送的 sessionId 与服务器内存中的数据进行比较。但是如果使用 Jwt 身份验证会发生什么?令牌与标头一起发送,我知道服务器验证了它并且服务器内存中没有数据。那么服务器如何比较token呢?任何反馈将不胜感激!谢谢你!

gus*_*to2 7

基本身份验证是否是基于会话的身份验证?
我知道在基于会话的身份验证中

那么你为什么问呢?

实际上 - 基本身份验证意味着用户凭据(用户名和密码)在授权 http 标头中发送

Authorization: Basic base64(username:password)
Run Code Online (Sandbox Code Playgroud)

服务器可能会也可能不会使用会话 cookie。会话 cookie 可以与其他身份验证方式一起使用,甚至无需任何身份验证

sessionId是如何从客户端浏览器发送到服务器的?

作为会话 cookie会话 cookie 作为 http 标头发送,浏览器将其视为会话持久的

最后一个问题是服务器如何验证 Jwt 令牌?

应签署JWT 令牌。请注意,令牌通常由 3 个部分组成

header.body.signature
Run Code Online (Sandbox Code Playgroud)

标头指定签名类型(非对称密钥或共享秘密),并且签名是经过身份验证(签名或 hmac-ed)的标头和内容。

因此,服务器必须验证颁发者、过期时间和签名。

因此服务器(服务提供商)不需要预先知道客户端的身份。服务提供商需要知道颁发者(颁发 jwt 令牌的身份验证服务)公钥或共享密钥。

经过 jwt 验证后,服务可以根据 jwt 令牌中的信息假定调用者的身份。

为什么更推荐Jwt?

这取决于用例。(凡事都有优点和缺点)

我建议在分布式和/或微服务架构中使用 jwt。该服务不需要访问凭据或对用户进行身份验证。


Maj*_*esh 7

基本身份验证中,我们需要为每个请求发送用户名和密码。
会话身份验证中,我们将在初始请求时发送用户名和密码。然后从服务器响应中我们获取存储在浏览器中的会话 ID,并将其用于请求。
令牌身份验证中,我们将在初始请求时发送用户名和密码。然后从服务器响应中我们获取令牌并将其用于请求。
希望你明白了!