📌 목차
- GraphQL이란?
- GraphQL 공격의 원리
- Introspection 쿼리를 이용한 내부 데이터 유출
- 주요 GraphQL 보안 취약점
- 방어 방법 및 대응 방안
🔍 GraphQL이란?
GraphQL은 Facebook이 개발한 유연하고 강력한 API 쿼리 언어로,
클라이언트가 원하는 데이터를 선택적으로 요청할 수 있는 기능을 제공한다.
그러나 잘못된 보안 설정으로 인해 공격자가 내부 데이터 구조를 유출하거나,
불필요한 API 기능을 악용하여 권한 상승, 대량 데이터 추출, 서비스 거부(DDoS) 등을 일으킬 수 있다.
⚙️ GraphQL 공격의 원리
GraphQL API는 기본적으로 Introspection 쿼리를 제공한다.
이 기능을 활성화하면 API 스키마 정보를 직접 조회할 수 있다.
공격자는 이를 활용하여 데이터 구조를 파악한 후 추가적인 공격을 시도할 수 있다.
✅ GraphQL introspection 쿼리 예제
{
__schema {
types {
name
fields {
name
}
}
}
}
🚨 결과:
- API에서 사용되는 모든 데이터 타입과 필드를 확인 가능
- 내부 데이터베이스 구조 및 숨겨진 API 엔드포인트 노출
🚨 Introspection 쿼리를 이용한 내부 데이터 유출
1️⃣ 스키마 노출을 통한 공격
📌 공격 방식
- introspection을 통해 데이터베이스 구조 확인
- 비공개 API 엔드포인트 및 민감한 데이터 테이블 조회
✅ 공격 예제
{
__schema {
types {
name
}
}
}
🚨 결과:
- User, Admin, Transaction 같은 내부 데이터 테이블 명칭 확인
2️⃣ 비공개 데이터 테이블 및 필드 확인
📌 공격 방식
- User 테이블에서 관리자 관련 필드가 있는지 확인
✅ 공격 예제
{
__type(name: "User") {
fields {
name
}
}
}
🚨 결과:
- id, username, passwordHash, email, isAdmin 같은 필드 조회 가능
3️⃣ 권한 없는 데이터 접근
📌 공격 방식
- 인증이 필요한 API 엔드포인트를 우회하여 민감한 데이터 조회
✅ 공격 예제
{
allUsers {
id
email
passwordHash
}
}
🚨 결과:
- 사용자 계정 정보가 유출될 가능성 있음
⚠️ 주요 GraphQL 보안 취약점
✅ 1. Introspection 활성화로 인해 내부 구조 노출
- 공격자는 API 구조를 쉽게 파악하여 취약점을 찾을 수 있음
✅ 2. 과도한 쿼리 요청(DoS 공격 가능성)
- GraphQL은 재귀 쿼리가 가능하여 서버 과부하를 유발할 수 있음
✅ 3. 인증 및 권한 검증 부족
- 권한 검증이 부족하면 일반 사용자가 관리자 데이터를 조회할 수 있음
✅ 4. 대량 데이터 추출(Enumeration Attack)
- 하나의 요청으로 대량 데이터를 조회하여 정보 탈취 가능
🔐 방어 방법 및 대응 방안
✅ 1. Introspection 비활성화 (운영 환경에서 제한 필요)
- introspection을 차단하여 API 스키마를 외부에 노출하지 않도록 설정
- 예제 (Apollo Server)
const server = new ApolloServer({
schema,
introspection: process.env.NODE_ENV !== "production" // 운영 환경에서 비활성화
});
✅ 2. API 인증 및 권한 검증 적용
- 모든 요청에 대해 사용자 인증 및 권한 검증 필수 적용
- 예제 (Express + GraphQL)
app.use("/graphql", (req, res, next) => {
if (!req.isAuthenticated()) {
return res.status(401).json({ error: "Unauthorized" });
}
next();
});
✅ 3. 요청 제한 및 Rate Limiting 적용
- 무제한 쿼리 요청을 방지하기 위해 쿼리 크기 제한 및 요청 속도 제한 적용
- 예제 (Express Rate Limit)
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
windowMs: 1 * 60 * 1000, // 1분
max: 100 // 분당 최대 100 요청
});
app.use("/graphql", limiter);
✅ 4. Depth Limiting 및 Query Complexity 제한 적용
- 재귀적인 쿼리 요청을 방지하여 DoS 공격 차단
- 예제 (GraphQL Shield 적용)
import { rule, shield } from "graphql-shield";
const isAdmin = rule()(async (parent, args, ctx) => ctx.user.role === "admin");
const permissions = shield({
Query: {
sensitiveData: isAdmin
}
});
✅ 5. 웹 애플리케이션 방화벽(WAF) 사용
- GraphQL API에 대한 비정상적인 요청을 탐지하고 차단
✅ 6. 정기적인 보안 테스트 수행
- Burp Suite, OWASP GraphQL Security Scanner를 사용하여 보안 점검
📌 해시태그
#GraphQL #웹보안 #API보안 #정보유출 #보안취약점 #Introspection #데이터보안 #GraphQLSecurity
'보안' 카테고리의 다른 글
🚨 Mass Assignment 공격: 숨겨진 필드를 조작하여 관리자 권한 탈취 🔓 (0) | 2025.02.20 |
---|---|
🔓 BOLA 공격(Broken Object Level Authorization): 인증 취약점을 악용한 데이터 탈취 🚨 (0) | 2025.02.20 |
🚨 CORS Misconfiguration Exploitation: 취약한 CORS 설정을 악용한 데이터 탈취 공격 🔓 (1) | 2025.02.20 |
🛑 Host Header Injection: 서버 측 요청 위조(SSRF) 및 보안 우회 공격 🚨 (0) | 2025.02.19 |
🛑 HTTP Parameter Pollution (HPP): 동일한 요청 파라미터를 활용한 보안 우회 공격 🚨 (0) | 2025.02.19 |