GraphQL은 기존 REST API의 한계를 뛰어넘어 API 개발에 대한 현대적이고 효율적인 접근 방식으로 등장했습니다. REST는 웹의 초창기부터 널리 사용되어 왔지만, GraphQL은 개발자에게 새로운 관점과 더 큰 제어력을 제공합니다. GraphQL을 사용하면 개발자는 클라이언트가 필요한 데이터를 정확하게 요청할 수 있도록 강력한 형식의 스키마를 정의할 수 있습니다. GraphQL은 과도한 데이터 페칭이나 부족한 데이터 페칭을 제거하여 성능을 최적화하고 복잡한 데이터 쿼리 및 데이터 모델링 요구 사항이 있는 최신의 대화형 웹 애플리케이션을 쉽게 만들 수 있도록 해줍니다.
하지만 GraphQL에도 몇 가지 과제가 있다는 점은 인정합니다. 이 논문에서는 GraphQL 도입과 관련된 보안 문제와 학습 곡선에 대한 통찰력을 제공합니다. GraphQL을 성공적으로 구현하여 얻은 이점을 설명하는 유명 기업의 실제 사례 연구를 살펴보겠습니다.
더 나아가 GraphQL에 대한 우리의 조사 결과를 소개하고, 우리의 경험과 발견을 공유합니다. GraphQL에 대한 간략한 소개를 살펴보고, 이를 REST와 비교하며, GraphQL이 해결하는 과제에 대해 자세히 알아보겠습니다. 또한, 조직이 정보에 입각한 결정을 내리는 데 도움이 되는 보안 고려사항도 논의됩니다. 우리의 연구는 GraphQL의 혁신적인 잠재력을 보여줍니다. GraphQL을 통해 테스트 관리 제품군 소프트웨어 아키텍처를 어떻게 단순화했는지 보여드리며, 그 결과 JSON 객체에 숨겨진 노출된 데이터 양이 300% 이상 증가했습니다.
결론적으로, REST API 인프라의 확장, 최적화 또는 운영에 어려움을 겪고 있는 기업은 GraphQL을 실행 가능한 솔루션으로 고려할 것을 강력히 권장합니다. 당사의 통찰력은 GraphQL 여정을 시작하는 사람들에게 실질적인 지침을 제공하여, 그들이 GraphQL의 이점을 활용하고 효과적으로 과제를 극복할 수 있도록 돕습니다.
REST API의 한계로 인해 새로운 API 기술 접근 방식에 대한 수요가 늘어나고 있습니다.
REST(Representational State Transfer) 기반 접근 방식은 원래 웹 API를 설계하기 위한 일련의 아키텍처 원칙으로 제안되었습니다. REST는 2000년대와 2010년대에 걸쳐 CORBA(Common Object Request Broker Architecture)와 같은 다른 기술보다 서비스 지향 아키텍처(SOA)를 구현하는 더 나은 수단으로 Web 2.0이 등장하면서 발전했습니다.
모바일 채택으로 인해 고객 수가 늘어나면서 정확한 데이터에 대한 수요도 늘어났습니다. 그러나 REST 기반 API는 종종 데이터를 너무 많이 가져오거나 적게 가져오는 결과를 초래하여 비효율성을 초래했습니다. Facebook과 같은 앱에서 볼 수 있는 이러한 접근 방식은 단일 업데이트를 위해 수많은 REST API 호출이 필요한 경우가 많았고, 이로 인해 네트워크 트래픽이 증가하고 성능과 사용자 경험이 저하되었습니다.
GraphQL은 강력한 형식의 스키마와 보다 효율적인 데이터 쿼리 방법을 제공함으로써 이러한 한계를 해결하기 위해 특별히 설계되었습니다. 따라서 네트워크 대역폭을 최적화하기 위해 특정 데이터가 필요한 사용 사례에 적합합니다. 또한 GraphQL은 스키마를 조사할 수 있는 기능을 통해 더 나은 문서화와 도구를 제공합니다. REST를 더 표준화된 방식으로 구현했다면 어느 정도 경쟁이 있었을 수 있지만, GraphQL의 고유한 기능과 이점은 분산되고 데이터 집약적인 최신 애플리케이션 아키텍처에 적합한 매력적인 선택입니다.
그림 1은 REST와 GraphQL이 구현되는 방식 간의 위상적 차이점을 보여줍니다. REST API 대 GraphQL 에서 언급했듯이 "GraphQL과 REST API의 주요 차이점은 GraphQL이 쿼리 언어인 반면 REST는 네트워크 기반 소프트웨어에 대한 아키텍처 개념이라는 것입니다."
Meta는 모바일 앱의 성능과 유연성을 개선하기 위해 2012년에 GraphQL을 만들었습니다(2015년 에 오픈 소스로 공개 ). GraphQL이 출시되기 전에는 Meta 모바일 앱이 RESTful API와 네이티브 코드를 조합하여 구축되었기 때문에 앱이 지원해야 하는 다양한 기기, 화면 크기, 네트워크 조건을 처리하기 어려웠습니다.
그들이 직면한 가장 큰 과제 중 하나는 RESTful API가 종종 잘못된 양의 데이터를 반환한다는 것이었습니다. 때로는 너무 많고 때로는 너무 적습니다. API가 모바일 앱에 필요하지 않은 대량의 데이터를 반환하면 로딩 시간이 느려지고 성능이 저하됩니다. API가 반환하는 데이터가 너무 적으면 모바일 앱은 필요한 모든 데이터를 가져오기 위해 여러 엔드포인트에 여러 번 요청을 해야 했고, 이로 인해 프로세스에 지연과 복잡성이 추가되었습니다.
Meta는 모든 앱이 단 한 번의 요청으로 필요한 데이터만 요청할 수 있도록 GraphQL을 개발했습니다. 이를 통해 모바일 앱과 백엔드 서비스 간의 데이터 전송을 최적화하여 로드 시간을 단축하고 성능을 향상시킬 수 있었습니다. 게다가 GraphQL의 강력한 타이핑과 자체 문서화 기능 덕분에 개발자가 API를 더 쉽게 이해하고 사용할 수 있었습니다.
GraphQL은 데이터 검색 및 조작을 위한 강력한 기능을 제공하여 기존 API 접근 방식에 비해 상당한 이점을 제공합니다.
GraphQL은 API에서 쿼리할 수 있는 데이터의 구조와 유형을 정의하는 데 있어 명확성과 정확성을 보장하는 강력한 형식의 스키마를 제공합니다. 책, 저자, 출판사가 포함된 도서관에 대한 API가 있다고 가정해 보겠습니다.
a) GraphQL 스키마 : GraphQL에서 강력한 형식의 스키마는 아래 그림 2와 같습니다.
GraphQL의 강력한 형식의 스키마는 입력 검증을 활성화하고, 데이터의 과도한 페치와 부족한 페치를 방지하고, 명확한 문서화 및 도구 지원을 제공하고, 버전 제어를 용이하게 하고, 권한 부여 및 액세스 제어를 지원함으로써 보안 관련 이점을 제공합니다. 이러한 기능은 일반적인 취약점으로 인한 위험을 줄이고 적절한 데이터 처리 및 액세스 관리를 보장하여 API 보안을 강화합니다.
표시된 예(그림 2)에서 스키마는 책, 저자, 출판사의 데이터 유형과 이들 간의 관계를 정의합니다. 스키마는 강력한 형식화되어 있습니다. 즉, 각 필드에는 특정 데이터 유형이 있으며 클라이언트는 스키마를 쉽게 조사하여 사용 가능한 필드와 해당 유형을 알아낼 수 있습니다.
b) REST 스키마 : REST에서 스키마 정의는 아래 그림 3에 표시된 것처럼 느슨하게 입력됩니다.
이러한 엔드포인트는 책, 저자, 출판사를 나타내는 JSON 객체를 반환하지만 스키마 자체는 명시적으로 정의되어 있지 않으며 프로그래머의 기술과 해석에 맡겨집니다. 클라이언트는 데이터 구조를 이해하기 위해 문서에 의존해야 합니다.
GraphQL은 REST보다 나은 대안이라는 차원을 넘어 발전했으며, 더 나은 데이터 전략을 고려하는 기업에게 선호되는 접근 방식이 될 잠재력을 가지고 있습니다. REST의 한계를 해결하는 것 외에도 GraphQL이 API 설계에 대한 새로운 접근 방식으로 발전한 데에는 여러 가지 이유가 있습니다. 표(그림 4)는 GraphQL이 REST에 비해 갖는 장점을 보여주지만, GraphQL은 REST 자체의 문제 식별에 대한 대응이라기보다는 인터넷과 다양한 애플리케이션의 발전에 대한 대응으로 생각하는 것이 가장 좋습니다.
속성 | 그래프HQL | 나머지 |
---|---|---|
유연한 데이터 모델링 |
GraphQL을 사용하면 개발자는 변화하는 요구 사항에 맞게 API를 쉽게 정의하고 발전시킬 수 있습니다. 클라이언트는 쿼리 언어를 사용하여 필요한 데이터를 정확하게 지정할 수 있으므로 보다 유연하고 효율적인 데이터 검색 프로세스가 가능합니다. |
서버는 일반적으로 미리 정의된 데이터 구조를 반환하는 고정된 엔드포인트를 정의합니다. 클라이언트는 응답의 모양과 구조를 제한적으로 제어할 수 있으며, 이로 인해 데이터를 너무 많이 가져오거나 적게 가져오는 경우가 종종 발생합니다. REST는 GraphQL이 제공하는 데이터 검색 및 구성에 대한 세부적인 제어가 부족합니다. |
일괄 처리된 쿼리 |
GraphQL을 사용하면 여러 쿼리를 단일 요청으로 결합할 수 있으며, 이를 통해 클라이언트와 서버 간의 왕복 횟수를 크게 줄이고 성능을 향상시킬 수 있습니다. |
REST에는 여러 쿼리를 단일 요청으로 일괄 처리하는 기본 제공 메커니즘이 없습니다. 각 REST 요청은 일반적으로 단일 리소스 또는 엔드포인트에 해당합니다. 일부 REST 프레임워크 또는 확장 기능은 여러 요청을 함께 묶는 방법을 제공할 수 있지만 GraphQL과 같이 기본적이거나 표준화되지 않았습니다. |
입력된 질의 및 응답 |
클라이언트는 필요한 정확한 데이터를 지정할 수 있고, 서버는 요청된 데이터만 응답할 수 있어 과도한 페치나 부족한 페치를 줄일 수 있습니다. 또한 GraphQL은 강력한 형식을 갖추고 있어 오류를 방지하고 툴링 지원을 개선하는 데 도움이 됩니다. |
질의와 응답에는 본질적으로 입력이 강제되지 않습니다. 데이터의 구조와 형식은 일반적으로 서버에서 미리 정의하고, 클라이언트는 이에 따라 데이터를 해석하고 처리해야 합니다. 이로 인해 유형 안전성이 떨어질 수 있습니다. |
프런트엔드 프레임워크와의 통합 |
GraphQL은 React 및 Vue와 같은 프런트엔드 프레임워크와 잘 작동하도록 설계되어 현대적이고 대화형 웹 애플리케이션을 보다 쉽게 구축할 수 있습니다. GraphQL은 원활한 통합을 위한 전용 라이브러리와 툴을 갖추고 있습니다. |
REST는 프런트엔드 프레임워크와 함께 사용할 수 있지만, 통합에는 더 많은 수동 작업과 맞춤형 구현이 필요할 수 있습니다. 타사 라이브러리는 있지만 REST는 React나 Vue와 같은 특정 프런트엔드 프레임워크와 통합하는 표준화된 방법을 제공하지 않습니다. |
그래프 기반 쿼리 |
GraphQL을 사용하면 단일 요청에서 여러 리소스와 관계에 걸친 복잡한 쿼리를 실행할 수 있으므로 복잡한 사용자 인터페이스를 구축하는 데 필요한 데이터를 더 쉽게 얻을 수 있습니다. |
REST는 일반적으로 리소스 중심 접근 방식을 따르며, 각 엔드포인트는 특정 리소스나 엔터티를 나타냅니다. 이는 단일 요청에서 여러 리소스나 관계에 걸쳐 데이터를 쿼리하는 메커니즘을 본질적으로 제공하지 않습니다. |
성능 |
GraphQL은 필요한 데이터만 정확하게 요청할 수 있는 기능을 통해 데이터 검색 효율성을 높이고 성능을 향상시킬 수 있습니다. |
REST API는 클라이언트가 응답 구조를 제한적으로 제어할 수 있으므로 데이터를 과도하게 가져오거나 가져오지 못하는 문제가 발생할 수 있습니다. 이는 특히 API가 과도하거나 불필요한 데이터를 반환하는 경우 성능에 영향을 미칠 수 있습니다. |
개발자 생산성 |
GraphQL의 자체 문서화 특성과 내성 기능은 광범위한 문서화의 필요성을 줄이고 데이터 모델에 대한 이해를 높여줍니다. 강력한 유형의 스키마와 쿼리 검증은 공유된 이해를 증진하고 오류를 조기에 포착합니다. GraphQL은 직관적인 쿼리 언어와 쉬운 학습 곡선을 갖추고 있어 개발팀 내에서 더 나은 온보딩과 지식 전달이 가능합니다. |
클라이언트와 서버 간에 표준화된 계약이 없기 때문에 부족 간 지식이 부족해집니다. REST API는 일반적으로 다양한 구현에 따라 달라지는 비공식적인 문서나 규칙에 의존합니다. 공통된 이해가 부족하면 팀 내에 불일치와 지식 격차가 발생합니다. 이로 인해 오랫동안 팀에 있었던 개발자는 비즈니스 문제에 집중하기보다는 팀원을 교육하는 데 귀중한 시간을 할애해야 하는 부담을 가지게 됩니다. 문서화를 위해 개인에게 의존하다 보니 팀원 간의 지식이 단편화되고, 모든 팀원이 API의 기능과 데이터 구조를 종합적으로 이해하기 어려워졌습니다. |
API 버전 관리 |
버전 관리와 관련하여 GraphQL의 본질적인 장점은 제거될 필드를 더 이상 사용하지 않도록 설정할 수 있는 기능으로, 이를 통해 클라이언트 측 개발자에게 조정할 시간을 제공합니다. REST API와 유사한 버전 관리가 여전히 가능합니다. |
필드를 더 이상 사용하지 않는 것은 REST에서 본래 사용할 수 없는 기능입니다. 올바른 버전의 API를 사용하는지 확인하는 일은 클라이언트 측 개발자의 몫입니다. |
GraphQL은 기존 RESTful API에 비해 많은 이점을 제공하지만, 사용하는 데에는 몇 가지 어려움도 있습니다. 일반적인 과제는 다음과 같습니다.
GraphQL은 API 구축부터 모바일 앱 구동까지 광범위한 애플리케이션에 사용할 수 있는 강력한 도구입니다. 다양한 사용 패턴에 적합하도록 유연성과 데이터 소스를 통합하는 기능이 뛰어납니다.
GraphQL이 필요한 데에는 명확한 동기가 있습니다. 이는 다음 산업 배포 사례에서 확인할 수 있습니다.
Netflix는 GraphQL 실무자라면 꼭 읽어야 할 2부로 구성된 블로그 시리즈를 통해 2020년의 GraphQL 여정을 요약했습니다 . 그들이 발표한 사례 연구는 Studio Edge 시스템 이 스튜디오 API를 가져와 GraphQL로 재구성한 것이었습니다. Netflix의 Studio API는 Netflix 콘텐츠 팀에서 TV 프로그램과 영화의 제작, 후반 작업, 배포를 관리하고 모니터링하는 데 사용됩니다. API는 타이틀, 인재 정보 등에 대한 메타데이터를 포함한 방대한 양의 데이터에 대한 액세스를 제공합니다.
처음에 Studio API는 JSON 형식으로 데이터를 반환하는 엔드포인트를 갖춘 기존의 RESTful 아키텍처를 사용하여 구축되었습니다. 그러나 API가 성장하고 이에 액세스하는 클라이언트 수가 늘어나면서 더 효율적인 솔루션이 필요하다는 점이 분명해졌습니다.
Netflix는 Studio API에 대한 잠재적 솔루션으로 GraphQL을 탐색하기 시작했습니다. 그들은 Studio API에 대한 큐레이트된 그래프를 구축하는 것으로 시작했습니다. 그들은 네트워크 사용량을 줄이고, 데이터 액세스를 간소화하고, 클라이언트가 필요한 데이터만 요청할 수 있도록 하여 성능을 개선하는 기능을 포함한 몇 가지 주요 이점을 파악했습니다.
Netflix는 Studio API에 GraphQL을 도입하면서 몇 가지 고유한 과제에 직면했습니다. 특히 스키마의 복잡성을 관리하고 클라이언트가 권한이 있는 데이터에만 액세스할 수 있도록 하는 것이 과제였습니다.
이러한 과제를 해결하기 위해 Netflix는 "Netflix GraphQL Federation"이라는 맞춤 솔루션을 개발했습니다. 이 솔루션은 Apollo Federation 사양을 사용하여 Studio API 스키마를 더 작고 관리하기 쉬운 부분으로 분할합니다. 또한 그들은 클라이언트가 스키마의 특정 부분에만 접근하도록 제한할 수 있는 권한과 접근 제어를 관리하는 시스템을 구현했습니다.
블로그에서는 또한 Monolith에서 Federated Gateway로의 API 아키텍처 진화 과정을 공개했습니다. 그림 5는 해당 블로그의 그림을 각색한 것입니다.
우리는 업계에 널리 퍼져 있지만 공식화되지 않은 또 다른 접근 방식이 있다고 생각합니다.
그림 5에 표시된 것처럼 게이트웨이 집계 계층과 페더레이션 게이트웨이를 결합할 수 있습니다.
각 기어 아이콘은 본질적으로 실시간(심지어 트랜잭션 기준으로도)으로 에지에서 인스턴스화될 수 있는 일시적이고 연합된 GraphQL 인스턴스(게이트웨이 액터라고도 함)를 나타냅니다. 즉, 클라이언트와 토폴로지적으로 가깝고 보안 API 전송을 통해 마이크로서비스에 연결됩니다. 이러한 조합은 본질적으로 게이트웨이 집계 계층이나 연방 계층을 분산 게이트웨이 행위자로 대체하여 두 가지 기능의 장점을 모두 결합합니다. 그림 7에서 보이는 것과 같이 이 분산 GraphQL 게이트웨이 액터 아키텍처를 호출합니다.
PayPal은 GraphQL 여정을 시작했습니다.2018 그들이 체크아웃 앱의 일부로 만들었을 때. REST에 대한 그들의 주요 우려는 Meta와 비슷하게, 디자인 원칙이 웹 및 모바일 앱과 그 사용자에게 최적화되지 않았다는 것입니다. 클라이언트 애플리케이션은 클라이언트에서 서버로 여러 번 왕복을 했는데, 데이터를 가져오는 데 약 700ms가 걸렸습니다. 이로 인해 렌더링 시간이 느려지고 사용자 불만이 늘어나고 전환율이 낮아졌습니다. PayPal은 체크아웃 앱의 경우 사용자 인터페이스(UI) 개발자가 UI를 구축하는 데 소요되는 시간이 3분의 1도 안 되고, 나머지 시간은 데이터를 가져오고 처리하는 방법을 알아내는 데 사용된다는 사실을 발견했습니다.
PayPal 엔지니어링 팀이 고려한 다른 기술로는 오케스트레이션 API와 대량 REST가 있습니다. 오케스트레이션 API를 빌드하면 과도한 페칭이 발생하고 클라이언트가 서버에 결합됩니다. PayPal은 이러한 접근 방식을 사용하면 시간이 지남에 따라 API가 무거워지고, 서투르게 되며, 여러 가지 목적을 달성할 수 있다는 결론을 내렸습니다. 그들의 대량 REST 실험 역시 실패로 끝났습니다. 엔지니어링 팀은 오케스트레이션 API를 조정할 필요가 없게 되었지만, 클라이언트는 API의 작동 방식을 자세히 알고 있어야 했습니다.
PayPal이 신제품을 구축하기 위해 GraphQL을 사용한 첫 번째 경험은 PayPal Checkout을 앱에 통합하기 위한 모바일 SDK였습니다. 엔지니어링 팀은 GraphQL을 평가한 지 일주일 만에 이를 새로운 제품에 사용하기로 결정했습니다. API가 준비되지 않았음에도 불구하고, 그들은 PayPal에 대한 전문 지식이 거의 없이도 예정보다 일찍 제품을 완성할 수 있었습니다. 개발자들은 엔지니어링 팀이 기술 스택에 GraphQL을 완전히 도입하도록 설득하여 효율적이고 사용자 친화적인 앱을 빠르게 구축할 수 있었습니다.
스타벅스는 제3자를 고용하여 개발했습니다. 프로그레시브 웹 앱 (PWA).
이 팀은 복잡한 비즈니스 로직을 효율적이고 효과적으로 수용할 수 있는 주문 시스템을 만드는 업무를 맡았습니다. 고객이 자신의 주문을 개인화할 수 있게 되면서, 개발팀은 시스템이 여러 가지 고유한 비즈니스 로직을 수용하고 적절한 시간에 적절한 장소로 적절한 데이터를 전송할 수 있도록 해야 했습니다.
GraphQL을 통해 팀은 서버 측 캐싱 및 렌더링을 통해 효율적인 API를 만들어 오프라인 기능을 개선할 수 있었습니다. 또한, 이 팀은 React를 사용하여 애니메이션을 통합해 역동적이고 매력적인 사용자 경험을 만들었습니다.
F5 CTO 사무실의 목표는 F5 생태계 내에서 GraphQL을 어떻게 사용할 수 있는지 이해하는 것이었습니다. 우리는 GraphQL 사용을 탐색하는 두 가지 프로젝트를 진행 중입니다.
F5가 제공하는 테스트 관리 제품군 (TMS)을 통해 고객은 자체 시스템의 엔드포인트나 클라이언트를 테스트하여 이들이 인간인지 봇인지 확인할 수 있습니다.
이는 TMS 소프트웨어 개발 및 테스트를 간소화하는 데 도움이 되는 내부 프로젝트였습니다. 주요 목표는 기존 SQL 데이터베이스에 갇힌 JSON 데이터를 추출하고, 그래프 데이터로 변환하고, 쿼리를 위한 GraphQL API를 구현하는 것이었습니다.
이러한 작업은 현재 데이터베이스가 "JSON-blob 문제"를 포함한 여러 가지 문제를 제기하기 때문에 필요했습니다. 이 문제는 메타데이터를 테이블 형식 데이터베이스에 JSON 객체로 저장하는 데서 발생합니다. 이런 객체를 구문 분석하고 처리하는 일은 본질적으로 비용이 많이 들고 비효율적입니다. 게다가 JSON-blob은 그래프 특성으로 인해 F5의 제품과 보안을 더욱 개선할 수 있는 귀중한 데이터를 담고 있습니다. 방향성 그래프 데이터베이스로 전환하면 JSON-blob을 방향성 관계를 통해 효율적으로 구문 분석하고 관리하여 데이터 전송 및 활용을 최적화할 수 있습니다.
결과는 격려적입니다. TMS 관계형 데이터베이스에서 JSON 블롭이 있는 테이블을 식별함으로써 GraphDB로 이동하고 GraphQL을 사용하면 시스템에 대한 가시성을 몇 배나 높일 수 있다는 것을 확인했습니다.
그림 9는 이 프로젝트에 대한 가능한 진화 또는 구현 선택을 보여줍니다. 각각의 선택에는 그 나름의 의미가 있습니다.
옵션 1은 클라이언트가 변경할 필요가 없으므로 UI에 미치는 영향이 가장 적습니다. 옵션 1이나 2와 같은 하이브리드 모드는 상황에 따라 잘 작동할 수 있으며, 특히 JSON 객체가 있는 열의 수가 적은 경우에 효과적입니다. 이에 더해, 각 JSON에 대한 파생 스키마도 작을 것입니다.
하지만 이를 계획할 때 JSON 객체에는 SQL 데이터베이스의 다른 열에 저장된 컨텍스트가 필요하다는 것을 깨달았습니다. 각 JSON 객체에 저장된 스키마의 크기도 상당히 컸습니다. 이로 인해 코드베이스를 유지관리하는 작업이 더 많아졌을 것입니다. 그래서 신중하게 고려한 끝에, 옵션 3에서 보여준 것처럼 GraphQL과 Neo4J를 지원하도록 애플리케이션을 재구성하기로 결정했습니다.
CloudGraph는 AWS, Azure, GCP, Kubernetes(K8s)를 위한 무료 오픈 소스 범용 GraphQL API 및 클라우드 보안 상태 관리(CSPM) 도구입니다. 이 프로젝트의 목적은 CloudGraph를 사용하여 F5 Distributed Cloud(F5XC) 데이터가 CloudGraph에 표시되도록 'CloudGraph 플러그인'(그림 10)을 빌드하고, 이를 통해 F5 Distributed Cloud를 사용하여 연결된 클라우드 리소스에 대한 가시성을 높이는 것입니다.
저희의 목표는 CloudGraph와 통합하여 기술을 심층적으로 이해하고 F5XC 데이터에 대한 미래의 CloudGraph 통합, 통찰력, GraphQL API를 구축하는 것입니다.
맞춤형 F5XC 공급자를 CloudGraph 플랫폼에 통합하고 플랫폼의 관계 생성 기능을 사용하면 F5XC를 사용하여 연결된 클라우드 리소스와 다른 클라우드 간의 관계에 대한 가시성이 향상됩니다. 그런 다음 동일한 테넌트에 대해 여러 클라우드의 리소스에 대한 복잡한 쿼리를 생성할 수 있습니다. 이를 통해 이해관계자들에게 포괄적인 F5XC 개요를 제공하고, F5와 고객과 관련된 클라우드 운영에 대한 추가 GraphQL 플러그인과 맞춤형 통찰력을 제공하기 위해 CloudGraph와 더욱 긴밀하게 통합하는 방안을 모색할 수 있습니다.
위에서 언급한 이니셔티브를 바탕으로, 우리의 초기 탐색은 앞서 제시된 사례 연구에 나와 있는 경험과 일치했습니다.
GraphQL이 보안 측면에서 REST보다 우수하다는 초기 인식은 이제 폭로되었습니다. GraphQL은 다른 기술과 마찬가지로 올바르게 구현하지 않으면 고유한 위험을 안고 있기 때문입니다. GraphQL이 다른 기술보다 본질적으로 더 안전하지 않다는 것을 인식하는 것이 중요합니다. GraphQL API의 보안을 보장하려면 적절한 구현과 모범 사례 준수가 중요합니다. 이런 오해를 해소함으로써 GraphQL의 보안 고려사항을 현실적으로 이해하고 잠재적 위험을 완화하기 위한 적절한 조치를 취할 수 있습니다.
GraphQL은 개발자에게 인트로스펙션이라는 강력한 도구를 제공하는데, 이를 통해 개발자는 GraphQL 서비스에서 사용하는 스키마에 대한 정보를 요청할 수 있습니다. 이 도구를 사용하면 개발자는 서비스와 그 구조에 대해 알아볼 수 있습니다. 하지만 성찰에는 위험이 따릅니다. 프로덕션 GraphQL 서비스에서 내성을 활성화하면 스키마 내의 민감한 정보에에도 액세스할 수 있습니다. 이는 악의적인 사용자가 내부 검사를 악용하여 민감한 데이터를 얻고 잠재적으로 해를 끼칠 수 있으므로 심각한 위험을 초래합니다. 더욱이, 내성을 통해 사용자는 전체 스키마를 보고 어떤 쿼리를 실행할지 결정할 수 있으므로 잠재적으로 유해한 작업을 쉽게 식별할 수 있습니다. 이러한 누출은 스키마의 특성과 포함된 데이터에 따라 치명적일 수 있습니다.
완화책 : 내성의 위험을 완화하기 위한 솔루션은 다양한 프레임워크를 사용하여 프로덕션 API에서 내성을 비활성화하는 것입니다. 내성 기능을 비활성화하면 개발자는 이 기능이 제공하는 편리한 기능 중 일부를 잃게 됩니다. 그러나 사용성을 회복하기 위해 개발자는 GraphOS와 같은 도구를 사용하여 프로덕션 API의 GraphQL 스키마를 등록할 수 있습니다. 이를 통해 스키마와 해당 정보에 대한 통제된 액세스를 유지할 수 있습니다.
SQL 주입은 데이터 조작부터 데이터베이스 전체 삭제까지 다양한 위험을 초래하는 널리 알려지고 널리 퍼진 공격입니다. 이 간단한 공격은 문자열 연결을 이용하여 공격자가 입력 내에 실행 가능한 코드를 삽입하고, 데이터베이스에 대한 무단 액세스를 허용하고 악의적인 변경을 가능하게 합니다. 흥미로운 점은 이러한 공격 벡터가 SQL 데이터베이스에만 국한되지 않고 Neo4j와 같은 그래픽 데이터베이스에도 영향을 미칠 수 있다는 것입니다. Neo4j는 SQL과 유사하고 그 취약점을 물려받은 Cypher 쿼리 언어를 사용합니다. 사이퍼 주입이라고 알려진 이런 유형의 공격은 유사점을 이용하지만, 새로운 발명이 필요 없이 기존 솔루션의 이점을 활용합니다.
완화책 : 대책에는 악용을 탐지하고 방지하기 위해 사용자 입력을 정제하고, 매개변수화를 사용하여 직접 쿼리 생성에서 사용자 입력을 추상화하는 것이 포함됩니다. 이러한 조치는 주입 공격의 위험을 효과적으로 완화합니다. GraphQL 구현에서 이 보안 문제를 해결하는 것은 중요하지만, 다행히도 잘 알려지고 쉽게 구현할 수 있는 솔루션이 있습니다.
REST API 위에 GraphQL API를 계층화하면 서버 측 요청 위조(SSRF) 취약점이 발생할 수 있습니다. 공격자는 GraphQL 프록시를 통해 REST API로 전송된 매개변수를 수정하여 이를 악용할 수 있습니다. 두 API 모두 특정 호출에 대한 매개변수를 검증하지 않으면 공격자는 백엔드 시스템을 제어할 수 있게 됩니다. 예를 들어 GraphQL 쿼리에서 사용자 ID에 "/delete"를 추가하면 REST API에 전달될 때 의도치 않게 데이터가 삭제될 수 있습니다.
완화책 : 이러한 취약점은 타당한 우려 사항이지만 GraphQL 스키마에서 유형을 정의하고 외부 API나 서비스로 보내기 전에 매개변수를 철저히 검증하면 효과적으로 해결할 수 있습니다. GraphQL과 관련된 다른 취약점과 마찬가지로, 이 취약점은 GraphQL 자체의 고유한 문제라기보다는 구현상의 문제에서 비롯된다는 점을 알아두는 것이 중요합니다. GraphQL 기술이 큰 가능성을 지니고 있음에도 불구하고 단기적 사고방식으로 인해 GraphQL을 오용하면 이러한 문제가 발생합니다.
인증 취약점은 GraphQL을 포함한 다양한 시스템에서 널리 퍼져 있는 공격 벡터입니다. GraphQL은 단일 요청에서 여러 쿼리나 뮤테이션을 보낼 수 있는 기능을 갖추고 있어 무차별 대입 공격을 포함한 배칭 공격에 노출됩니다.
첫 번째 공격 유형은 로그인 비밀번호를 무차별 대입하는 것입니다. 공격자는 로그인 자격 증명 쌍이 포함된 수많은 변형을 포함하는 요청을 보냅니다. GraphQL은 한 번의 요청에서 여러 가지 변형을 허용하므로, 이 공격은 속도 제한 검사를 우회하고 비밀번호를 무차별 대입하여 세션을 생성할 수 있습니다.
두 번째 유형의 공격은 비슷하게 진행되지만, OTP(일회용 비밀번호)라고 하는 널리 사용되는 2단계 인증(2FA)을 대상으로 합니다. 하나의 요청이 여러 가지 변형과 함께 전송되며, 각 변형에는 유효한 로그인 자격 증명과 다른 OTP 변형이 함께 포함됩니다. 변형 중 하나에 올바른 OTP가 포함되어 있으면 요청이 인증되고 세션이 설정됩니다.
완화책 : 이러한 취약점을 해결하려면 완벽한 해결책이 없으므로 포괄적인 접근 방식이 필요합니다. 개발자는 안전한 코딩 관행을 채택하고 비즈니스 로직의 관점을 강조함으로써 중요한 역할을 합니다. 웹 서버 측에서는 로그인 시도 제한, 사용자 입력 검증 등의 대책을 구현하는 것이 필수적입니다. 또한, 합법적인 로그인 시도는 일반적으로 두 개 이상의 돌연변이를 포함하지 않으므로 여러 돌연변이에 대한 요청 스캔에 특히 주의해야 합니다.
이러한 공격은 GraphQL 서비스에 과도한 트래픽을 발생시켜 합법적 사용자의 요청을 처리할 수 없게 만들고 잠재적으로 서버 충돌을 유발합니다. DoS 공격은 재귀적 GraphQL 쿼리를 통해 실행되거나 대량의 쿼리 요청을 전송하여 실행될 수 있습니다.
재귀적 쿼리 시나리오에서 공격자는 GraphQL 스키마 정의의 순환적 특성을 악용합니다. 예를 들어, 스키마에 저자와 책 유형이 포함되어 있는 경우 공격자는 루프에서 저자와 책을 반복적으로 쿼리하여 재귀 호출 로 서버를 과부하시키고 운영을 방해할 수 있습니다.
혹은 공격자는 데이터베이스에서 방대한 양의 데이터를 요청하는 쿼리를 실행할 수도 있습니다. 예를 들어, 쿼리를 통해 많은 저자와 관련된 모든 책을 검색할 수 있습니다. 이렇게 방대한 양의 데이터 요청으로 인해 시스템이 상당히 느려지거나 작동이 중단될 수 있습니다.
완화책 : 이 문제를 완화하기 위한 해결책은 여러 가지가 있습니다. 첫 번째 방법은 쿼리에 시간 제한을 설정해 사용자가 지정된 기간을 초과하는 요청을 하지 못하도록 하는 것입니다. 그러나 이렇게 하더라도 문제가 완전히 해결되지는 않을 수 있습니다. 할당된 시간 내에도 손상이 발생할 수 있기 때문입니다. 또 다른 해결책은 쿼리 깊이와 복잡성에 제한을 두는 것입니다. 지정된 깊이나 복잡성을 넘어서는 쿼리는 스키마 정의에서 벗어나 거부될 수 있습니다. 마지막으로, 사용자 제한을 구현하는 것이 효과적일 수 있습니다. 사용자가 대량 또는 연속적인 요청을 보내는 경우 서버가 추가 요청을 처리할 준비가 될 때까지 해당 사용자의 서버 액세스가 일시적으로 거부될 수 있습니다.
GraphQL에는 표시된 대로 여러 가지 배포 패턴이 있으며, 각 패턴마다 고유한 장단점과 고려 사항이 있습니다. 가장 일반적인 패턴은 다음과 같습니다.
이는 GraphQL API를 배포하는 가장 간단하고 가장 일반적인 패턴입니다. 모놀리식 배포에서는 GraphQL 서버, 데이터베이스 및 기타 필요한 모든 서비스가 모두 단일 단위로 함께 배포됩니다. 이를 통해 GraphQL을 쉽게 시작할 수 있지만 애플리케이션이 커짐에 따라 확장 및 유지 관리가 어려울 수 있습니다.
구성된 모놀리스는 GraphQL이 API 계층 역할을 하고 모놀리식 및 마이크로서비스를 조합하여 모놀리식 애플리케이션을 구축하는 아키텍처를 말합니다(그림 12). 이 패턴에서는 전체 시스템을 별도의 마이크로서비스로 분해하는 대신, 처음에는 모든 비즈니스 로직과 데이터 액세스 계층을 캡슐화하는 별도의 모놀리스로 애플리케이션을 개발합니다.
이러한 일체형 구조 내에서 GraphQL은 API 계층으로 구현되어 클라이언트가 다양한 기본 마이크로서비스에 데이터를 요청하고 검색할 수 있도록 합니다. 즉, 배포 관점에서 보면 애플리케이션은 모놀리식이지만 다양한 서비스의 데이터를 구성하고 이를 유연하고 효율적인 방식으로 클라이언트에 제공하는 수단으로 GraphQL을 활용합니다.
이 패턴은 개발 및 배포를 간소화하는 것과 더불어 GraphQL의 강력한 쿼리 및 데이터 가져오기 기능을 활용할 수 있는 이점을 제공합니다. GraphQL이 제공하는 유연성과 사용 편의성의 이점을 누리는 동시에 개발자는 점진적으로 마이크로서비스 아키텍처를 도입할 수 있습니다.
GraphQL 배포 패턴의 연합 그래프는 서브그래프라는 여러 GraphQL 서비스를 하나의 통합된 GraphQL 스키마로 결합하는 것을 포함합니다. 각 하위 그래프는 자체 데이터와 기능을 갖춘 별도의 도메인이나 마이크로서비스를 나타냅니다. 이 아키텍처는 요청된 필드에 따라 클라이언트 쿼리를 적절한 하위 그래프로 라우팅하는 중앙 게이트웨이를 사용합니다. 이러한 하위 그래프를 연합함으로써 개발자는 클라이언트가 다양한 서비스를 원활하게 쿼리하고 탐색할 수 있는 통합된 그래프를 만들 수 있습니다.
이러한 접근 방식은 서비스의 모듈성, 확장성 및 독립적인 개발을 촉진하여 GraphQL API를 구축할 때 성능과 유연성을 향상시킵니다. 연합 하위 그래프(그림 13)는 다양한 서비스의 데이터를 구성하고 분산되고 확장 가능한 아키텍처를 만드는 강력한 방법을 제공합니다.
GraphQL 배포 패턴의 하이브리드 그래프(그림 14)는 스티칭 기술을 통해 연합 하위 그래프와 비연합 스키마를 결합합니다. 이러한 접근 방식을 통해 조직은 기존 GraphQL API 또는 레거시 시스템을 연합 마이크로 서비스와 통합하여 두 가지 접근 방식의 이점을 모두 누리는 통합된 GraphQL API를 만들 수 있습니다. 하이브리드 그래프 아키텍처는 스키마를 병합하고 유형과 필드 간의 관계를 해결함으로써 유연성, 모듈성, 확장성을 제공합니다.
하이브리드 그래프 패턴은 조직이 기존 리소스를 활용하면서 점진적으로 연합을 도입할 수 있는 기능을 제공합니다. 이를 통해 연합된 하위 그래프와 비연합된 스키마의 원활한 통합이 가능해져 다양한 요구 사항을 수용하고 상호 운용성을 증진할 수 있습니다. 이러한 접근 방식을 통해 조직은 변화하는 요구 사항에 맞춰 확장하고 적응할 수 있는 포괄적인 GraphQL API를 구축할 수 있습니다. 연합 서비스와 비연합 서비스의 장점을 결합한 하이브리드 그래프는 GraphQL 배포를 구축하기 위한 유연하고 강력한 솔루션을 제공합니다.
GraphQL 배포에서 하이브리드 그래프와 관련된 과제로는 병합된 스키마의 복잡성 관리, 잠재적인 성능 오버헤드 해결, 데이터 일관성 및 무결성 보장, 시스템 진화 및 버전 관리 처리, 분산 아키텍처에서 모니터링 및 디버깅의 복잡성 탐색 등이 있습니다. 이러한 과제를 해결하고 하이브리드 그래프 배포의 원활한 운영을 보장하기 위해서는 신중한 계획, 최적화 및 견고한 개발 관행이 필요합니다.
이 패턴은 AWS Lambda나 Google Cloud Functions와 같은 서버리스 함수 세트로 GraphQL API를 배포하는 것을 포함합니다. 이는 GraphQL API를 배포하는 비용 효율적이고 확장 가능한 방법이 될 수 있지만, 추가적인 대기 시간이 발생하고 아키텍처의 복잡성이 증가할 수도 있습니다.
서버리스 라우팅에는 많은 과제가 있습니다. 한 가지 문제는 애플리케이션이 확장됨에 따라 분산된 하위 그래프를 원활하게 연결하는 것입니다. 여러 팀과 배포를 조정하는 것은 복잡해질 수 있으며, 이로 인해 하위 그래프를 효과적으로 관리하고 확장하는 것이 어려워질 수 있습니다. 이러한 하위 그래프 간의 데이터 일관성과 동기화를 보장하는 것도 또 다른 과제입니다. 분산형 서버리스 환경에서 모니터링과 디버깅을 수행하는 것은 더 어려울 수 있으며, 적절한 로깅 및 오류 처리 메커니즘이 필요합니다. 또한, 여러 서버리스 기능과 하위 그래프에 대한 액세스 제어 및 권한 부여를 관리하는 것도 과제입니다. 이러한 과제를 해결하는 것은 서버리스 기반 GraphQL 배포의 원활한 운영과 확장성에 필수적입니다.
GraphQL API의 엣지 배포 패턴에서 API는 CDN 서비스를 사용하여 클라이언트에 더 가깝게 배치됩니다. 이를 통해 더 빠른 응답을 위한 지연 시간 단축, 원본 서버의 부하 감소, DDoS 공격으로부터의 보호 등 여러 가지 이점을 얻을 수 있습니다.
API 인프라를 전 세계의 엣지 서버에 분산시킴으로써, 트래픽을 보다 효율적으로 처리하고 전 세계적으로 더 나은 사용자 경험을 제공할 수 있습니다. CDN의 캐싱 및 필터링 기능은 확장성을 개선하고 API의 가용성을 보장하는 데 도움이 되며, 트래픽이 폭주하거나 악의적인 공격이 발생하는 경우에도 유용합니다. Edge 배포는 CDN의 서버 네트워크를 활용하여 API의 성능과 안정성을 최적화할 수 있는 잠재력이 있습니다.
GraphQL 기술은 전통적인 기업에서도 채택할 만큼 성숙해졌습니다. 가트너의 2022년 API 하이프 사이클에 따르면 광범위한 채택까지는 아직 몇 년이 걸릴 것으로 예상되지만, 이제는 필요한 도구가 이미 마련되어 중요한 전환점에 도달했습니다. GraphQL은 아직 비교적 새로운 기술이지만, 이미 규모가 크고 확립된 기업의 요구를 충족할 수 있을 정도로 발전했습니다.
GraphAPI 기술이 성숙해진 것은 점점 더 많은 기업이 GraphQL 및 기타 그래프 데이터베이스 기술을 도입하고 있기 때문입니다. 점점 더 많은 회사가 이러한 기술을 채택함에 따라, 이를 지원하는 데 필요한 도구와 리소스가 점점 더 많이 제공되어 다른 기업이 이를 따르기가 쉬워졌습니다. 또한 GraphAPI 기술의 이점(예: 향상된 데이터 쿼리, 감소된 복잡성)이 점점 더 널리 알려지면서 대기업에서 GraphAPI 기술을 채택하는 속도가 더욱 빨라지고 있습니다.
업계에서는 GraphQL과 같은 GraphAPI 기술의 중요성과 REST의 한계를 극복할 수 있는 잠재력을 인식해야 합니다. 기업은 특히 데이터 모델링, 다양성, 불투명성 측면에서 GraphQL에 투자하고 이해해야 할 시급한 필요성을 간과해서는 안 됩니다. GraphQL의 기능과 잠재력에 매료되기 쉽지만, 부풀려진 기대치에 도달한 후에는 환멸에 빠질 가능성도 있다는 점을 인식해야 합니다. 공급업체는 GraphQL을 완벽하게 지원하기 위해 자사 제품을 개선하는 것을 우선시해야 하며, 공급업체를 포함한 기업 IT 부서는 생산성을 향상시키기 위해 GraphQL을 적용하면 어떤 데이터가 도움이 될지 파악해야 합니다.
고객은 자신의 데이터를 이해하는 것을 우선시해야 하며, 일반 기업이 원래 GraphQL을 도입한 하이퍼스케일러와는 다르게 운영된다는 것을 인식해야 합니다. GraphQL을 효과적인 소프트웨어 아키텍처 패턴으로 받아들이고 더 나은 생산성과 혁신을 향해 산업을 발전시키기 위해 함께 노력합시다.