개요
Rate Limiter가 무엇인지에 대해서 알아보고 구현을 위해서는 어떤 부분들을 고려해야 하는지에 대해서 설명합니다. 해당 포스팅은 Rate Limiter를 구성하는 알고리즘에 대해서도 상세 설명을 할 예정이라 시리즈물로 작성 예정입니다.
Rate Limiter란 무엇인가
Rate Limiter는 일정 시간 동안 허용된 요청의 수를 제한하는 기능을 말합니다. 이를 통해 서버 오버로드를 방지하고, 서비스의 가용성을 높일 수 있습니다. Rate Limiter는 다양한 알고리즘을 통해서 구현될 수 있습니다.
- Token Bucket
- Leaky Bucket
- Fixed Window Counter
- Sliding Window Log
- Sliding Window Counter
해당 포스팅 이후에 각 알고리즘에 대해서 상세한 도식과 함께 설명 예정입니다.
HTTP API 서버에서 Rate Limiter
HTTP API 서버에서 Rate Limiter를 구현할 때, 서버는 요청이 제한을 초과했을 경우 클라이언트에게 명확하게 알려줄 필요가 있습니다. 이는 HTTP 응답 상태 코드와 함께 특정 HTTP 헤더를 사용하여 구현될 수 있습니다
HTTP 상태 코드
429 Too Many Requests: 이 상태 코드는 클라이언트가 지정된 시간 동안 허용된 요청 수를 초과했음을 나타냅니다. Rate Limiter에 의해 요청이 제한될 때 이 상태 코드를 응답으로 사용해야 합니다.
Rate Limiter 헤더
Rate Limiting과 관련된 정보를 클라이언트에게 제공하기 위해 다음과 같은 HTTP 헤더를 사용할 수 있습니다.
- X-RateLimit-Limit: 허용된 최대 요청 수 (일반적으로 일정 시간 내).
- X-RateLimit-Remaining: 주어진 시간 동안 클라이언트가 할 수 있는 남은 요청 수.
- X-RateLimit-Reset: Rate Limit이 리셋되는 시간 (대개 에포크 시간으로 제공).
이런 부분들이 반드시 따라야 하는 규칙 같은 것은 아니지만 관습적으로 사용되는 부분으로 다양한 곳(트위터, 구글, 페이스북 등등..)에서 Rate Limiter를 구현할 때 이러한 상태코드와 헤더 응답 값들을 내려주고 있기 때문에 만약 Rate Limiter를 구현한다면 따르는게 좋다고 생각합니다.
Rate Limiter 대상
Rate Limiter를 구현할 때 대상을 정의하는 것은 중요한 고려 사항입니다. 대상은 Rate Limiter가 적용되는 범위나 단위를 의미하며, 이는 서비스의 성격, 인프라 구조, 그리고 보호하고자 하는 자원의 특성에 따라 달라질 수 있습니다.
IP 주소
IP 주소 기반 Rate Limiting은 가장 일반적인 형태 중 하나입니다. 이 방식은 특정 IP 주소에서 오는 요청의 수를 제한함으로써, 단일 사용자 또는 네트워크에서 서비스에 대한 과도한 요청을 방지합니다. 이는 서버 공격(예: DDoS 공격)으로부터 서비스를 보호하는 데 유용합니다.
사용자 계정
사용자 기반 Rate Limiting은 특정 사용자 계정에 대한 요청 수를 제한합니다. 이 방식은 서비스가 개인 사용자 식별 정보(예: 사용자 ID, API 키)를 기반으로 요청을 추적할 수 있을 때 효과적입니다. 사용자 기반 제한은 유료/무료 구독 계획과 같이 서비스 사용 수준을 다르게 설정하고자 할 때 유용합니다.
애플리케이션/서비스
특정 애플리케이션 또는 서비스에 대한 요청을 제한하는 것도 가능합니다. 예를 들어, API 키를 통해 각 애플리케이션을 식별하고 해당 키별로 요청 수를 제한할 수 있습니다. 이는 서비스가 여러 애플리케이션에 의해 사용되는 경우, 각 애플리케이션의 사용량을 공정하게 관리하고자 할 때 유용합니다.
엔드포인트
서비스 내 특정 API 엔드포인트나 리소스에 대해 요청 수를 제한하는 방식입니다. 일부 API 엔드포인트는 다른 엔드포인트보다 더 많은 서버 자원을 소모할 수 있으므로, 이러한 엔드포인트에 대해 더 엄격한 요청 제한을 설정할 수 있습니다.
지역/국가
지역 또는 국가별로 요청을 제한하는 것도 가능합니다. 이는 특정 지역에서 오는 과도한 트래픽을 관리하거나, 지역별 사용자 경험을 최적화하기 위해 사용될 수 있습니다.
정리
Rate Limiter가 무엇이고 왜 필요한지 어떤 것들을 고려해야 하는지에 대해서 알아봤습니다. 실제 운영환경에서 서버를 운영할 때는 어느 시점에서는 반드시 고려해야 하는 기능이라고 생각을 하고 있고 이를 구현하기 위한 다양한 알고리즘들이 있습니다. 다음 포스팅에서는 Rate Limiter를 구현할 수 있는 다양한 알고리즘들에 대해서 상세하게 알아보려고 합니다.