인프런 커뮤니티 질문&답변

박진성님의 프로필 이미지

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

재질문 합니다

해결된 질문

24.07.10 01:19 작성

·

122

·

수정됨

0

위와 같이 작성하여 요청하였을 때

이러한 에러가 나타납니다

무엇이 문제일까요?

검색해보니 전에도 질문이 올라왔는데 답변이 안달려있네요

_id 값은 받아와지는데 name과 email 등 다른 정보 요청하면 위와 같은 오류가 나타납니다

AI 답변 말고 강사님 답변 듣고싶습니다

답변 2

1

노원두님의 프로필 이미지
노원두
지식공유자

2024. 07. 16. 16:27

안녕하세요! 진성님!

결론부터 말씀드리면, 그래프큐엘 보안과 관련된 문제랍니다.
가장 일반적인 그래프큐엘 공격에 대해서 알아볼게요!

 

아래에 그래프큐엘 쿼리가 하나 있네요!
여기 amount 를 제공하기 위해서, 백엔드 개발자가 fetchPointTransactionsOfBuying 라는 API를 하나 만들어야 하겠죠?!
그리고 이 API에서는 PointTransaction(포인트거래기록) 이라는 그룹의 결과물 중 amount(금액) 이라는 데이터를 조회하게 됩니다.

query {
  fetchPointTransactionsOfBuying {
    amount // 돈 가져와!
  }
}

 

하지만, 다음과 같은 경우에는 PointTransaction(포인트거래기록) 이라는 결과를 1번 조회한 이후, 해당 기록에 연결되어 있는 useditem(중고상품) 정보를 백엔드 내부에서 다시 한 번 조회하고 이를 결합한 최종 결과물을 반환하게 된답니다!

query {
  fetchPointTransactionsOfBuying {
    amount // 돈 가져와
    
    useditem {
      price
    }
  }
}

 

다음은 어떨까요?
네! 맞아요! 누가 판매했는지까지 1번 더 조회하고 모두 결합하여 반환하게 되겠죠!

query {
  fetchPointTransactionsOfBuying {
    amount
    
    useditem {
      price
      
      seller {
      	name
      }
    }
  }
}

 

그 다음은 어떨까요?!
해당 유저가 가지고 있는 point까지 1번 더 조회하고 최종 결합하여 반환하게 되겠죠!

query {
  fetchPointTransactionsOfBuying {
    amount
    
    useditem {
      price
      
      seller {
      	name
        
        userPoint {
          amount
        }
      }
    }
  }
}

 

마지막으로 하나만 더 해보면,
해당 포인트를 가지고 있는 유저의 이메일을 조회하고 모두 결합하여 최종 결과물을 돌려주게 되겠네요!

query {
  fetchPointTransactionsOfBuying {
    amount
    
    useditem {
      price
      
      seller {
      	name
        
        userPoint {
          amount
          
          user {
            email
          }
        }
      }
    }
  }
}

 

이런식으로, 그래프큐엘은 클라이언트에서 마음대로 쿼리를 만들어서 요청할 수 있다는 장점이 있지만, 반대로 서버에서는 예측할 수 없는 깊이의 요청에 대한 문제가 있어요!
이렇게 되면, 서버가 하나의 요청을 처리하기 위해 너무 많은 조회가 이루어져야 하므로 서버가 다운되는 현상이 있을 수 있답니다!
이에따라 특정 시간(ex, 5초) 또는 특정 깊이(ex, 5단계) 와 같은 다양한 방법을 사용하여, 고의적인 공격 또는 실수적인 쿼리를 방어해야 한답니다^^

실제 실무에서는 이를 무조건 5단계 이렇게 정하지는 않기 때문에, 비즈니스 상황에 맞게 백엔드 개발자와 협의 후 진행하게 됩니다!

0

박진성님의 프로필 이미지
박진성
질문자

2024. 07. 10. 13:59

일단 구매내역에 판매자 부분만 컴포넌트를 하나 만들어서 fetchPointTransactionofBuying에 useditem._id를 프롭스로 넘겨주고 fetchUseditem에서 seller.name을 가져오게 했는데 다른 더 좋은 방법이 있다면 알려주세요