토큰 버킷 알고리즘이란? API 트래픽을 제어하는 방식

토큰 버킷 알고리즘의 정의

토큰 버킷(Token Bucket)은 일정한 속도로 요청을 제한하면서도 순간적인 트래픽 폭주를 어느 정도 허용해주는 트래픽 제어 알고리즘입니다. API 서버가 클라이언트의 과도한 요청으로 다운되는 것을 막기 위해 흔히 사용하는 레이트 리미팅(Rate Limiting) 기법 중 하나로, Google, AWS, Nginx 등 다양한 인프라에서 실제로 채택하고 있습니다.

이름 그대로 ‘토큰이 담긴 버킷’을 상상하면 이해가 쉽습니다. 버킷 안에는 일정 개수의 토큰이 들어있고, 요청 하나가 들어올 때마다 토큰을 하나씩 꺼내 씁니다. 토큰이 없으면 요청은 거부되거나 대기하게 됩니다.

동작 원리와 예시

토큰 버킷의 핵심 규칙은 두 가지입니다.

  • 버킷에는 최대 수용 가능한 토큰 개수(capacity)가 정해져 있다.
  • 정해진 속도(rate)로 토큰이 꾸준히 채워진다.

예를 들어 버킷 용량이 10개이고, 초당 5개의 토큰이 채워진다고 가정해봅시다. 이 경우 평상시에는 초당 5건의 요청만 처리할 수 있지만, 한동안 요청이 없어 토큰이 10개까지 쌓여 있었다면 순간적으로 10건의 요청이 몰려도 즉시 처리할 수 있습니다. 즉, 평균 속도는 제한하면서도 짧은 순간의 버스트(burst) 트래픽은 유연하게 받아줄 수 있는 것이 핵심입니다.

이는 마치 놀이공원의 회전목마 탑승권과 비슷합니다. 매표소에서 1분마다 5장의 티켓을 발급하지만, 티켓 보관함에 최대 10장까지는 미리 쌓아둘 수 있습니다. 사람이 없을 때 티켓이 쌓였다가, 갑자기 단체 손님이 몰려오면 쌓여있던 티켓으로 한 번에 여러 명을 태울 수 있는 것과 같은 원리입니다.

실무에서 왜 사용할까?

API 서버 입장에서 요청을 초 단위로 아주 엄격하게 균등 제한(Fixed Window 방식 등)하면 사용자 경험이 딱딱해질 수 있습니다. 반면 토큰 버킷은 평소 트래픽이 적을 때 여유 토큰을 쌓아두었다가, 사용자가 잠깐 몰아서 요청을 보내는 상황(예: 페이지 새로고침 후 여러 API를 동시 호출)에도 자연스럽게 대응할 수 있습니다.

실제로 Nginx의 limit_req 모듈, AWS API Gateway의 스로틀링 설정, Redis 기반의 레이트 리미터 라이브러리 등이 토큰 버킷 또는 이와 유사한 리키 버킷(Leaky Bucket) 방식을 기반으로 동작합니다. 서버 자원을 보호하면서도 사용자 경험을 해치지 않는 균형을 맞추고 싶을 때, 토큰 버킷은 실무에서 가장 널리 쓰이는 선택지 중 하나입니다.

댓글 남기기