백엔드 API 서비스 보호하기 1탄 – 속도제한

애플리케이션 운영을 보다 빠르고, 스마트하며, 안전하게 운영할 수 있도록 지원하는 글로벌 No.1 브랜드 <F5 네트웍스 코리아> 공식 블로그를 방문해주신 여러분, 반갑습니다! ‘API 게이트웨이로서 NGINX PLUS 구축하기’에 대한 관심이 높아지면서, F5 네트웍스 코리아 블로그에서는 ‘NGINX Plus 및 API 게이트웨이로 시작하기’에 대한 시리즈 포스팅을 소개해 드렸는데요. 이에 대한 뜨거운 인기로 이번에는 백엔드 API 서비스 보호하기 시리즈를 준비했습니다. 제 1탄은 ‘속도제한’입니다.

​​

개별 API 클라이언트는 브라우저 기반 클라이언트와는 달리 API에 막대한 부하를 가중시킬 수 있습니다. 심지어 시스템 리소스의 상당 부분을 소모하기 때문에, 다른 API 클라이언트들을 사실상 lock out 상태에 빠지게 할 수도 있습니다. 악의적인 클라이언트들만이 이러한 위협을 가하는 것일까요? 그렇지 않습니다. 오작동하거나, 버그가 있는 API 클라이언트들이 백엔드를 마비시키는 루프를 시작할 수 있지요. 이를 방지하기 위해 각 클라이언트의 정당한 사용을 보장하고, 백엔드 서비스의 리소스를 보호할 수 있도록 속도 제한을 적용합니다.

NGINX Plus 요청의 모든 속성을 기초로 속도 제한을 적용할 수 있습니다. 클라이언트 IP 주소가 일반적으로 사용되지만, API에 대한 인증이 활성화되면 인증된 클라이언트 ID는 더 신뢰할 수 있는 정확한 속성이 됩니다. 속도 제한 자체는 최상위 레벨 API 게이트웨이 구성에서 정의되며, 이후 전역적으로 적용되거나, API 또는 심지어 URI별로 적용될 수 있습니다. 그럼 예제를 통해 더욱 자세히 살펴보겠습니다.

라인 8의 limit_req_zone 지시문(directive)은 각 클라이언트 IP 주소($binary_remote_addr)에 대해 초당 10회 요청의 속도 제한을 정의합니다. 라인 9에서는 각 인증 클라이언트 ID ($http_apikey)에 대해 초당 200개의 요청 제한을 정의하지요. 이는 적용되는 위치에 관계없이 다수의 속도 제한을 정의하는 방법을 보여줍니다. 이렇게 한 API가 동시에 다수의 속도 제한을 적용하거나, 여러 리소스에 대해 서로 다른 속도 제한을 적용할 수 있습니다.

위의 구성 스니펫(snippet)에서는 limit_req 지시문(directive)을 이용해 “Warehouse API”의 정책 섹션에 첫 번째 속도 제한을 적용합니다. 기본적으로 NGINX Plus는 속도 제한을 초과하는 경우, 503 (Service Unavailable) 응답을 전송합니다. 하지만, 이는 API 클라이언트가 속도 제한을 초과했다는 것을 분명하게 이해하고 자신의 행동을 수정할 수 있도록 한다는 점에서 유용합니다. 이를 위해 limit_req_status 지시문(directive)을 사용해 429 (Too Many Requests) 응답을 대신 전송합니다. limit_req 지시문(directive)에 추가 매개변수를 사용하여, NGINX Plus가 속도 제한을 적용하는 방법을 세밀하게 조정할 수도 있습니다. 예를 들어, 속도 제한을 초과하면, 바로 요청을 거부하는 것이 아니라 대기열에 추가함으로써, 요청 속도가 지정된 제한 아래로 떨어질 때까지 기다리도록 합니다.

이번 시리즈에서는 운영 환경에서 악의적인 클라이언트와 오작동하는 클라이언트로부터 운영 환경의 백엔드 API 서비스를 보호하는 방법으로 ‘속도제한’에 대해 다루었는데요. 제 2탄에서는 ‘특정 요청 메소드 적용과 세분화된 액세스 제어 적용’에 대해 다룰 예정이니, 꼭 확인해 주세요! 본 포스팅에 대해 궁금하신 점은 댓글 또는 Contact F5를 통해 문의해 주세요! “Code Connects Us All!” F5 네트웍스 코리아는 귀사의 애플리케이션이 보다 빠르고 스마트하며 안전하게 운영될 수 있도록 항상 최선을 다하겠습니다.

​출처: https://blog.naver.com/f5networks_korea/221863174665

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>