개념 - 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 |