CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
GraphQL 入门/课时/安全与限流
RawBlame
课时目录12 节

GraphQL 入门

  1. 01GraphQL 是什么
  2. 02Schema 与类型
  3. 03Query 与字段选择
  4. 04Mutation
  5. 05Resolver 模型
  6. 06Spring for GraphQL
  7. 07N+1 与 DataLoader
  8. 08Apollo Client
  9. 09GraphQL vs REST 选型
  10. 10GraphiQL 与 introspection
  11. 11安全与限流
  12. 12综合练习

安全与限流

深度/复杂度限制、鉴权、勿暴露内省于生产。

25 分钟

安全与限流

GraphQL 单端点 放大攻击面:恶意 Query 可请求极深嵌套、超大列表,耗尽 CPU/数据库。REST /tracks 路径固定相对可预测;GraphQL 需 深度、复杂度、速率 多层防护。

学习目标

  • 配置查询深度与复杂度上限
  • 在 Resolver 层做鉴权,不依赖 Schema 隐藏
  • 对齐 spring-boot-essentials 安全实践

核心内容

典型威胁

# 深度攻击示例(勿对生产执行)
query Evil {
  tracks {
    lessons {
      track {
        lessons {
          track { slug }
        }
      }
    }
  }
}

循环引用类型 + 无限制深度 → 栈/查询爆炸。另:批量 alias 可放大单次请求成本。

深度与复杂度限制

Spring GraphQL 可注册 GraphQlSourceBuilderCustomizer 或使用社区 instrumentation:

// 概念:拒绝 depth > 10 或 complexity > 500 的查询
@Component
public class MaxDepthInstrumentation implements Instrumentation {
    private static final int MAX_DEPTH = 8;
    // 在 execution 前计算深度,超限抛 GraphQLException
}

网关层(Nginx、API Gateway)对 /graphql 单独限流,严于 REST 列表接口。

鉴权

@QueryMapping
@PreAuthorize("hasRole('ADMIN')")
public List<Track> tracks() { ... }
  • Query 字段级:@PreAuthorize 或自定义 DataFetcherExceptionResolver
  • 与 JWT 过滤器共用 SecurityContext(sb-jwt)
  • Introspection 仅 ADMIN 或开发 profile

字段返回 null ≠ 无权限;敏感字段应 拒绝 并记录审计。

生产清单

项建议
GraphiQL仅 dev/staging
Introspection生产关闭或需 token
持久化 Query可选,只允许白名单 operationId
日志记录 operationName、耗时、拒绝原因
错误信息不泄露 SQL/堆栈

本站 主 API REST 已走 HTTPS + JWT;实验 GraphQL 不得公网裸奔。mongodb-essentials 经 Resolver 暴露时须参数绑定,防注入。

练习

  • 列出 3 条 GraphQL 特有、REST 较少见的安全项
  • 设计规则:contentMd 仅 ADMIN Mutation 可写,匿名 Query 可读与否如何定
  • 对照 sb-security REST 过滤器链
  • 小结

    GraphQL 安全 = 限深限复杂度 + 字段鉴权 + 关内省。 下一课综合练习。

    加载本节练习…
    ← 上一课GraphiQL 与 introspection下一课 →综合练习