安全

安全设计实践

IMS 承载企业核心数据,安全设计至关重要。本文从接口鉴权、Web 安全、敏感数据保护等方面介绍 IMS 的安全实践。

一、接口鉴权设计

JWT 无状态令牌

/* JWT 结构 */
/* Header.Payload.Signature */

/* Header */
{
  "alg": "RS256",
  "typ": "JWT"
}

/* Payload(建议字段) */
{
  "sub": "user-123",        /* 用户ID */
  "username": "zhangsan",
  "role": "admin",
  "iat": 1716000000,    /* 签发时间 */
  "exp": 1716086400,     /* 过期时间(24小时) */
  "iss": "ims-system"      /* 签发者 */
}

Refresh Token 续期

  • Access Token:有效期短(15分钟),用于接口调用
  • Refresh Token:有效期长(7天),用于刷新 Access Token
  • Refresh Token 只在登录时返回,存放在 HttpOnly Cookie 或安全存储

二、Web 安全防护

1. SQL 注入防护

/* 使用参数化查询 */
-- 安全
SELECT * FROM users WHERE id = ?;

-- 危险(不要这样写)
SELECT * FROM users WHERE id = ' + userInput + ';

2. XSS 防护

  • 输出编码:HTML/URL/JavaScript 转义
  • 设置 Content-Type:防止 MIME sniffing
  • HTTP-only Cookie:禁止 JS 读取敏感 Cookie

3. CSRF 防护

  • 同源检测:检查 Referer 和 Origin 头
  • CSRF Token:表单隐藏字段 + 请求头携带
  • SameSite Cookie:限制 Cookie 跨站发送

三、CORS 配置

/* Spring Boot CORS 配置 */
@Configuration
class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
            .allowedOrigins("https://ims.js.cn")
            .allowedMethods("GET", "POST", "PUT", "DELETE")
            .allowedHeaders("*")
            .allowCredentials(true)
            .maxAge(3600);
    }
}

四、敏感数据保护

  • 传输加密:全站 HTTPS
  • 存储加密:密码 bcrypt 哈希,敏感字段 AES 加密
  • 日志脱敏:手机号、身份证、银行卡等打码处理
  • 接口脱敏:返回数据中敏感字段掩码处理
安全检查清单:
  • 所有 API 必须鉴权
  • 敏感操作记录审计日志
  • 密码复杂度要求(长度+特殊字符)
  • 登录失败锁定 + IP 限流
  • 定期安全扫描与渗透测试

五、总结

  • JWT + Refresh Token 是推荐的鉴权方案
  • 参数化查询防 SQL 注入
  • 输出编码防 XSS,Token 防 CSRF
  • 敏感数据加密存储,日志接口都要脱敏