Skip to content

Latest commit

 

History

History
84 lines (43 loc) · 2.91 KB

14. 几种微服务安全架构.md

File metadata and controls

84 lines (43 loc) · 2.91 KB

集中微服务安全架构

方案一

架构图如下:

  1. 首先客户端请求授权服务器,获取Access Token
  2. 认证授权之后呢,请求后端服务,进入网管之后,先到授权服务器将Access Token转换成JWT (因为Access Token没有任何信息)
  3. JWT是包含用户信息的,在网关层面通过OAuth Filter 进行JWT的校验
  4. 微服务中其他服务按照需求实现OAuth Filter来验证解析JWT(JWT是自解析的特性)

为什么有一个Access Token 和 JWT的交换操作?

为什么要在API网管做统一的JWT校验?

因为Access Token是无意义的一个字符串,把这个字符串传到后端的每个服务上,每个业务服务都要去做校验。那么每个业务服务都要请求授权服务器,这样授权服务器的压力会很大,在网关统一校验可以大大减轻授权服务器的压力。

这种方式看起来会比较繁碎,好处是JWT的校验可以集中在API网关,其他服务也可以自己按需配置OAuth Filter。

还有一个好处就是,JWT统一由授权服务器管理,这样JWT的吊销会比较简单。

方案二

这种方式在用户授权的时候就使用JWT,这样整个流程看起来比较简单,好理解。JWT的校验bu

但是这种方式没有集中式的JWT校验机制,JWT在网关和在其他服务中都是自校验的。所有,无法对恶意JWT进行统一吊销操作。

只能等待JWT自然过期。

这种方式,建议设置JWT过期时间的时候,尽量时间短一些。

方案三

这一种方式和第一种方式差不多,相当于一个优化版本。

其他环节相差不多,只不过在网关统一请求授权服务器做JWT校验的时候,做了调整。

授权服务器将Access Token 和 JWT 缓存在Redis中,这样,当网管进行校验的时候,可以不用请求授权服务器,而是去Redis中取出Access Token 和 JWT ,在网关就可以完成校验。这样分担了授权服务器的压力。

其他的后端节点也可以使用OAuth Filter来完成JWT的自校验工作。

这样JWT令牌的吊销也会比较好实现。

这种方式是很多生产环节使用的方案。

生产环境实践的一些注意或者建议

  1. 业务指标监控
    1. 登录次数
    2. 授权次数
    3. 颁发令牌次数/刷新令牌次数
    4. 活跃令牌数
    5. 校验令牌次数
    6. 吊销令牌次数
    7. 注册Client数量
  2. 接口调用性能指标
    1. 授权接口
    2. 颁发Token接口
    3. Introspection 校验Token接口
    4. Revoke 吊销令牌
  3. 缓存Cache
  4. 高可用和水平扩容