写点什么

微服务系统中的认证策略

  • 2016 年 12 月 12 日
  • 本文字数:1306 字

    阅读完需:约 4 分钟

软件安全本身就是个很复杂的问题,由于微服务系统中的每个服务都要处理安全问题,所以在微服务场景下会更复杂。David Borsos 在最近的伦敦微服务大会上作了相关内容的演讲,并评估了四种面向微服务系统的身份验证方案。

在传统的单体架构中,单个服务保存所有的用户数据,可以校验用户,并在认证成功后创建 HTTP 会话。在微服务架构中,用户是在和服务集合交互,每个服务都有可能需要知道请求的用户是谁。一种朴素的解决方案是在微服务系统中应用与单体系统中相同的模式,但是问题就在于如何让所有的服务访问用户的数据。解决这个问题大致两个思路:若使用共享用户数据库时,更新数据库表会成为一个难题,因为所有服务必须同时升级以便能够对接修改后的表结构;若将相同的数据分发给所有服务时,当某个用户已经被认证,如何让每个服务知晓这个状态是一个问题。

Borsos 指出,单点登录(SSO)方案可能看起来是一个好主意,但这意味着每个面向用户的服务都必须与认证服务交互,这会产生大量非常琐碎的网络流量,同时这个方案实现起来也相当复杂 。 在其他方面,选择 SSO 方案安全性会很好,用户登录状态是不透明的,可防止攻击者从状态中推断任何有用的信息。

分布式会话方案,原理主要是将关于用户认证的信息存储在共享存储中,且通常由用户会话作为 key 来实现的简单分布式哈希映射。 当用户访问微服务时,用户数据可以从共享存储中获取。 该解决方案的另一个优点是用户登录状态是不透明的。 当使用分布式数据库时,它也是一个高度可用且可扩展的解决方案。 这种方案的缺点在于共享存储需要一定保护机制,因此需要通过安全链接来访问,这时解决方案的实现就通常具有相当高的复杂性了。

客户端令牌方案, 此令牌在客户端生成,由身份验证服务进行签名,并且必须包含足够的信息,以便可以在所有微服务中建立用户身份。 令牌会附加到每个请求上,为微服务提供用户身份验证。 这种解决方案的安全性相对较好,但身份验证注销是一个大问题, 缓解这种情况的方法可以使用短期令牌和频繁检查认证服务等。 对于客户端令牌的编码方案,Borsos 更喜欢使用 JSON Web Tokens(JWT),它足够简单且库支持程度也比较好。

客户端令牌与 API 网关结合,这个方案意味着所有请求都通过网关,从而有效地隐藏了微服务。 在请求时,网关将原始用户令牌转换为内部会话 ID 令牌。 在这种情况下,注销就不是问题,因为网关可以在注销时撤销用户的令牌。 这种方案虽然库支持程度比较好,但实现起来还是可能很复杂。

Borsos 建议使用客户端令牌(使用 JWT)和 API 网关结合的方案,因为这个方案通常使用起来比较容易,且性能也不错。 SSO 方案虽然能满足需求,但他认为还是应该避免使用。若分布式会话方案所需要的相关技术已经应用在你的场景上,那么这个方案也是比较有趣的。他同时强调在选择解决方案时应着重考虑注销的重要性。

明年的伦敦微服务大会定于 2017 年 11 月 6 日 -7 日举行。

查看英文原文 Authentication Strategies in Microservices Systems


感谢张卫滨对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016 年 12 月 12 日 18:003574

评论

发布
暂无评论
发现更多内容

【Flutter 专题】01 图解 Windows 环境下安装配置环境

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 12月日更

面试官:Java 线程如何启动的?

华为云开发者社区

Java 线程 JVM 时序图 Java 线程

前端开发面试之框架react的相关问题及答案

@零度

大前端 React

老铁久等了,尚硅谷Vue大型电商项目:尚品汇教程发布!

编程江湖

Vue 大前端

12.7直播预告|「淼懂·观测云实践学堂」全新栏目上线!带你走进观测云的精彩世界!

观测云

可观测性 直播 可观测

【LeetCode】 连续字符Java题解

HQ数字卡

算法 LeetCode 12月日更

大厂算法面试之leetcode精讲14.排序算法

全栈潇晨

LeetCode 算法面试

Git进阶(一):git 管理文件之后文件颜色的含义

No Silver Bullet

git 学习 git revert 12月日更

使用HTML,CSS 和 JS 创建 Chrome 扩展程序

海拥(haiyong.site)

json chrome扩展 28天写作 签约计划第二季 12月日更

Groovy热更新Java实践

FunTester

Java 测试开发 热更新 Groovy FunTester

你知道什么时候用Vue计算属性吗?

华为云开发者社区

Vue 字符串 逻辑 模板 计算属性

大数据开发开源平台之Spark SQL的基础

@零度

大数据 spark SQL

Rust 元宇宙 10 —— 接入和协议

Miracle

rust 元宇宙

react源码解析7.Fiber架构

zz1998

React React Hooks React Diff

在 Flutter 中如何使用TabBar和TabBarView创建选项卡布局【Flutter 专题 13】

坚果

flutter 28天写作 签约计划第二季 12月日更

你该不会拿 CSAPP 垫显示器吧

Zilliz

2021年马上要结束了,这5款Java框架你都了解吗

@零度

Java spring

【Pandas学习笔记02】-数据处理高阶用法

恒生LIGHT云社区

Python 数据分析 pandas 数据可视化

如何在 Vue 中使用 防抖 和 节流

编程江湖

业务请求量膨胀的扩容技术实践

博文视点Broadview

一文带你读懂数字管家

HarmonyOS开发者社区

HarmonyOS OpenHarmony

动态限流下分布式调出限流设计与实现

X

sentinel 分布式限流 集群限流

技术管理哲学随笔:面对大量事业部需求与产研团队资源之间的矛盾

dclar

团队管理 管理 CTO

尚硅谷Vue大型电商项目:尚品汇教程发布!

@零度

Vue 大前端

AI 收藏夹 Vol.003:AI 能听懂阴阳怪气吗?

Zilliz

神经网络 AI 计算机视觉

模块5-课后作业

21°Char

使用 HTML、CSS、JavaScript 创建一个简单的井字游戏

海拥(haiyong.site)

大前端 js 28天写作 签约计划第二季 12月日更

华为云企业级Redis评测第一期:稳定性与扩容表现

华为云开发者社区

redis 测评 GaussDB(for Redis) NoSQL数据库 企业级Redis

react源码解析8.render阶段

zz1998

React React Hooks

Java难吗?Java基础知识最强总结(2021版)

XiaoLin_Java

Java

技术驱动未来,保险极客凭借数字团险领跑

科技热闻

微服务系统中的认证策略_语言 & 开发_Jan Stenberg_InfoQ精选文章