温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java API接口如何安全

发布时间:2026-07-17 03:33:38 来源:亿速云 阅读:94 作者:小樊 栏目:编程语言

Java API 接口的安全是一个系统性工程,需要从认证、授权、数据保护、防护攻击、代码安全等多个层面综合考虑。下面我按实战角度给你一个完整的安全方案,从“最基础”到“企业级”逐步展开。


一、接口安全的核心目标

✅ 防止未授权访问
✅ 防止数据泄露 / 篡改
✅ 防止接口被滥用(刷接口、重放攻击)
✅ 防止常见 Web 攻击
✅ 保证系统稳定性


二、身份认证(你是谁)

✅ 1. 禁止裸接口(无认证)

❌ 错误示例:

@GetMapping("/user/info")
public User info() {
    return userService.getCurrentUser();
}

✅ 正确做法:必须登录后才能访问


✅ 2. JWT(最常用)

登录返回 Token

String token = JWT.create()
    .withClaim("userId", user.getId())
    .withExpiresAt(new Date(System.currentTimeMillis() + 3600_000))
    .sign(Algorithm.HMAC256(secret));

请求头

Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...

校验 Token(过滤器)

public class JwtFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(...) {
        String token = request.getHeader("Authorization");
        if (!verifyToken(token)) {
            response.setStatus(401);
            return;
        }
        filterChain.doFilter(request, response);
    }
}

✅ 优点:无状态、适合分布式
❌ 缺点:Token 无法立即失效(可配合 Redis


✅ 3. OAuth2 / OpenID Connect(企业级)

适合:

  • 第三方登录
  • 微服务
  • SSO

常用方案:

  • Spring Security + OAuth2
  • Keycloak

三、权限控制(你能干什么)

✅ 1. 角色 / 权限模型

@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin/users")
public List<User> users() {
    return userService.list();
}

✅ 2. 接口级权限控制

@PreAuthorize("hasAuthority('user:read')")

✅ 避免“登录就能访问所有接口”


四、防止接口被滥用

✅ 1. 接口限流(非常重要)

常见算法

  • 令牌桶 ✅(推荐)
  • 漏桶
  • 固定窗口

示例(Redis + Lua)

if redis.call('incr', KEYS[1]) == 1 then
    redis.call('expire', KEYS[1], ARGV[1])
end
return redis.call('get', KEYS[1])

✅ 控制:

  • 单用户 QPS
  • IP 限流

✅ 2. 防重放攻击

方案:

  • 请求加 timestamp
  • 请求加 nonce
  • 校验时间窗口(如 5 分钟)
if (now - timestamp > 5 * 60 * 1000) {
    throw new RuntimeException("请求过期");
}

五、数据安全

✅ 1. HTTPS(必须)

❌ HTTP = 裸奔
✅ HTTPS 防止中间人攻击


✅ 2. 敏感数据不进 URL

GET /user?phone=13800000000

POST /user
Body: { "phone": "13800000000" }

✅ 3. 返回数据脱敏

user.setPhone("138****0000");

六、防止常见攻击

✅ 1. SQL 注入(最常见)

String sql = "select * from user where name = '" + name + "'";

@Select("select * from user where name = #{name}")

或使用 JPA


✅ 2. XSS(接口返回也要防)

HtmlUtils.htmlEscape(content);

✅ 3. CSRF(前后端分离一般不用)

  • 前后端分离 + Token → 天然防 CSRF
  • 传统 Web 才需要 CSRF Token

七、参数校验(第一道防线)

@PostMapping("/user")
public void create(@Valid @RequestBody UserDTO dto) {
}
public class UserDTO {
    @NotBlank
    @Size(max = 20)
    private String name;
}

✅ 防止非法数据进入业务逻辑


八、日志与审计

✅ 必须记录:

  • 登录日志
  • 敏感操作日志
  • 异常访问

❌ 禁止日志中打印:

  • 密码
  • Token
  • 身份证号

九、Spring Security 推荐配置(示例)

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .csrf().disable()
      .authorizeRequests()
      .antMatchers("/login").permitAll()
      .anyRequest().authenticated()
      .and()
      .addFilter(new JwtFilter());
}

十、企业级安全清单(面试 / 实战)

✅ HTTPS
✅ JWT / OAuth2
✅ 接口鉴权
✅ 接口限流
✅ 参数校验
✅ SQL 防注入
✅ 敏感数据加密
✅ 日志审计
✅ 异常统一处理


十一、如果你愿意,我可以继续帮你

你可以直接说:

  • ✅「给我一个 Spring Boot 完整安全示例
  • ✅「JWT + Redis 如何实现登出?」
  • ✅「接口限流怎么设计?」
  • ✅「这个接口这样写安全吗?(贴代码)」

我可以按生产级标准帮你设计。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI