前言
在微服务架构中,一个应用程序通常被划分为一系列微服务。这些微服务需要对访问者进行身份验证和身份验证。此时,应用安全管理不仅针对用户请求,还包括对其他微服务的调用。这时,安全管理已经从单一的“用户-服务”场景转变为多种“用户-服务”和“服务-服务”的场景。而对于微服务架构来说,经常会调用几十个甚至上百个微服务,那么如何为这些调用提供高效安全的身份认证和鉴权呢?而且,当这些微服务面对外部用户请求时,如何提供细粒度的安全控制方案也是一个极其重要的问题。
为了解决微服务架构的安全问题,主要有四种解决方案:
需要注意的是,这些解决方案并非彼此无关,而是密切相关、渐进式的,为开发者如何解决微服务架构下的安全问题提供了重要指导。
单点登录 (SSO) 方案
简单来说web服务器安全,单点登录就是在多个系统中,一个用户只需要登录一次,其他系统都能感知到用户已经登录。
实现单点登录方案的大致思路如下:
单点登录方案是最常见的方案,但要求每一个与用户交互的服务都必须与认证服务进行通信,这样不仅会造成重复,还会产生大量微不足道的网络流量;
() 方案
如上所述,单点登录功能主要是通过保存用户信息来实现的。但是,多个系统中可能有多个系统,但它们依赖于当前系统,因此系统A和系统B不共享。为了解决非共享问题,出现了几种解决方案:
前两种方案在单个系统故障时存在影响性能和数据丢失的问题,所以一般推荐第三种方案,即分布式会话方案。
分布式哈希映射是通过将用户会话信息存储在共享存储(如 Redis)中并以用户会话的 ID 作为键来实现的。当用户访问微服务时,会话数据可从共享存储中获得。这种方案在高可用和扩展性方面非常好,但是由于会话信息存储在共享存储中,需要一定的保护机制来保护数据安全,所以在具体实现上会具有较高的复杂度。
客户代币计划
令牌由客户端生成并由身份验证服务器签名。令牌将包含足够的信息,客户端在请求时会将令牌附加到请求中,从而为每个微服务提供用户身份数据。该方案解决了分布式会话方案的安全问题,但如何及时注销用户认证信息是个大问题。虽然可以使用短期令牌并经常与认证服务器核对,但不能完全解决。JWT(JSON Web)是非常知名的客户端令牌解决方案,它足够简单,并且对各种环境都有高度的支持。
客户端令牌与 API 网关相结合
通过在微服务架构中实现 API 网关,可以将原始客户端令牌转换为内部会话令牌。一方面可以有效隐藏微服务,另一方面可以通过API网关的统一入口实现token下线处理。
总结
随着近年来云服务应用的发展,基于令牌的认证的使用越来越广泛。对于基于令牌的认证,它通常包括以下含义:
综上所述,基于token的认证包含了被认证用户的相关信息,因此可以通过验证token来完成用户身份验证,这与之前的基于会话的认证完全不同。因此,基于令牌的这一优势,微信、支付宝、微博等纷纷推出基于令牌的认证服务,用于访问开放API和单点登录。
.0 概述
OAuth 是一种开放且安全的用户身份验证协议,它允许用户允许第三方应用程序访问用户在网站上存储的私有资源,而无需向第三方应用程序提供用户名和登录密码。授权的第三方应用程序只能在特定时间段内访问某些资源,而不是所有内容。每个授权令牌只能针对一个第三方应用程序,因此 OAuth 可以被认为是一种非常安全的用户身份验证/授权协议。
OAuth 2.0 版本于 2010 年 4 月发布,并于 2012 年 10 月正式发布为 OAuth。OAuth 2.0 简化了身份验证过程,更加注重客户端开发人员的简单性,并为 Web 应用程序、桌面应用程序、和移动应用程序。但是 OAuth 2.0 不向后兼容 OAuth 1.0。基于 OAuth 2.0 的用户认证具有以下优点。
OAuth 2.0 流程
OAuth 2.0的授权流程如下图所示:
具体步骤如下:
用户打开客户端后,客户端要求用户授权;用户同意授予客户授权;客户端使用上一步获得的授权向认证服务器申请token;认证服务器对客户端进行认证,确认无误后同意颁发Token;客户端使用token向资源服务器申请获取资源;资源服务器确认token正确,同意向客户端开放资源
从OAuth 2.0的授权流程可以看出,基于OAuth 2.0的授权涉及以下四个角色:
客户端授权方式
从前面的授权流程可以看出,客户端必须经过用户授权才能从授权服务器获取访问令牌。OAuth 2.0中定义了四种客户端授权模式,主要使用的三种是授权码模式(Code)、简化模式()和密码模式( )。
授权码模式
授权码模式是OAuth 2.0中最完善、流程最严格的授权模式。授权流程如下图所示:
具体步骤如下:
用户访问客户端,客户端引导用户到授权服务器;用户选择是否同意授权客户端;如果用户同意授权,授权服务器会重定向到客户端预先指定的地址,并附上一个授权码(Token)。); 客户端收到授权码后,附加需要重定向的页面(如果有),通过客户端后台向授权服务器申请token;授权服务器验证授权码后,向客户端发送访问令牌 Token 和更新令牌,并重定向到上一步指定的页面
简化模式
简化模式意味着访问令牌不是通过客户端的后台服务器获取的。这里的客户端通常是浏览器,客户端通过脚本语言(如 )直接完成向授权服务器申请访问令牌的操作。
具体步骤如下:
用户访问客户端时,客户端将用户引导至授权服务器,并附上认证成功或失败时需要重定向的URI;用户选择是否授权客户端;如果用户同意授权,则授权服务器根据 user-agent 验证通过后,将用户重定向到之前指定的地址,并在重定向后的地址上附加一个对应的 token 的值;浏览器将返回的信息保存在本地,然后发送给资源服务器。发出请求,但不包括访问令牌;资源服务器返回一个网页,其中通常包含一段代码,可以获取之前返回的访问令牌;浏览器执行上一步获取的脚本,获取 token;浏览器将解析后的访问令牌发送给客户端
密码模式
密码方式是指客户端通过用户提供的用户名和密码信息直接从授权服务器获取授权。在这种模式下,用户需要将自己的用户名和密码提供给客户端,但客户端不能存储这些信息。此模式仅适用于用户对客户端信任度高或属于同一产品家族的情况。
该模式的授权流程如下:
用户向客户端提供相应的用户名和密码;客户端通过用户提供的用户名和密码向授权服务器请求访问令牌;授权服务器确认后,将访问令牌返回给客户端