216.73.216.168 TODAY : 4,267

PHP ์˜จ๋ผ์ธ ๊ฐ•์˜

 > 

PHP - ๊ณ ๊ธ‰

๐Ÿ“š PHP ๊ณ ๊ธ‰ - 5์ฃผ์ฐจ: RESTful API ๋ณด์•ˆ ๋ฐ ์ธ์ฆ - 03 API ์š”์ฒญ ์ œํ•œ (Rate Limiting)

๐Ÿ“š PHP ๊ณ ๊ธ‰ - 5์ฃผ์ฐจ: RESTful API ๋ณด์•ˆ ๋ฐ ์ธ์ฆ - 03 API ์š”์ฒญ ์ œํ•œ (Rate Limiting)
ํ‰์  10.0 ๋ผ์ด์„ผ์Šค free
์‚ฌ์šฉ์žํ‰์  10.0 ์šด์˜์ฒด์ œ
๋‹ค์šด๋กœ๋“œ 1 ํŒŒ์ผํฌ๊ธฐ 0
์ œ์ž‘์‚ฌ LUZENSOFT ๋“ฑ๋ก์ผ 2025-09-14 16:09:03
์กฐํšŒ์ˆ˜ 1
- ์„ค๋ช…

API ์š”์ฒญ ์ œํ•œ (Rate Limiting)์ด๋ž€?

uploadImage

#API์š”์ฒญ์ œํ•œ (#RateLimiting)์€ ํŠน์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ์‚ฌ์šฉ์ž๊ฐ€ API์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ด๋Š” API ์„œ๋ฒ„๋ฅผ ๊ณผ๋„ํ•œ ๋ถ€ํ•˜๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๊ณ , ์„œ๋น„์Šค์˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ, ์•…์˜์ ์ธ ๊ณต๊ฒฉ(์˜ˆ: #DDoS๊ณต๊ฒฉ)์„ ๋ฐฉ์–ดํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๋ณด์•ˆ ์กฐ์น˜์ด๋‹ค.



API ์š”์ฒญ ์ œํ•œ์ด ํ•„์š”ํ•œ ์ด์œ 


  1. ์„œ๋ฒ„ ๋ณดํ˜ธ: ๋ฌด๋ถ„๋ณ„ํ•œ ์š”์ฒญ์œผ๋กœ ์ธํ•ด ์„œ๋ฒ„์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ ค ์„œ๋น„์Šค๊ฐ€ ๋งˆ๋น„๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค.

  2. ๋น„์šฉ ์ ˆ๊ฐ: API ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ๊ณผ๊ธˆ๋˜๋Š” ๊ฒฝ์šฐ, ์˜๋„์น˜ ์•Š์€ ๋น„์šฉ ํญํƒ„์„ ๋ง‰์•„์ค€๋‹ค.

  3. ๊ณต์ •์„ฑ ๋ณด์žฅ: ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ API๋ฅผ ๊ณต์ •ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•œ๋‹ค.

  4. ๋ณด์•ˆ ๊ฐ•ํ™”: ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ(Brute-force attack)์ด๋‚˜ DDoS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์‹œ์Šคํ…œ์„ ๋ณดํ˜ธํ•œ๋‹ค.



API ์š”์ฒญ ์ œํ•œ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

uploadImage

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/