📚 PHP 고급 - 5주차: RESTful API 보안 및 인증 - 03 API 요청 제한 (Rate Limiting)

2025. 9. 14. 16:08프로그램/PHP 고급

API 요청 제한 (Rate Limiting)이란?

📚 PHP 고급 - 5주차: RESTful API 보안 및 인증 - 03 API 요청 제한 (Rate Limiting)

#API요청제한 (#RateLimiting)은 특정 기간 동안 사용자가 API에 보낼 수 있는 요청의 수를 제한하는 기술이다. 이는 API 서버를 과도한 부하로부터 보호하고, 서비스의 안정성을 유지하며, 악의적인 공격(예: #DDoS공격)을 방어하는 데 필수적인 보안 조치이다.


API 요청 제한이 필요한 이유

  1. 서버 보호: 무분별한 요청으로 인해 서버에 과부하가 걸려 서비스가 마비되는 것을 막는다.
  2. 비용 절감: API 사용량에 따라 과금되는 경우, 의도치 않은 비용 폭탄을 막아준다.
  3. 공정성 보장: 모든 사용자가 API를 공정하게 사용할 수 있도록 보장한다.
  4. 보안 강화: 무차별 대입 공격(Brute-force attack)이나 DDoS 공격으로부터 시스템을 보호한다.

API 요청 제한의 구현 방법

API 요청 제한을 구현하는 방법은 여러 가지가 있다. 가장 일반적인 방법으로는 토큰 버킷 알고리즘, 고정 윈도우 알고리즘, 슬라이딩 윈도우 알고리즘 등이 있다. 여기서는 PHP에서 간단하게 구현할 수 있는 기본적인 방법을 살펴본다.


1. 카운터 기반 요청 제한 (Counter-based Rate Limiting)

가장 단순한 방법으로, 특정 기간(예: 1분) 동안 사용자(IP 주소 또는 API 키)의 요청 횟수를 카운트하고, 미리 설정된 한도를 초과하면 요청을 거부하는 방식이다.


PHP에서 구현 예제

이 예제에서는 사용자의 #IP주소 를 기반으로 요청 횟수를 제한한다. Redis나 #파일 시스템 을 사용하여 요청 카운터를 저장할 수 있다. 여기서는 간단하게 파일 시스템을 사용한 예제를 제시한다.

PHP
 
<?php
// 요청 제한 설정
$limit = 10; // 분당 10회 요청 제한
$time_window = 60; // 60초 (1분)
 
// 사용자 식별 (여기서는 IP 주소 사용)
$user_identifier = $_SERVER['REMOTE_ADDR'];
 
// 요청 정보 저장 경로
$log_file = 'rate_limit_' . md5($user_identifier) . '.log';
 
// 현재 시간
$current_time = time();
 
// 기존 요청 정보 불러오기
$requests = [];
if (file_exists($log_file)) {
    $requests = json_decode(file_get_contents($log_file), true);
}
 
// 윈도우 밖의 오래된 요청 제거
$requests_in_window = array_filter($requests, function($timestamp) use ($current_time, $time_window) {
    return ($current_time - $timestamp) < $time_window;
});
 
// 현재 요청 추가
$requests_in_window[] = $current_time;
 
// 요청 횟수 확인
if (count($requests_in_window) > $limit) {
    // 요청 횟수 초과
    header('HTTP/1.1 429 Too Many Requests');
    header('Content-Type: application/json');
    echo json_encode(['error' => 'Rate limit exceeded. Please try again later.']);
    exit();
}
 
// 업데이트된 요청 정보 저장
file_put_contents($log_file, json_encode($requests_in_window));
 
// API 로직 실행
// ...
 
// 예시 응답
header('Content-Type: application/json');
echo json_encode(['message' => 'API call successful.']);
?>

2. HTTP 응답 헤더

API 요청 제한을 구현할 때, 클라이언트에게 현재 상태를 알려주는 것이 중요하다. 이를 위해 다음과 같은 HTTP 헤더를 사용한다.

  • X-RateLimit-Limit: 허용된 요청의 최대 횟수.
  • X-RateLimit-Remaining: 남은 요청 횟수.
  • X-RateLimit-Reset: 제한이 초기화되는 시간 (UNIX 타임스탬프).

이 헤더들을 응답에 포함시켜 클라이언트가 요청을 조절할 수 있도록 유도해야 한다.


요약

#API요청제한 은 서버의 안정성과 보안을 위해 필수적인 기술이다. #PHP 를 사용하여 간단한 #요청제한 로직을 구현할 수 있으며, 클라이언트 친화적인 API를 만들기 위해 #HTTP헤더 를 적극적으로 활용해야 한다. 더 복잡한 애플리케이션에서는 #Redis 와 같은 인메모리 데이터베이스를 사용하면 성능을 크게 향상시킬 수 있다.


API요청제한 RateLimiting DDoS공격 IP주소 파일 시스템 HTTP헤더 PHP 요청제한 Redis

 

 

유튜브/인스타그램 조회 유효 KT아이피, 쇼핑 크롤링, 지역별 다대역 IP보유

https://xn--299ao67b9qbmsf04c.net/

 

VPN 5,500원 / IP교체 1,100원 / 유동프록시 22,000원 | LuzenVPN 루젠VPN

국내최저가 고정IP서비스,유동프록시(IP4000개이상제공),PPTP,L2TP,IPSec,OpenVPNVPN,통신사VPN,VPN프로그램,고정IP,고정아이피,PPTP,저렴한VPN,리니지MVPN,리니지VPN,아이온VPN,던파VPN,유동프록시,유동PROXY,바이

vpn.luzensoft.com