Rate Limiter - boostcampwm-2024/refactor-web36-QLAB GitHub Wiki
Rate Limiting์ ์๋ฒ์ ์์ ์ฑ์ ์ ์งํ๊ณ , ์์์ ๋จ์ฉ์ ๋ฐฉ์งํ๋ฉฐ, ๋ณด์ ๊ฐํ๋ฅผ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ, API Gateway, ์๋ฒ ๋ฑ ๋ค์ํ ์์น์์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ฌ๋ก
๐ก์ฌ์ฉ์๋ ์ด๋น 2ํ ์ด์์ ์ ๊ธ์ ์ฌ๋ฆด ์ ์๋ค
๊ฐ์ IP ์ฃผ์๋ก๋ ํ๋ฃจ์ 10๊ฐ ์ด์์ ๊ณ์ ์ ์์ฑํ ์ ์๋ค
๊ฐ์ ๋๋ฐ์ด์ค๋ก๋ ์ฃผ๋น 5ํ ์ด์ ๋ฆฌ์๋๋ฅผ ์์ฒญํ ์ ์๋ค
Rate Limiting์ ์ฃผ์ ๋ชฉ์
- DOS ๊ณต๊ฒฉ ๋ฐฉ์ง
- ์ ์์ ์ธ ํธ๋ํฝ์ผ๋ก๋ถํฐ ์๋ฒ๋ฅผ ๋ณดํธ.
- API ๊ณผ๊ธ ์ ์ฝ
- ์ 3์(Third-party) API ์ฌ์ฉ๋์ ์ ํํ์ฌ ๋น์ฉ ์ ๊ฐ.
- ์๋ฒ ๊ณผ๋ถํ ๋ฐฉ์ง
- ํธ๋ํฝ ํญ์ฆ์ผ๋ก ์ธํด ์๋ฒ๊ฐ ๋ค์ด๋์ง ์๋๋ก ์๋ฐฉ.
๊ตฌํ ์์น
- ํด๋ผ์ด์ธํธ
- ์ฌ์ฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฒญ ํ์๋ฅผ ์ง์ ์ ์ด.
- ๊ตฌํ์ด ์ฌ์ฐ๋ ์ ๋ขฐ๋๊ฐ ๋ฎ์(ํด๋ผ์ด์ธํธ๊ฐ ์ ํ์ ์ฐํํ ์ ์์).
- ๋ฏธ๋ค์จ์ด(API Gateway)
- API Gateway ์์ค์์ ํธ๋ํฝ ์ ์ด.
- ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ค๊ฐ ์ง์ ์ผ๋ก ๋์ ์ ๋ขฐ๋์ ๊ด๋ฆฌ ์ฉ์ด์ฑ ์ ๊ณต.
- ์๋ฒ
- ์๋ฒ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ฉฐ ์ ํ ์ ์ฉ.
- ๊ฐ์ฅ ์ ๋ขฐํ ์ ์์ผ๋ ๋ถํ๊ฐ ๋ ์ปค์ง ์ ์์.
์๊ณ ๋ฆฌ์ฆ
ํ ํฐ ๋ฒํท(token buket)
- ์ ํ๋ ํฌ๊ธฐ์ ๋ฒํท์ ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ์ผ์ ๊ฐ์์ ํ ํฐ์ ์ฃผ์ ํ๋ค
- ์์ฒญ์ด ์ค๋ฉด ํ ํฐ์ ์๋ชจํ๋ฉฐ ๋ฒํท์ด ๋น์ด์์ผ๋ฉด ์์ฒญ์ ๊ฑฐ๋ถํ๋ค
- ๋ฒํท์ ํฌ๊ธฐ๋ ์ต๋ ๊ฐ๋นํ ์ ์๋ ํธ๋ํฝ์ ์
- ํ ํฐ ์์ฑ์๋๋ ํ๊ท ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ํธ๋ํฝ์ ์
- ํด๋น API๋ ์ด๋น ์ต๋ 2๋ฒ๊น์ง ์คํ๋์ด์ผ ์๋น์ค๊ฐ ์ํํ ๋์๊ฐ
- ์ข์์๋ ํ ์ ์ ๋น ํ๋ฃจ์ 5๊ฐ์ฉ ๊น์ง๋ง ๋๋ฅผ ์ ์์
์ฅ์
- ๊ตฌํ์ด ์ฝ๋ค.
- ์งง์ ์๊ฐ์์ ์ง์ค๋๋ ํธ๋ํฝ์ ๋ํด ์ ํ์ด ๊ฐ๋ฅํ๋ค(๋ฒํท์ ์ต๋ ํฌ๊ธฐ)
๋จ์
- ์ ์ ํ ๋ฒํท์ ํฌ๊ธฐ์ ํ ํฐ ์์ฑ์๋๋ฅผ ํ๋ํ๊ธฐ ์ด๋ ต๋ค
๋์ถ ๋ฒํท(leaky buket)
- ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฒ๋ฆฌ์จ์ ์กฐ์ ํ๋ค
- ์์ฒญ์ด ์ค๋ฉด ํ์ ์ฝ์ ํ๊ณ ์ผ์ ์๊ฐ๋จ์๋ก ์ฒ๋ฆฌํ๋ค
- ํ๊ฐ ๊ฐ๋์ฐฌ ๊ฒฝ์ฐ ์ ์์ฒญ์ ๋ํด์๋ ๊ฑฐ๋ถํ๋ค.
์ฅ์
- ๊ณ ์ ๋ ์ฒ๋ฆฌ์จ์ ๊ฐ์ง๊ณ ์์ด ์์ ์ ์ด๋ค.
๋จ์
- ์ ์ฐ์ฑ์ด ๋ถ์กฑํ์ฌ ๋จ ๊ธฐ๊ฐ์ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ ๊ฒฝ์ฐ ์ต์ ์์ฒญ์ ๋ํด์๋ ์๋ตํ ์ ์๋ค.
๊ณ ์ ์๋์ฐ ์นด์ดํฐ(fixed window counter)
- ๊ณ ์ ๋ ์๋์ฐ(๊ฐ๊ฒฉ)๋ง๋ค ์ต๋ ์์ฒญ์ ์ง์ ํ๋ค.
- ์์ฒญ์ด ์ฌ๋ ๋ง๋ค ํด๋น ์๋์ฐ์ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ ์ํจ๋ค.
์ฅ์
- ๊ตฌํ์ด ์ฝ๊ณ ์ง๊ด์ ์ด๋ค.
๋จ์
- ์๋์ฐ ๊ฒฝ๊ณ๋ถ๋ถ์ ๋ํด ๋ง์ ํธ๋ํฝ์ด ๋ชฐ๋ ค๋ค ๊ฒฝ์ฐ ์ฒ๋ฆฌ๊ฐ ์ํํ์ง ๋ชปํ๋ค
- ์ด๋จ์๋ก counter๋ฅผ 3๊ฐ๋กํ์๋ 0.5
1์ 3๋ฒ 11.5์ 3๋ฒ ์์ฒญํ ๊ฒฝ์ฐ 1์ด๊ฐ๊ฒฉ์ 6๋ฒ์ ์์ฒญ์ ๋ฐ์์ผํ๋ค.
- ์ด๋จ์๋ก counter๋ฅผ 3๊ฐ๋กํ์๋ 0.5
์ด๋ ์๋์ฐ ๋ก๊ทธ(sliding window log)
- ๊ณ ์ ์๋์ฐ ์นด์ดํฐ์ ๋จ์ ์ ๋ณด์
- ์์ฒญ ๋ง๋ค timestamp๋ฅผ ๋ก๊น ํ๋ค
- ๊ณ ์ ๋ ์๋์ฐ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๊ณ ์์ฒญ ๋ฐ์ ์์ ๊ธฐ์ค ๋ง๋ฃ๋ ๋ก๊น ์ ์ ๊ฑฐํ๋ค.
- ์ ํจํ ๋ก๊น ์ ๊ฐ์๋ฅผ ํตํด ์ ํํ๋ค.
- ๊ฐ์๋ฅผ ์ด๊ณผํ์์ผ๋ฉด ์์ฒญ์ ์ฒ๋ฆฌํ์ง๋ ์๊ณ ๋ก๊น ์ ์ ์ฅํ๋ค.
์ฅ์
- ์ ๊ตํ๊ฒ ํธ๋ํฝ์ ์ ํํ ์ ์๋ค
๋จ์
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํฌ๋ค
์ด๋ ์๋์ฐ ์นด์ดํฐ(sliding window counter)
- ์์ฒญ์ด ์ฌ๋ ํด๋น ์๋์ฐ์ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐํ๋ค
- ์์ฒญ ๊ฑฐ์ ์ ๋ํด์๋ ํ์ฌ ์๋์ฐ ์นด์ดํฐ + ์ด์ ์๋์ฐ ์นด์ดํฐ*(๊ฐ๊ฒฉ ๋น์จ) ์ ๊ธฐ์ค์ผ๋ก ํ๋ค.
- ๋ง์ฝ ์๋์ฐ ํฌ๊ธฐ๊ฐ 1์ด์ด๊ณ 1.3์ด์ ์์ฒญ์ด ์์๋ ์ ์๋์ฐ๋ 70%๋งํผ ์ฐจ์งํ๋ฏ๋ก ์ ์๋์ฐ ์นด์ดํฐ*0.7๋ก ํ๋ค
์ฅ์
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ด๋ ์๋์ฐ ๋ก๊ทธ์ ๋นํด ์ ์
๋จ์
- ๋น์จ๋ก ํ๋ ๊ฒ์ ๊ท ๋ฑํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ ์ด๊ธฐ์ ์ฝ๊ฐ ๋์จํ์ง๋ง ํฌ์ง ์๋ค.