Day916.基于JWT令牌的安全认证架构 -SpringBoot与K8s云原生微服务实践

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day916.基于JWT令牌的安全认证架构 -SpringBoot与K8s云原生微服务实践相关的知识,希望对你有一定的参考价值。

基于JWT令牌的安全认证架构

Hi,我是阿昌,今天学习记录的是关于基于JWT令牌的安全认证架构的内容。

之前的微服务阶段2.5阶段,其实是比较重量级的安全认证架构。

用户的登录状态集中存储在authService鉴权服务系统上面,客户端每次请求都需要去authService上集中认证鉴权校验,这种架构适合对安全要求严格的微服务场景,比方电商等情况。

但也有缺陷,就是当网址访问请求量较大时,就对authService的处理压力就较大要求,可能会成为性能和扩展性的瓶颈,要严格的HA和监控,投入成本就很高。

但如果应用不需要严格的安全集中型校验,那2.5阶段这套就会显的很笨重。


一、2.6阶段-JWT+网关

那在上面这种情况下就可以采用基于JWT令牌这种无状态的的安全认证架构。

下面给出了一个基于JWT + 网关的的2.6的架构。

与2.5阶段最主要的区别在于:

  1. authService在第二步所颁布的令牌是JWT令牌,而非是Token令牌,JWT令牌与上面的Token透明令牌不同,他是包含数据信息的。
  2. 因为JWT令牌是自包含数据的,所以在第四步和第五部,网关可以自己去解析JWT令牌,而非需要去请求authService去认证授权校验,网关就可以从JWT令牌取出标识信息,就可以向后面的微服务中传递用户信息。

JWT令牌有点类似与之前的1.0阶段的无状态session,针对微服务的延伸发展出来的技术,这种架构针对authService鉴权服务做出了优化和改进,大大减少了authService鉴权服务的压力,增加了可扩展的架构,适用于安全架构不会要求这么强烈强的系统应用架构。


二、JWT令牌架构

JWT 代表(JSON Web Token),是一种用于安全地传输信息的开放标准。

JWT是一种基于JSON的令牌,它包含了一些声明和数据,用于在客户端和服务器之间传输信息。

通常情况下,JWT用于身份验证和授权目的。

JWT令牌由三个部分组成:头部、有效载荷和签名。头部包含令牌的元数据,例如令牌类型和签名算法。

有效载荷包含令牌的声明和数据,例如用户ID和过期时间。签名使用私钥对令牌进行加密,以确保令牌在传输过程中没有被篡改。

JWT令牌的主要优点是它们是轻量级且易于使用的,因此非常适合在分布式系统中进行身份验证和授权。

由于JWT令牌是自包含的,因此不需要使用数据库或其他持久存储来验证令牌。只需解析JWT令牌并验证签名即可。

总的来说,JWT令牌是一种简单、安全和灵活的身份验证和授权解决方案,可以在不同的应用程序和服务之间使用。

组装公式


三、JWT的登录认证流程

JWT的登录认证流程有两种:HMAC流程 和 RSA流程

1、HMAC流程

authService 和 ResourceService需要一开始协商后一个用于解签的secret

  1. 用户向authService发出登录认证请求
  2. authService校验登录密码,通过后就根据某种HMAC算法和secret生成签名生成JWT令牌,并发送响应会客户端, 客户端收到JWT令牌后一般会在本地进行存储
  3. 客户端收到JWT令牌后就会向携带JWT令牌调用ResourceService的API请求
  4. 资源服务器ResourceService接受到客户端请求来的JWT令牌的API请求,就取出JWT令牌,采用和authService一开始协商好的secret对传客户端传来的JWT令牌进行校验解签,通过就执行后续业务逻辑,不通过就拒绝请求,校验过程中可以根据JWT令牌中的数据进行校验,最后响应客户端。

authService和ResourceService一开始协商好的secret要求严格存储,不允许泄露,如果泄露的话,整个流程就不再安全,黑客就可以利用secret伪造JWT令牌。


2、RSA流程

RSA流程基本跟上面的HMAC流程相似,但主要的区别在于authService采用的私钥进行加密,而ResourceService采用公钥进行解签。

RSA流程总体会比上面的HMAC流程更加的安全,因为authService保存的私钥泄露的概率会比ResourceService的私钥泄露概率要小。

公钥本身就可以进行公开,拿到公钥的意义就是对JWT令牌进行解签校验,不能进行篡改和加签。


四、JWT令牌的优劣

JWT (JSON Web Token) 是一种在网络应用之间传递信息的安全方式,通过使用 JSON 对象作为负载将信息存储在令牌中,并使用签名来保证令牌的完整性和验证身份。

1、优点:

  • 无需保存会话状态,降低了authService鉴权服务器负载,因为 JWT 本身包含了所有必要的信息,可以在多个应用之间轻松传递。
  • 可以轻松添加额外的用户信息,如用户 ID、角色等,因为 JWT 使用 JSON 对象作为负载。
  • 可以使用签名来保证令牌的完整性和验证身份,从而减少了恶意攻击的风险。

2、缺点:

  • 无法撤销令牌,一旦令牌被签发,除非到期时间到了,否则无法失效,即使用户已经注销了账号。
  • 由于令牌中包含了所有必要的信息,如果令牌被窃取或泄露,攻击者可以获得所有这些信息。
  • 如果使用不当,可能会导致安全问题,例如使用不安全的算法或密钥长度,或者在客户端存储令牌而不是在服务器端进行验证。
  • 令牌携带数据过多时,会增加网络数据传输成本

以上是关于Day916.基于JWT令牌的安全认证架构 -SpringBoot与K8s云原生微服务实践的主要内容,如果未能解决你的问题,请参考以下文章

如何在微服务中添加基于 Jwt 令牌的安全性

在基于 Web 的应用程序中,哪里可以正确、安全地存储 JWT 令牌?

如何在 api 网关架构中获取 JWT 令牌

JWT 访问令牌:矛盾?

验证微服务架构的每个服务中的访问令牌(JWT)

这种基于 JWT 的身份验证方法安全吗?