Background

  • 传统单体架构服务,比如 C/S 架构,使用 cookie-session 的方式进行身份验证,流程如下所示

    image-20240502222446929

    (图片来源)

    HTTP/HTTPS 协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据 HTTP/HTTPS 协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为 cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证

    HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密和认证保护数据传输的安全协议,它确保了客户端和服务器之间的通信的机密性和完整性。虽然HTTPS提供了数据传输的安全性,但它并不直接解决身份验证和授权的问题。

    HTTPS主要解决的是以下两个问题:

    1. 保证通信的机密性:HTTPS使用加密技术对通信进行加密,以防止第三方窃听和篡改数据。这确保了数据在传输过程中的安全性。
    2. 服务器身份认证:HTTPS使用SSL/TLS证书来验证服务器的身份。客户端会检查服务器的证书,确保其合法性和可信度。这样客户端就能确保它正在与预期的服务器建立安全连接,而不是受到中间人攻击。

    虽然HTTPS提供了通信的安全性和服务器身份认证,但它并没有提供一种机制来进行用户身份验证和授权。用户身份验证通常需要在用户登录时验证其凭据(如用户名和密码),而授权涉及确定用户是否具有执行特定操作或访问特定资源的权限。

  • 这样做存在的问题是
    • Server 端需要记录 session,当 Client 增多后,Server 端需要记录的信息变多,内存开销增多
    • 不利于 Server 横向扩展,用户认证之后,服务端使用 session 保存认证信息,那么要取到认证信息,只能访问同一台服务器,才能拿到授权的资源。这样在分布式应用上,就需要实现session共享机制,不方便集群应用
    • 因为 session 是基于 cookie 来进行用户识别的,cookie 如果被截获,用户就会很容易受到跨站请求伪造的攻击

Json Web Token

What is ?

JWT(JSON Web Token)是一种用于身份验证和授权的开放标准。它被设计用于在网络应用、移动应用和服务之间安全地传输声明。JWT 提供了一种紧凑且自包含的方式来传输信息,这些信息被称为声明(claims)。JWT 通常由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature)

JWT 的主要目的是解决身份验证和授权的问题。在传统的身份验证方式中,服务器需要在每个请求中验证用户的身份,这通常需要查询数据库或其他存储系统。这种方式会增加服务器的负载和响应时间,并且不适合分布式系统。JWT 的出现解决了这些问题,它将用户的身份信息编码为一个安全的令牌,并在每个请求中将该令牌传递给服务器。服务器只需验证令牌的有效性,而无需查询数据库,从而提高了系统的性能和可扩展性。

image-20240505152255437

(图片来源)

How works

JWT 的工作原理如下:

  1. 用户登录时,服务器验证用户的身份信息,并生成一个 JWT。
  2. 服务器将 JWT 发送给客户端,客户端通常将其存储在本地,如浏览器的 localStorage 或移动应用的本地存储。
  3. 客户端在后续的请求中将 JWT 包含在请求的头部或其他位置中发送给服务器。
  4. 服务器在接收到请求时,解析 JWT 并验证其签名,以确保令牌的完整性和真实性。
  5. 服务器可以使用 JWT 中的声明信息来验证用户的身份和权限,并根据需要进行授权操作。

image-20240505152255437

(图片来源)

Ref