Design Rate Limiter
์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น(rate limiter)๋ ํน์ ์๊ฐ ๋น ์ฒ๋ฆฌํ ์ ์๋ ์์ฒญ์ ์๋ฅผ ์ ํํ๋ ์ฅ์น๋ก, ์๋์ ๊ฐ์ ์ด์ ๋ก ์ฌ์ฉ๋๋ค.
DoS(Denial of Service) ๊ณต๊ฒฉ์ ์ํ ์์ ๊ณ ๊ฐ ๋ฐฉ์ง
๊ณผ๋ํ ์๋ ํํฐ API ๊ณผ๊ธ ๋ฐฉ์ง
๋ด์ด๋ ์๋ชป๋ ์ด์ฉ ํจํด์ผ๋ก ์ธํ ์๋ฒ ๊ณผ๋ถํ ๋ฐฉ์ง
์๊ตฌ ์ฌํญ
์ฒ๋ฆฌ์จ์ ์ด๊ณผํ๋ ์์ฒญ์ ์ ํํ๊ฒ ์ ์ด
๋ฎ์ ์๋ต ์๊ฐ ๋ฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
๋ถ์ฐํ ์ฒ๋ฆฌ์จ ์ ํ(๋ถ์ฐ ํ๊ฒฝ์์๋ ๋์)
์์ฒญ ์ ํ ์ ์ฌ์ฉ์์๊ฒ ์๋ฆผ
๋์ ๊ฒฐํจ ๊ฐ๋ด์ฑ(์ ํ ์ฅ์น์ ์ฅ์ ๊ฐ ๋ฐ์ํด๋ ์ ์ฒด ์๋น์ค์ ์ํฅ์ ์ฃผ์ง ์์)
์ค๊ณ์๋ ์ ๋ต์ด ์กด์ฌํ์ง๋ ์์ง๋ง, ํ์ฌ ๊ธฐ์ ์คํ / ์๊ตฌ ์ฌํญ / ๋ชฉํ / ์ฐ์ ์์์ ๋ฐ๋ผ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ค๊ณํ ์ ์๋ค.
์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น ์์น
ํด๋ผ์ด์ธํธ: ์ฝ๊ฒ ์๋ณ์กฐ๊ฐ ๊ฐ๋ฅํด ๋ณด์์ ์ทจ์ฝํ์ฌ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ์ง ์์
์๋ฒ: ์๋ฒ ์ธก์ ์ ํ ์ฅ์น๋ฅผ ๋์ด ์ฒ๋ฆฌ์จ์ ์ ํํ๋ ๋ฐฉ์
๋ฏธ๋ค์จ์ด: API ์๋ฒ๋ก ๊ฐ๋ ์์ฒญ์ ํต์ ํ๋ ๋ฏธ๋ค์จ์ด ์ถ๊ฐ
API ๊ฒ์ดํธ์จ์ด: SSL ์ข ๋จ / ์ฌ์ฉ์ ์ธ์ฆ / IP ํ์ฉ ๋ชฉ๋ก ๋ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ด๋ฏธ API ๊ฒ์ดํธ์จ์ด๋ฅผ ์ฌ์ฉ ์ค์ด๋ผ๋ฉด ์ฌ๊ธฐ์ ์ถ๊ฐ
์ฒ๋ฆฌ์จ ์ ํ ์๊ณ ๋ฆฌ์ฆ
์ฒ๋ฆฌ์จ ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฏธ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์กด์ฌํ๋ฉฐ, ๊ฐ๊ธฐ ๋ค๋ฅธ ์ฅ๋จ์ ์ด ์กด์ฌํ๋ค.
1. ํ ํฐ ๋ฒํท ์๊ณ ๋ฆฌ์ฆ
์ฒ๋ฆฌ์จ ์ ํ์ ํญ ๋๊ฒ ์ด์ฉ๋๊ณ ์์ผ๋ฉฐ, ๊ฐ๋จํ๊ณ ๋ณดํธ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ค.(์๋ง์กด, ์คํธ๋ผ์ดํ ๋ฑ)
์ง์ ๋ ์ฉ๋์ ๊ฐ์ง ํ ํฐ ๋ฒํท ์กด์ฌ
์ฌ์ ์ค์ ๋ ์์ ํ ํฐ์ด ์ฃผ๊ธฐ์ ์ผ๋ก ์ฑ์์ง
๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ ๋๋ง๋ค ํ๋์ ํ ํฐ ์ฌ์ฉ(ํ ํฐ์ด ์์ผ๋ฉด ์์ฒญ ์ฒ๋ฆฌ X)
ํต์์ ์ผ๋ก API ์๋ํฌ์ธํธ๋ง๋ค ๋ณ๋์ ๋ฒํท์ ๋์ด ์ฒ๋ฆฌ์จ ์ ํ์ ์ ์ฉ
IP ์ฃผ์๋ณ๋ก ์ฒ๋ฆฌ์จ ์ ํ์ ์ ์ฉํด์ผ ํ๋ค๋ฉด IP ์ฃผ์๋ณ๋ก ๋ณ๋์ ๋ฒํท์ ๋
๊ตฌํํ๊ธฐ ์ฝ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ธก๋ฉด์์ ํจ์จ์ ์ด๋ฉด์ ๋จ๊ธฐ๊ฐ ์ง์ค๋๋ ํธ๋ํฝ ์ฒ๋ฆฌ๋ ๊ฐ๋ฅํ ์ฅ์ ์ด ์์ง๋ง, ๋ฒํท ํฌ๊ธฐ์ ํ ํฐ ๊ณต๊ธ๋ฅ ์ด๋ผ๋ ๋ ๊ฐ์ง ์ธ์๋ฅผ ์ ์ ํ๊ฒ ํ๋ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
2. ๋์ถ ๋ฒํท ์๊ณ ๋ฆฌ์ฆ
ํ ํฐ ๋ฒํท ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น์ทํ์ง๋ง ์์ฒญ ์ฒ๋ฆฌ์จ์ด ๊ณ ์ ๋์ด ์๋ ์ ์ด ๋ค๋ฅด๋ฉฐ, ๋ณดํต FIFO ํ๋ก ๊ตฌํํ๋ค.
์์ฒญ์ด ๋์ฐฉํ๋ฉด ํ๊ฐ ๊ฝ ์ฐจ ์๋์ง ํ์ธ
๋น์๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ์ ํ์ ์์ฒญ์ ์ถ๊ฐ(๋น์๋ฆฌ๊ฐ ์์ผ๋ฉด ์์ฒญ ์ฒ๋ฆฌ X)
์ง์ ๋ ์๊ฐ๋ง๋ค ํ์์ ์์ฒญ์ ๊บผ๋ด์ด ์ฒ๋ฆฌ
ํ์ ํฌ๊ธฐ๊ฐ ์ ํ๋์ด ์์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ธก๋ฉด์์ ํจ์จ์ ์ด๊ณ , ๊ณ ์ ๋ ์ฒ๋ฆฌ์จ๋ก ์์ ์ ์ถ๋ ฅ์ ์ ํฉํ๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ๋จ๊ธฐ๊ฐ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ ๊ฒฝ์ฐ ํ์ ์์ฒญ์ด ์์ฌ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ์์ฒญ์ด ๋ง์์ง ์ ์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฒํท ํฌ๊ธฐ(ํ ์ฌ์ด์ฆ)์ ๋์ถ ์๋(์ฒ๋ฆฌ์จ)๋ฅผ ์ ์ ํ๊ฒ ํ๋ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
3. ๊ณ ์ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ
ํน์ ์๊ฐ ๋์ ์ฒ๋ฆฌํ ์ ์๋ ์์ฒญ์ ์๋ฅผ ์ ํํ๋ ๋ฐฉ์์ผ๋ก, ๋์ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ์๋ผ์ธ์ ๊ณ ์ ๋ ๊ฐ๊ฒฉ์ ์๋๋ก ๋๋๊ณ , ๊ฐ ์๋๋ง๋ค ์นด์ดํฐ๋ฅผ ๋
์์ฒญ์ด ์ฌ ๋๋ง๋ค ์นด์ดํฐ์ ๊ฐ์ 1์ฉ ์ฆ๊ฐ
ํด๋น ์นด์ดํฐ์ ๊ฐ์ด ์ค์ ๋ ์๊ณ์น๋ฅผ ์ด๊ณผํ๋ฉด ์์ฒญ ์ฒ๋ฆฌ X
์ ์๋๊ฐ ์์๋๋ฉด ์นด์ดํฐ๋ฅผ ์ด๊ธฐํ
๋ฉ๋ชจ๋ฆฌ ํจ์จ์ด ์ข๊ณ , ์ค๊ณํ๊ธฐ ์ฝ๊ณ , ํน์ ํ ํธ๋ํฝ ํจํด์ ์ฒ๋ฆฌํ๊ธฐ์ ์ ํฉํ๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ์๋ ๊ฒฝ๊ณ ๋ถ๊ทผ์์ ๋ง์ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ ๊ฒฝ์ฐ, ๊ธฐ๋ํ๋ ์ฒ๋ฆฌ ํ๋๋ณด๋ค ๋ง์ ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋ ์ ์๋ค.
4. ์ด๋ ์๋ ๋ก๊น
์๊ณ ๋ฆฌ์ฆ
๊ณ ์ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ์๋ ์๋ ๊ฒฝ๊ณ ๋ถ๊ทผ์์ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ์์ด, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ ์๋ ๋ก๊น ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋ค.
์์ฒญ์ ํ์์คํฌํ๋ฅผ ๋ก๊ทธ์ ์ถ๊ฐ(๋ณดํต ๋ ๋์ค์ Sorted Set ๊ฐ์ ์บ์์ ๋ณด๊ด)
์ ์์ฒญ์ด ์ค๋ฉด ํ์ฌ ์๋์ ์์ ์ง์ ๋ณด๋ค ์ค๋๋ ํ์์คํฌํ ์ ๊ฑฐ(ex. ์๊ฐ ๋จ์ 1๋ถ / ์ ์์ฒญ ์๊ฐ 1:01:40 ์ธ ๊ฒฝ์ฐ 1:00:40 ์ด์ ๋ก๊ทธ ์ ๊ฑฐ)
๋ก๊ทธ์ ํฌ๊ธฐ๊ฐ ์ค์ ๋ ์์น๋ฅผ ์ด๊ณผํ๋ฉด ์์ฒญ ์ฒ๋ฆฌ X(์ฒ๋ฆฌํ์ง ์์ง๋ง ๋ก๊ทธ์๋ ์ถ๊ฐ)
ํ์ฉ๋๋ ์์ฒญ์ ๊ฐ์๋ ์์คํ ์ ์ฒ๋ฆฌ์จ ํ๋๋ฅผ ํญ์ ๋์ง ์๊ฒ ๋๋ ์ฅ์ ์ด ์์ง๋ง, ๊ฑฐ๋ถ๋ ์์ฒญ์ ํ์์คํฌํ๋ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ์ ์๋ค.
5. ์ด๋ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ
๊ณ ์ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ด๋ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฐํฉํ ๊ฒ์ผ๋ก, ๋์ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ฌ ์๋ ์์ฒญ ์ + ์ง์ ์๋์ฐ ์์ฒญ ์ * ์ด๋ ์๋์ ์ง์ ์๋์ฐ ๊ฒน์น๋ ๋ถ๋ถ์ ๋น์จ
ex. ํ์ฌ ์๋ ์์ฒญ ์ 50 / ์ง์ ์๋ ์์ฒญ ์ 150 / ๊ฒน์น๋ ๋ถ๋ถ ๋น์จ 50% -> 50 + 150 * 0.5 = 125
์ด์ ์๊ฐ๋๋ฅผ ๊ณ ๋ คํ์ฌ ํ์ฌ ์๋ ์ํ๋ฅผ ๊ณ์ฐํ๋ฏ๋ก ๋จ๊ธฐ๊ฐ ์ง์ค ํธ๋ํฝ๋ ์ ๋์ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ธก๋ฉด์์ ํจ์จ์ ์ด๋ค. ํ์ง๋ง ์ง์ ์๋ ์์ฒญ์ ๊ท ๋ฑํ๊ฒ ๋ถํฌ๋์ด ์๋ค๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ค์ ์ํ์ ๋ง์ง ์๊ฒ ํ์ฉ๋๊ฑฐ๋ ๊ฑฐ๋ถ๋๋ ์์ฒญ์ด ๋ฐ์ํ ์ ์๋ค.(ํด๋ผ์ฐ๋ํ๋ ์ด์์ ์คํ์ ๋ฐ๋ฅด๋ฉด 0.003%)
์นด์ดํฐ ๋ณด๊ด ์ฅ์
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋์คํฌ ์ ๊ทผ ์๋ ๋ฌธ์ ๋ก ์ฌ์ฉ๋์ง ์๊ณ , ์ ๊ทผ ์๋๊ฐ ๋น ๋ฅด๊ณ , ์๊ฐ ๊ธฐ๋ฐ ๋ง๋ฃ ์ ์ฑ ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์บ์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ์ค์ ๋ก ๋ ๋์ค๋ฅผ ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๋ฅผ ๊ตฌํํ ๋ ์์ฃผ ์ฌ์ฉ๋๋๋ฐ, ๋ ๊ฐ์ง ๋ช ๋ น์ด๋ก ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๋ฅผ ๊ตฌํํ ์ ์๋ค.
INCR: ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ์นด์ดํฐ ๊ฐ์ 1๋งํผ ์ฆ๊ฐ
EXPIRE: ์นด์ดํฐ์ ํ์์์ ๊ฐ ์ค์
์์ธ ์ค๊ณ
์ฒ๋ฆฌ์จ ์ ํ ๊ท์น
์ฒ๋ฆฌ์จ ์ ํ ๊ท์น์ ๋ณดํต ์ค์ ํ์ผ ํํ๋ก ๋์คํฌ์ ๋ณด๊ด ๋์ด, ์บ์์ ๋ก๋๋์ด ์ฌ์ฉ๋๋ค. ์๋ ์์๋ ๋ง์ผํ ์ธ๋ฏธ์ง์ ์ต๋์น๋ฅผ 5๋ก ์ค์ ํ ๊ท์น์ด๋ค.
ํ๋ ์ด๊ณผ๋ ์์ฒญ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
ํ๋ ์ ํ์ ๊ฑธ๋ฆฌ๊ฒ ๋๋ฉด API๋ ๋ณดํต HTTP 429 Too Many Requests ์ํ ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๊ฒ ๋๋ค. ์ถ๊ฐ์ ์ผ๋ก HTTP ํค๋์ ํ๋ ์ ํ์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฅผ ์ดํดํ๊ณ ์ ์ ํ ๋์ํ ์ ์๋๋ก ํ ์ ์๋ค.
X-RateLimit-Limit: ๋งค ์๋ ์ ์กํ ์ ์๋ ์์ฒญ์ ์
X-RateLimit-Remaining: ์๋ ๋ด์ ๋จ์ ์์ฒญ์ ์
X-RateLimit-Retry-After: ๋ค์ ์์ฒญ๊น์ง ๋๊ธฐํด์ผ ํ๋ ์๊ฐ(์ด)
์ฒ๋ฆฌ๊ฐ ์ ํ๋ ์์ฒญ์ ์ ์ฑ ์ ๋ฐ๋ผ์๋ ์์ฒญ๋ ์ฒ๋ฆฌ๋ฅผ ๋ฌด์ํ๊ฑฐ๋, ๋์ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ ๋ณด๊ดํ ์๋ ์๋ค.
์์ฒญ ์ฒ๋ฆฌ ํ๋ก์ธ์ค
ํด๋ผ์ด์ธํธ ์๋ฒ์ ์์ฒญํ๊ฒ ๋๋ฉด, ํด๋น ์์ฒญ์ ์ฒ๋ฆฌ์จ ์ ํ ๋ฏธ๋ค์จ์ด์ ๋์ฐฉ
์บ์๋ ๊ท์น๊ณผ ์นด์ดํฐ ๋ฐ ๋ง์ง๋ง ์์ฒญ์ ํ์์คํฌํ ์กฐํ
์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ์ฒ๋ฆฌ
์ ํ์ ๊ฑธ๋ฆฌ์ง ์์ ๊ฒฝ์ฐ: API ์๋ฒ๋ก ์์ฒญ ์ ๋ฌ
์ ํ์ ๊ฑธ๋ฆฐ ๊ฒฝ์ฐ: ํด๋ผ์ด์ธํธ์ ์๋ฌ ์๋ต(429 Too Many Requests), ๋ฒ๋ ค์ง ์์ฒญ์ ์ ์ฑ ์ ๋ฐ๋ผ ๋ฌด์ํ๊ฑฐ๋ ๋ฉ์์ง ํ์ ๋ณด๊ด
๋ถ์ฐ ํ๊ฒฝ์์์ ์ฒ๋ฆฌ์จ ์ ํ
๋ถ์ฐ ํ๊ฒฝ์์๋ ์ฒ๋ฆฌ์จ ์ ํ์ ์ํด ์ฌ๋ฌ ์๋ฒ์ ๋ณ๋ ฌ ์ค๋ ๋๋ฅผ ์ง์ํ๊ธฐ ์ํด ์๋ ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
๊ฒฝ์์กฐ๊ฑด
์ฌ๋ฌ ์๋ฒ๊ฐ ๋์์ ๋์ผํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ ๋ฌธ์
ํด๊ฒฐ ๋ฐฉ๋ฒ: ๋ฃจ์ ์คํฌ๋ฆฝํธ ํน์ ๋ ๋์ค ์ ๋ ฌ ์งํฉ ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ
๋๊ธฐํ
์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๊ฐ ์ฌ๋ฌ ๋ ๋๊ฒ ๋์ ๋, ๊ฐ ์ ํ ์ฅ์น์ ์นด์ดํฐ๊ฐ ๋๊ธฐํ๋์ด์ผ ํ๋ ๋ฌธ์
ํด๊ฒฐ ๋ฐฉ๋ฒ: ๊ณ ์ ์ธ์ ์ ํ์ฉํด ํญ์ ๋์ผํ ์ ํ ์ฅ์น๋ก ์์ฒญ์ ๋ณด๋ด๊ฑฐ๋, ๋ ๋์ค ๊ฐ์ ์ค์ ์ง์คํ ์ ์ฅ์ ์ฌ์ฉ
์ถ๊ฐ์ ์ธ ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ
๋ค์ํ ๊ณ์ธต์์์ ์ฒ๋ฆฌ์จ ์ ํ
์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต๋ฟ๋ง ์๋๋ผ, ๋คํธ์ํฌ ๊ณ์ธต์ธ Iptables๋ฅผ ์ฌ์ฉํ์ฌ IP ์ฃผ์์ ์ฒ๋ฆฌ์จ ์ ํํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ ์ธก์์ ์ฒ๋ฆฌ
์บ์๋ฅผ ์ฌ์ฉํด API ํธ์ถ ํ์ ๊ฐ์
์ฒ๋ฆฌ์จ ์ ํ์ ์๊ณ์น๋ฅผ ๊ณ ๋ คํด, ๋จ๊ธฐ๊ฐ ๋ง์ ์์ฒญ์ ๋ณด๋ด์ง ์๋๋ก ํด๋ผ์ด์ธํธ ์ธก์์ ์ ํ
์ฌ์๋ ๋ก์ง์์ ์ถฉ๋ถํ ๋ฐฑ์คํ ์๊ฐ์ ๋
์ฐธ๊ณ ์๋ฃ
Last updated
Was this helpful?