AI 코딩 보안 2026.05.10 · 조회 6555

GraphQL Introspection: AI가 만든 API 스키마가 통째로 새는 이유 [2026]

AI 도구가 만든 GraphQL 서버는 introspection 이 기본 ON 이라 전체 스키마가 공개된다. 30초 자가 점검, Apollo·Hasura·Yoga 별 차단 코드, depth limit·alias 폭주 대응까지 정리했다.

S
보안 전문 기업 SENTRIX 레드팀
해킹대회 수상 · 보안 실무 10년 · 실전 진단 경험을 바탕으로 작성합니다.
웹사이트를 운영하고 있다면
보안 헤더·인증서·공개 노출부터 무료로 점검하세요. 결과 링크는 이메일로 받습니다. 로그인 이후 권한·업무 로직은 별도 검증이 필요합니다.

다음 화면에서 이메일과 점검 권한을 확인합니다. 회원가입·카드 없이 무료 요약을 받고, 상세 리포트는 선택 구매합니다.

GraphQL Introspection 노출은 운영 환경에서 누구나 __schema 쿼리 한 번으로 전체 타입·필드·인자 목록을 받아갈 수 있는 결함이다.
REST 의 OPTIONS 응답이 "엔드포인트 몇 개"를 알려 준다면, GraphQL introspection 은 API 전체 지도, 숨겨진 admin 필드, 인자 형식까지 자동으로 알려 준다.
AI 도구가 짜 준 Apollo Server·Yoga·Hasura 코드는 기본값이 introspection ON 이라, 검토 없이 배포되면 그대로 새는 상태가 된다(출처: PortSwigger Web Security Academy "GraphQL", OWASP GraphQL Cheat Sheet).

한눈에 보는 GraphQL Introspection 노출

Introspection 이 무엇인가요?

GraphQL 의 표준 메타 쿼리(__schema, __type)로 서버의 전체 타입·필드·인자·deprecate 표시까지 받아 오는 기능입니다. GraphiQL/Apollo Studio 같은 개발 툴이 자동완성을 만드는 데 사용합니다.

노출돼도 인증으로 막으면 안전하지 않나요?

스키마는 곧 공격 표면 지도입니다. 숨긴 줄 알았던 adminPanel·internalUser 같은 필드, deprecate 안 된 옛 인자, mutation 들이 그대로 노출되어 BFLA·Mass Assignment·IDOR 공격 시작점이 됩니다.

AI 가 만든 GraphQL 서버에서 왜 자주 새나요?

Apollo Server·Yoga·Hasura·Postgraphile 모두 기본값이 introspection 활성화이며, AI 도구는 짧은 코드를 선호해 운영 분기 차단 로직을 빠뜨리는 일이 흔합니다.

introspection 만 끄면 안전한가요?

진입 단서는 줄지만 근본 차단은 아닙니다. depth limit · alias 폭주 · batch 쿼리 · 비용 제한도 같이 둬야 OWASP API Top 10 의 Unrestricted Resource Consumption 까지 막을 수 있습니다.

실제 공격 흐름, 4단계

  1. 스키마 덤프: POST /graphql 에 { __schema { types { name fields { name args { name type { name } } } } } } 전송
  2. 숨은 필드 식별: adminUser·internalSettings·secretToken 같은 필드 발견
  3. 권한 우회 시도: 일반 사용자 토큰으로 mutation 호출 → BFLA 결함 있으면 통과
  4. 2차 자원 고갈: alias 100개·depth 20 깊이 쿼리 1발로 DB 다운 유도
핵심: introspection 노출은 단독 결함이라기보다 "다른 결함 찾는 시간을 1시간에서 1분으로 줄여 주는 가속기" 다.

AI 가 만든 GraphQL 코드의 위험 패턴

서버AI 가 자주 짜는 코드위험
Apollo Server v4new ApolloServer({ schema }) 만으로 시작introspection·landingPage 운영에도 ON
GraphQL YogacreateYoga({ schema })GraphiQL UI 가 운영에서 그대로 열림
HasuraHASURA_GRAPHQL_ADMIN_SECRET 만 설정익명 역할에 introspection 허용 기본
Postgraphile옵션 미설정스키마 전체 + 워치 모드까지 노출 가능
NestJS GraphQLGraphQLModule.forRoot({ autoSchemaFile: true })playground·introspection 운영에 살아 있음

30초 자가 점검

# 1. introspection 살아 있는지 (3초)
curl -s -X POST https://your.app/graphql \
  -H "Content-Type: application/json" \
  -d '{"query":"{ __schema { types { name } } }"}' | head -c 400

# 2. GraphiQL/Playground UI 노출
curl -I https://your.app/graphql
curl -I https://your.app/playground

