API 安全设计最佳实践

系列导读:本篇将深入讲解 API 安全设计的核心方法与最佳实践。


文章目录

    • 目录
    • [一、API 安全威胁](#一、API 安全威胁)
      • [1.1 常见威胁](#1.1 常见威胁)
      • [1.2 OWASP API Top 10](#1.2 OWASP API Top 10)
    • 二、认证与授权
      • [2.1 OAuth2 认证](#2.1 OAuth2 认证)
      • [2.2 JWT Token](#2.2 JWT Token)
      • [2.3 RBAC 权限控制](#2.3 RBAC 权限控制)
    • [三、API 网关安全](#三、API 网关安全)
      • [3.1 Kong 网关配置](#3.1 Kong 网关配置)
      • [3.2 限流配置](#3.2 限流配置)
    • 四、安全最佳实践
      • [4.1 输入验证](#4.1 输入验证)
      • [4.2 敏感数据保护](#4.2 敏感数据保护)
      • [4.3 安全响应头](#4.3 安全响应头)
    • 总结

目录


一、API 安全威胁

1.1 常见威胁

威胁 说明
注入攻击 SQL、命令注入
越权访问 水平/垂直越权
数据泄露 敏感信息暴露
DDoS 攻击 拒绝服务
中间人攻击 数据窃取

1.2 OWASP API Top 10

复制代码
1. 对象级别授权失效
2. 身份认证失效
3. 对象属性级别授权失效
4. 资源消耗无限制
5. 功能级别授权失效
6. 批量操作不受限
7. 注入攻击
8. 安全配置错误
9. 库组件版本过旧
10. 日志与监控不足

二、认证与授权

2.1 OAuth2 认证

java 复制代码
// OAuth2 配置
@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
    
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
            .withClient("client-app")
            .secret("{bcrypt}$2a$10$...")
            .authorizedGrantTypes("authorization_code", "refresh_token")
            .scopes("read", "write")
            .redirectUris("https://app.example.com/callback");
    }
}

2.2 JWT Token

java 复制代码
// JWT 生成
public String generateToken(User user) {
    return Jwts.builder()
        .setSubject(user.getId())
        .claim("roles", user.getRoles())
        .setIssuedAt(new Date())
        .setExpiration(new Date(System.currentTimeMillis() + 3600000))
        .signWith(SignatureAlgorithm.HS256, secretKey)
        .compact();
}

// JWT 验证
public Claims parseToken(String token) {
    return Jwts.parser()
        .setSigningKey(secretKey)
        .parseClaimsJws(token)
        .getBody();
}

2.3 RBAC 权限控制

java 复制代码
// 权限注解
@PreAuthorize("hasRole('ADMIN')")
@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) {
    userService.delete(id);
}

// 动态权限
@PreAuthorize("@permissionChecker.check(#id)")
@GetMapping("/orders/{id}")
public Order getOrder(@PathVariable Long id) {
    return orderService.getById(id);
}

三、API 网关安全

3.1 Kong 网关配置

yaml 复制代码
# Kong 插件配置
_format_version: "3.0"

services:
- name: order-service
  url: http://order-service:8080
  plugins:
  - name: jwt
    config:
      secret_is_base64: false
  - name: rate-limiting
    config:
      minute: 100
      policy: local
  - name: request-size-limiting
    config:
      allowed_payload_size: 10

3.2 限流配置

java 复制代码
// 限流注解
@RateLimiter(value = 10, timeout = 1, timeUnit = TimeUnit.SECONDS)
@GetMapping("/api/orders")
public List<Order> listOrders() {
    return orderService.list();
}

四、安全最佳实践

4.1 输入验证

java 复制代码
// 参数校验
@PostMapping("/users")
public User createUser(@Valid @RequestBody UserDTO dto) {
    return userService.create(dto);
}

// DTO 校验规则
@Data
public class UserDTO {
    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 20, message = "用户名长度3-20")
    private String username;
    
    @Email(message = "邮箱格式不正确")
    private String email;
    
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    private String phone;
}

4.2 敏感数据保护

java 复制代码
// 数据脱敏
@JsonSerialize(using = PhoneMaskSerializer.class)
private String phone;  // 138****8888

// 加密存储
@Encrypt
private String idCard;

// 日志脱敏
log.info("用户登录: phone={}", MaskUtils.maskPhone(phone));

4.3 安全响应头

java 复制代码
@Configuration
public class SecurityHeaderConfig {
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.headers()
            .contentSecurityPolicy("default-src 'self'")
            .and()
            .xssProtection()
            .and()
            .frameOptions().deny()
            .httpStrictTransportSecurity();
        return http.build();
    }
}

总结

✅ API 安全威胁 :OWASP Top 10

✅ 认证与授权 :OAuth2、JWT、RBAC

✅ API 网关安全 :Kong、限流

✅ 安全最佳实践:输入验证、数据保护、安全头

下篇预告 :身份认证与授权架构设计


作者 :刘~浪地球
系列 :安全架构(二)
更新时间:2026-04-20

相关推荐
xiaoye-duck9 分钟前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(上):初始化和全量响应
开发语言·网络·c++·语言模型
Gauss松鼠会12 分钟前
GaussDB 中 gsql 与 DBeaver(JDBC)客户端工具查询时间不一致:原因、排查与处理
运维·服务器·数据库·sql·gaussdb·经验总结
谙弆悕博士33 分钟前
debian快速换源
linux·运维·windows·debian·下载·换源·网络问题
Yang961137 分钟前
鼎讯信通热剥钳实测:大芯径光纤如何做到无损剥除
网络
.道阻且长.42 分钟前
Linux基本开发工具:编译器gcc/g++
linux·运维·服务器·职场和发展
Decay__7 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
贞明电子9 小时前
工业三色报警灯怎么接入项目系统?开关量与RS485控制应用指南
运维·网络·微信公众平台·贞明电子
HideF9 小时前
Linux
linux·服务器·网络
万联WANFLOW9 小时前
海外网络故障怎么排查?Cloudflare 三季度断网报告解读与 mtr 实战
运维·网络·故障分析
sbjdhjd10 小时前
网工进阶笔记:H3CSE 园区网全栈技术与协议汇总
网络·笔记·云计算·ssh·网络工程·vlan·aaa