개념노트

GraphQL

1231. 2024. 12. 29. 21:05

개념 - GraphQL은 API를 위한 쿼리 언어

 

일반 REST API(각각 다른 URL로 여러 번 요청)

GET /users/123        # 사용자 정보요청
GET /users/123/posts  # 사용자의 게시물요청

 

GraphQL(한번의 요청으로 원하는 모든 데이터 가져오기 가능)

query {
  user(id: "1231") {
    name
    email
    posts {
      title
      content
    }
  }
}

 

GraphQL에는 여러가지 컴포넌트가 존재하지만

클라이언트가 서버로 요청을 보낼 때 사용하는 주요 작업에대해 정리

 

Query 요청 (데이터 조회):

POST /graphql
{
  "query": "query GetUser($userId: ID!) { user(id: $userId) { name } }",
  "variables": {
    "userId": "1231"
  }
}

 

Mutation 요청 (데이터 변경):

POST /graphql
{
  "query": "mutation CreateUser($name: String!, $email: String!) { createUser(name: $name, email: $email) { id name } }",
  "variables": {
    "name": "1231",
    "email": "1231@1231.me"
  }
}

 

Fragment 요청 (재사용 가능한 필드 세트)

# Fragment 정의
fragment UserBasic on User {
  id
  name
  email
}

# Fragment 사용
query {
  user(id: "1231") {
    ...UserBasic
    posts {
      title
    }
  }
}

 

※ Variables는 동적 값을 전달하는 방식으로 사용

 

취약점확인을 위해

Schema( API의 전체적인 구조) 수집

# 스키마 정보 수집
query IntrospectionQuery {
  __schema {
    types {
      name
      fields {
        name
        type {
          name
        }
      }
    }
  }
}

또는 https://graphql-kit.com/graphql-voyager/ 해당 링크에 접속하여 스키마 관련 연결정보를 확인필요

 

예)

Query 취약점 확인

# 권한 검증 없이 데이터 접근 시도
query {
  user(id: "admin_id") {
    email
    password
    secretData
  }
}

Mutation 취약점 확인

mutation {
  createUser(
    email: "' OR '1'='1", # SQL 인젝션 시도
    role: "ADMIN"         # 권한 상승 시도
  ) {
    id
  }
}

Fragment 취약점

# 민감한 정보에 접근하려는 Fragment 정의
# 여기서 AdminInfo는 Fragment의 이름이며 임의로 지정한 이름

fragment AdminInfo on User {
  password    # 비밀번호 탈취 시도
  secretKey   # 보안 키 탈취 시도
  adminToken  # 관리자 토큰 탈취 시도
}

# Fragment를 사용한 쿼리
query {
  user(id: "123") {
    ...AdminInfo  # Fragment를 통해 민감 정보 접근 시도
  }
}

 

'개념노트' 카테고리의 다른 글

안드로이드 (컴포넌트 아키텍처)  (0) 2024.12.29
안드로이드 (기본구조)  (0) 2024.12.29
역방향 프록시(Reverse Proxy)  (1) 2024.12.15
HTTP Header  (1) 2024.12.15
Web  (0) 2024.12.15