面试题答案
一键面试设计安全的微代理层
- 身份验证
- 基于令牌的认证:使用JWT(JSON Web Token),客户端在登录后从认证服务获取JWT。微代理验证JWT的签名和有效期,确保请求来自合法客户端。例如在Spring Cloud Gateway中,可以利用Filter来解析和验证JWT。
- OAuth 2.0:适用于更复杂的场景,通过授权服务器进行集中式身份验证。微代理作为资源服务器,验证请求中的OAuth 2.0令牌。
- 授权
- 基于角色的访问控制(RBAC):定义不同角色及其对应的权限。在微代理层,根据客户端的角色决定是否允许访问特定资源。可以将角色信息存储在JWT或数据库中,微代理查询相关信息进行授权判断。
- 基于属性的访问控制(ABAC):根据请求者、资源和环境的属性来进行授权决策。例如,根据客户端的IP地址、请求时间等属性决定是否允许访问。
- 防止常见网络攻击的策略
- 防止DDoS攻击:使用限流策略,如令牌桶算法或漏桶算法,限制单个IP或客户端的请求频率。在Spring Cloud Gateway中可通过RateLimiter实现。
- 防止SQL注入:对所有输入参数进行严格的验证和过滤,避免恶意用户构造SQL语句。微代理可对请求参数进行检查,拒绝不符合规范的请求。
- 防止XSS攻击:对输出内容进行转义,避免恶意脚本注入。微代理可在响应返回客户端前对内容进行处理。
确保微代理的可扩展性
- 关键技术点
- 负载均衡:采用客户端负载均衡(如Ribbon)或服务端负载均衡(如Nginx),将请求均匀分配到多个微服务实例上。在Spring Cloud中,Ribbon与Eureka配合可实现客户端负载均衡。
- 缓存:引入缓存机制,如Redis,缓存频繁访问的数据。微代理可以缓存一些静态资源或认证信息,减少后端服务的压力。
- 异步处理:使用异步消息队列(如Kafka、RabbitMQ)处理一些非即时性任务,避免请求长时间阻塞。微代理可将部分请求放入队列,由后端服务异步处理。
- 设计原则
- 单一职责原则:每个微代理模块应只负责一项特定功能,如身份验证、授权或负载均衡,便于维护和扩展。
- 可插拔性:设计微代理时应考虑功能的可插拔性,方便根据业务需求添加或移除某些功能模块。
- 弹性设计:微代理应具备弹性,能够根据流量变化自动调整资源。例如使用容器化技术(如Docker、Kubernetes)实现自动扩缩容。