해결된 질문
24.07.10 01:19 작성
·
122
·
수정됨
답변 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을 가져오게 했는데 다른 더 좋은 방법이 있다면 알려주세요