# 3. 인증 없이 mutation 가능한지
curl -s -X POST https://your.app/graphql \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation { __typename }"}'
위 1번에 타입 목록이 보이면 노출. 외부 노출 자산(.env·관리자 페이지·민감 파일·헤더 17종)은 CodeScan 30초 무료 스캔으로 동시에 점검.

서버 별 차단 코드, 복사용

Apollo Server v4

import { ApolloServer } from "@apollo/server";

const server = new ApolloServer({
  schema,
  introspection: process.env.NODE_ENV !== "production",
  // 운영에서는 landingPage 도 끔
  plugins: process.env.NODE_ENV === "production"
    ? [require("@apollo/server/plugin/disabled").ApolloServerPluginLandingPageDisabled()]
    : [],
});

GraphQL Yoga

import { createYoga } from "graphql-yoga";

const yoga = createYoga({
  schema,
  graphiql: process.env.NODE_ENV !== "production",  // UI 차단
  // 운영 환경에서 introspection 차단
  plugins: [
    {
      onValidate({ params, setValidationFn, validateFn }) {
        if (process.env.NODE_ENV === "production") {
          // NoSchemaIntrospectionCustomRule 같은 룰 추가
        }
      },
    },
  ],
});

Hasura

# config.yaml 또는 환경변수
HASURA_GRAPHQL_ENABLE_CONSOLE: "false"     # 운영
HASURA_GRAPHQL_DEV_MODE: "false"
HASURA_GRAPHQL_ENABLED_APIS: "graphql"      # metadata 등 차단
# 역할별 introspection 차단은 permissions 에서 명시

공통, NoSchemaIntrospectionCustomRule

import { NoSchemaIntrospectionCustomRule } from "graphql";
// validationRules 옵션에 추가하면 운영에서 __schema 쿼리 거부
validationRules: process.env.NODE_ENV === "production"
  ? [NoSchemaIntrospectionCustomRule]
  : [],

같이 막아야 할 GraphQL 자원 고갈 3종

공격예시차단
Depth attackuser{posts{user{posts{user{...}}}}} 20단graphql-depth-limit 또는 query-complexity 도입(depth 7~10)
Alias overload같은 필드를 100개 alias 로 호출alias 카운트 제한 룰(graphql-no-alias)
Batch attack한 요청에 mutation 1000개 배치요청당 operation 수 제한 + rate limit

실제 사고·참고

  • PortSwigger Web Security Academy "GraphQL", introspection 노출에서 시작해 BOLA/BFLA 로 이어지는 표준 실험 코스(출처: portswigger.net/web-security/graphql).
  • OWASP GraphQL Cheat Sheet, 운영 introspection 차단·depth/alias/batch 제한·인증 결합 권고.
  • 2026 다수 HackerOne 디스클로저, Apollo/Yoga 기본 설정 그대로 배포한 SaaS 에서 스키마 덤프 → BOLA·BFLA 로 이어진 보고가 매월 누적.

오늘 시작할 5가지 액션

  1. 위 자가 점검 1번 명령 1회 실행 → 타입 목록 보이면 즉시 차단 코드 적용
  2. 본인 스택 차단 코드 복사·배포 (운영 분기에서 introspection·UI·landingPage off)
  3. NoSchemaIntrospectionCustomRule + graphql-depth-limit + alias 제한 도입
  4. 관련 글: Mass Assignment 차단, CORS 사례, API 키 유출 점검
  5. 외부 노출은 CodeScan 30초 무료 스캔

CodeScan 이 잡아 주는 것

CodeScan 은 해킹대회 수상·레드팀 운영 경력의 보안 전문 기업 SENTRIX 가 운영하는 보안 점검 SaaS 다. GraphQL 엔드포인트의 introspection·UI 노출과 함께 .env·관리자 페이지·민감 파일·헤더 17종을 URL 한 줄로 자동 점검한다.

다음에 해야 할 한 가지

GraphQL 노출은 다른 결함을 빠르게 찾게 해 주는 가속기다. 운영에서 introspection 을 끄는 한 줄이 가장 빠른 1수다.

👉 실무자라면 본인 스택 차단 코드 1줄을 오늘 배포하고 CodeScan 30초 무료 스캔으로 외부 노출을 함께 끊어라.

👉 임원/CISO 라면 SENTRIX 30분 1:1 GraphQL 보안 진단으로 introspection·BOLA·BFLA·자원 고갈 4축 1회 점검을 권장한다.

내 사이트도 점검해보세요

URL 입력, 결과 링크는 메일로 받는 무료 점검. 회원가입·카드 불필요.

AI 코딩 보안 체크리스트 받기

AI 코딩 보안 체크리스트(PDF)를 무료로 받아보세요.

코드 자체가 걱정이라면 : 소스코드 보안 분석(SAST)이 ZIP 업로드만으로 취약점 위치와 수정 코드를 찾아드립니다.
이런 글을 계속 받아보려면 뉴스레터 구독 · RSS 피드