๐Ÿšฆ Rate Limit๋ฅผ ์ ์šฉํ•ด๋ณด์ž

Strangekimยท2025๋…„ 4์›” 24์ผ

๐Ÿšฆ Rate Limit๋ฅผ ์ ์šฉํ•ด๋ณด์ž

์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋‹ค ๋ณด๋ฉด, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ˆ˜๋งŽ์€ ์š”์ฒญ์ด ํ•œ๊บผ๋ฒˆ์— ๋ชฐ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฐ ๊ฒฝ์šฐ ์„œ๋ฒ„๋Š” ๋น„์ •์ƒ์ ์ธ ์š”์ฒญ์— ์˜ํ•ด ๋ถ€ํ•˜๋ฅผ ๋ฐ›๊ฑฐ๋‚˜,
์‹ฌํ•˜๋ฉด ์„œ๋น„์Šค ์ž์ฒด๊ฐ€ ๋งˆ๋น„๋  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ Rate Limit์ด๋‹ค.


๐Ÿ’ก Rate Limit๋ž€?

Rate Limit(์š”์ฒญ ์ œํ•œ)์€ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

  • "1๋ถ„์— 100๊ฐœ ์ด์ƒ์˜ ์š”์ฒญ์€ ๊ฑฐ๋ถ€ํ•œ๋‹ค"
  • "๊ฐ™์€ IP์—์„œ 5์ดˆ์— 1๋ฒˆ๋งŒ ์š”์ฒญ ๊ฐ€๋Šฅํ•˜๋‹ค"

์ด๋Ÿฐ ์‹์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•จ์œผ๋กœ์จ, ์„œ๋ฒ„ ์•ˆ์ •์„ฑ๊ณผ ์„œ๋น„์Šค ํ’ˆ์งˆ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


๐ŸŽฏ Rate Limit๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์œผ๋กœ Rate Limit๋ฅผ ์ ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค.


โœ… 1. ๋ฒ„ํŠผ ์—ฐํƒ€ ๋“ฑ ์‹ค์ˆ˜ ํ˜น์€ ์•…์˜์  ์š”์ฒญ ๋ฐฉ์ง€

๋งŽ์€ ์‚ฌ์šฉ์ž๋“ค์ด ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ ๋“ฑ์—์„œ ๋ฒ„ํŠผ์„ ์—ฐ์†ํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ˆ„๋ฅด๋Š” ์‹ค์ˆ˜๋ฅผ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
ํ˜น์€ ์ผ๋ถ€ ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๋Š” API๋ฅผ ๋ฐ˜๋ณต ํ˜ธ์ถœํ•˜์—ฌ ์„œ๋น„์Šค์˜ ์ •์ƒ์ ์ธ ์‚ฌ์šฉ์„ ๋ฐฉํ•ดํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๐Ÿ‘‰ Rate Limit๋Š” ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ž์› ๋‚ญ๋น„๋ฅผ ๋ง‰๊ณ , ์‚ฌ์šฉ์ž ์‹ค์ˆ˜๋กœ ์ธํ•œ ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๋Š” ๋ฐ ํšจ๊ณผ์ ์ด๋‹ค.


โœ… 2. AI ํฌ๋กค๋ง/์Šคํฌ๋ž˜ํ•‘์œผ๋กœ ์ธํ•œ ๋น„์ •์ƒ์  ์ ‘๊ทผ ๋Œ€์‘

์š”์ฆ˜์€ AI ์„œ๋น„์Šค๋“ค์ด ์›น์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ํฌ๋กค๋งํ•˜๋Š” ์‚ฌ๋ก€๊ฐ€ ๋Š˜์–ด๋‚˜๊ณ  ์žˆ๋‹ค.
ํŠน์ • ํŽ˜์ด์ง€์— ์ž๋™ํ™”๋œ ๋ด‡๋“ค์ด ์ˆ˜์ฒœ, ์ˆ˜๋งŒ ๋ฒˆ์”ฉ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ๋„ ํ•œ๋‹ค.

์ด๋Ÿฐ ๋ด‡๋“ค์˜ ์š”์ฒญ์€ ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜๊ณ ,
๋•Œ๋ก  ์„œ๋น„์Šค ์šด์˜์— ์ง€์žฅ์„ ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

