面试题答案
一键面试整体架构设计思路
- 用户身份验证:用户在登录时,系统验证其提供的凭据(如用户名和密码)。若验证成功,生成一个代表用户身份的令牌(token)返回给用户。后续用户在访问受保护资源时,需在请求头中携带此令牌。
- 不同微服务间交互安全:各微服务之间通过安全的通信协议(如 HTTPS)进行数据传输。同时,每个微服务在接收到来自其他微服务的请求时,需验证请求中携带的令牌,确保请求来源合法且具备相应权限。
- 权限管理:为每个用户或用户组分配不同的权限。当用户请求访问资源时,系统检查该用户所拥有的权限是否允许此次操作。
技术方案
- JWT(JSON Web Token):用于用户身份验证和在不同微服务间传递用户身份信息。JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
- 头部:通常包含令牌的类型(如 JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。
- 载荷:包含声明(claims),例如用户 ID、用户名、用户角色等信息。这些信息可以在微服务间共享,用于权限验证。
- 签名:用于验证令牌在传输过程中是否被篡改。签名使用密钥(secret)以及头部中指定的签名算法对头部和载荷进行签名计算得出。
- 优点:自包含,微服务无需再查询数据库来验证令牌的有效性,减少了数据库的压力,提高了验证效率;可跨域使用,适用于分布式微服务架构。
- OAuth(开放授权):可用于实现第三方登录以及在不同微服务间进行资源授权。例如,允许用户使用第三方账号(如 Google、Facebook 账号)登录系统。
- OAuth 2.0 流程:
- 资源所有者(用户):发起授权请求。
- 客户端(应用程序):请求资源所有者授权,并向授权服务器获取授权码。
- 授权服务器:验证资源所有者身份,颁发授权码。
- 客户端:使用授权码向授权服务器换取访问令牌(access token)。
- 资源服务器:验证访问令牌,向客户端提供受保护资源。
- 优点:适用于涉及第三方登录或不同服务间资源共享的场景,提供了一种安全、标准的授权机制。
- OAuth 2.0 流程:
防止常见安全漏洞
- 令牌泄露:
- 安全存储:客户端应将令牌安全存储,如使用 HTTP-only Cookie 存储令牌,防止令牌通过 XSS 攻击被窃取。对于移动端应用,可使用设备的安全存储机制(如 Android Keystore 或 iOS Keychain)。
- 令牌有效期:设置合理的令牌有效期,短期令牌(如 1 小时)可以降低令牌泄露后的风险。同时提供刷新令牌(refresh token)机制,当访问令牌过期时,客户端可以使用刷新令牌获取新的访问令牌,而无需用户重新登录。
- 传输加密:使用 HTTPS 协议传输令牌,防止在网络传输过程中被中间人截取。
- 权限绕过:
- 严格权限验证:在每个微服务接收到请求时,都要严格验证请求中用户的权限。确保只有具备相应权限的用户才能访问特定资源。例如,在用户请求获取某个文件时,不仅要验证用户身份,还要验证该用户是否有权限读取此文件。
- 最小权限原则:为用户和微服务分配最小权限。只给予用户完成其工作所需的最低权限,避免权限过度分配导致权限绕过风险。对于微服务,同样只赋予其必要的权限来与其他服务交互。
- 审计与监控:建立审计机制,记录所有的权限验证过程和访问请求。通过监控系统实时监测异常的权限访问行为,如大量的权限绕过尝试,及时发现并阻止潜在的安全威胁。