PHP PHP에서 REST API Rate Limiting 구현법
페이지 정보

영삼이
본문
✅ PHP에서 REST API Rate Limiting 구현법
REST API를 운영할 때 가장 중요한 보안 및 성능 요소 중 하나는 Rate Limiting입니다. 사용자가 너무 많은 요청을 보내는 것을 방지하여 서버 자원을 보호하고, Abuse를 차단할 수 있습니다. 이 글에서는 PHP에서 Rate Limit을 직접 구현하는 방법을 소개합니다.
📌 기본 개념
-
일정 시간 동안의 요청 횟수를 제한
-
일반적으로 클라이언트 IP 또는 API Key 기반
-
Redis 같은 저장소와 함께 사용하면 고성능 구현 가능
🧱 Redis 기반 Rate Limit 예제
[code=php]
class RateLimiter {
private Redis $redis;
private int $limit;
private int $ttl;
public function __construct(Redis $redis, int $limit = 100, int $ttl = 60) {
$this->redis = $redis;
$this->limit = $limit;
$this->ttl = $ttl;
}
public function check(string $key): bool {
$count = $this->redis->incr($key);
if ($count === 1) {
$this->redis->expire($key, $this->ttl);
}
return $count <= $this->limit;
}
}
[/code]
🚀 사용 예시
[code=php]
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$limiter = new RateLimiter($redis, 100, 60); // 1분에 100회 제한
$clientKey = 'rate_limit:' . $_SERVER['REMOTE_ADDR'];
if (!$limiter->check($clientKey)) {
http_response_code(429); // Too Many Requests
echo '요청이 너무 많습니다. 잠시 후 다시 시도하세요.';
exit;
}
// 정상 요청 처리
echo '요청 성공';
[/code]
📌 리미팅 기준 다양화
-
IP 기준 →
$_SERVER['REMOTE_ADDR']
-
API Key 기준 → 헤더에서 추출
-
사용자 ID 기준 → 로그인 세션/토큰 기반
🧠 개선 아이디어
-
사용자 등급에 따라 제한량 다르게 설정 (예: VIP 1000, 일반 100)
-
실패 로그 누적 → 블랙리스트 등록
-
토큰 버킷 알고리즘, 슬라이딩 윈도우 적용
✅ 요약
-
Rate Limiting은 API 보호에 필수
-
Redis로 간단하고 빠르게 구현 가능
-
IP, 토큰, 사용자 ID 등 다양한 기준으로 조절 가능
-
너무 단순한 로직은 우회당할 수 있으므로 보완 필요
- 이전글PHPUnit으로 테스트 가능한 코드 구조 만들기 25.03.28
- 다음글PHP에서 로직 분리: 서비스 계층 설계 팁 25.03.28
댓글목록
등록된 댓글이 없습니다.