개발 지식

개발 지식

PHP PHP에서 REST API Rate Limiting 구현법

페이지 정보

profile_image
영삼이
0건 169회 25-03-28 23:09

본문

✅ 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 등 다양한 기준으로 조절 가능

  • 너무 단순한 로직은 우회당할 수 있으므로 보완 필요


댓글목록

등록된 댓글이 없습니다.