๐Ÿ‘‰ Rate Limit๋ฅผ ํ†ตํ•ด ํŠน์ • IP์—์„œ ๊ณผ๋„ํ•œ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ› ๏ธ Rate Limit ์ ์šฉ ๋ฐฉ๋ฒ•

Rate Limit๋Š” ์ ์šฉ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ณ„์ธต์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ณ„์ธต๋ฐฉ๋ฒ•ํŠน์ง•
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜Express middleware, NestJS guard ๋“ฑ์„ธ๋ถ€ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ •๊ตํ•˜๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ
๋ฐ์ดํ„ฐ๋ฒ ์ด์ŠคRedis + TTL ํ™œ์šฉ์„ธ์…˜/์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜ ์š”์ฒญ ์ œํ•œ ๊ฐ€๋Šฅ
์„œ๋ฒ„๋‹จNginx์†๋„ ๋น ๋ฆ„, ๊ฐ„๋‹จํ•œ ์„ค์ •์œผ๋กœ ๋Œ€๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด
์™ธ๋ถ€ ์„œ๋น„์ŠคCloudflare, AWS API Gateway๊ด€๋ฆฌํ˜• ์†”๋ฃจ์…˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

โš™๏ธ ๋‚ด๊ฐ€ ์ ์šฉํ•œ ๋ฐฉ์‹: Nginx์—์„œ Rate Limit ์„ค์ •ํ•˜๊ธฐ

๊ฐ€์žฅ ๋น ๋ฅด๊ณ , ์ธํ”„๋ผ ์ฐจ์›์—์„œ ๋™์ž‘ํ•˜๋ฉฐ,
์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์• ์ดˆ์— ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ธ Nginx ์„ค์ •์œผ๋กœ Rate Limit๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๐Ÿ“„ Nginx ์„ค์ • ์˜ˆ์‹œ

http {
    # ์š”์ฒญ ์†๋„ ์ œํ•œ ์„ค์ • (10์ดˆ์— 5๋ฒˆ๊นŒ์ง€ ํ—ˆ์šฉ)
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;

    server {
        listen 443 ssl;
        server_name footballsquare.co.kr;

        location /api/ {
            # ์œ„์—์„œ ์„ค์ •ํ•œ zone ์ ์šฉ
            limit_req zone=api_limit burst=10 nodelay;

            proxy_pass http://localhost:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

๐Ÿงพ ์ฃผ์š” ์˜ต์…˜ ์„ค๋ช…

  • limit_req_zone
    โ†’ ์ œํ•œ ์ •์ฑ… ์ •์˜ (IP ๊ธฐ์ค€์œผ๋กœ, ์ดˆ๋‹น ๋ช‡ ๋ฒˆ๊นŒ์ง€ ์š”์ฒญ ๊ฐ€๋Šฅ)

  • burst
    โ†’ ๋‹จ๊ธฐ๊ฐ„ ํ—ˆ์šฉํ•˜๋Š” ์ดˆ๊ณผ ์š”์ฒญ ์ˆ˜ (๋ฒ„ํผ ๊ฐœ๋…)

  • nodelay
    โ†’ ์ดˆ๊ณผ ์š”์ฒญ์„ ๋Œ€๊ธฐ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ฐจ๋‹จํ• ์ง€ ์—ฌ๋ถ€


โœ… ๋งˆ๋ฌด๋ฆฌ

Rate Limit๋Š” ๋‹จ์ˆœํ•œ ์„ค์ •์ด์ง€๋งŒ, ์„œ๋น„์Šค ํ’ˆ์งˆ์„ ์ง€ํ‚ค๋Š” ํ•ต์‹ฌ ์žฅ์น˜๋‹ค.
์ด๋ฒˆ์—๋Š” Nginx๋ฅผ ํ†ตํ•ด ์†์‰ฝ๊ฒŒ ์ ์šฉํ–ˆ์ง€๋งŒ,
์•ž์œผ๋กœ๋Š” Redis๋ฅผ ํ™œ์šฉํ•œ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜ Rate Limit๋„ ๋„์ž…ํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

profile
๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž (ํฌ๋ง) / ์˜ค๋””์˜ค ์—”์ง€๋‹ˆ์–ด

0๊ฐœ์˜ ๋Œ“๊ธ€