[Network] Rate Limit๊ณผ Throttling ์ดํด
์๋ ํ์ธ์. ์ค๋ ํฌ์คํ ํ ๊ธ์ ์ค๋๋ง์ ํ๋ก๊ทธ๋๋ฐ์ด ์๋ ๋คํธ์ํฌ ์ด๋ก ์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณด๊ณ ์ ํฉ๋๋ค. ๋ฐฑ์๋ ์์ง๋์ด๋ฅผ ํ๊ณ ๊ณ์ ๋ถ๋ค์ด๋ผ๋ฉด ์๋ฒ ๊ฐ๋ฐ ๋ฟ ์๋๋ผ ๋ฏธ๋ค์จ์ด์ ํต์ ์ ์ํด ๋คํธ์ํฌ ์ง์์ ๊ณต๋ถํ๊ณ ์์ด์ผ ํ๋๋ฐ์. ์์ ์ด ๊ฐ๋ฐํ๋ API ์๋ฒ๊ฐ ํ๋์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ ๋ค๋ฅธ ์ฌ๋ฌ ๋ง์ดํฌ๋ก์๋น์ค ํน์ ์ํํธ์จ์ด๋ค์ด ์์กดํ๋ค๋ฉด ๊ฐ์ฅ ๋จผ์ ๊ณ ๋ฏผํด์ผ ํ ๊ฒ์ด ๋ฐ๋ก ํธ๋ํฝ์ผ ๊ฒ์ ๋๋ค.
๋์ฉ๋ ํธ๋ํฝ์ด ๋ฐ์ํ๋ฉด ์ด๋ป๊ฒ ๋์ฒํด์ผ ํ ๊น์? ๋ฌผ๋ก ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ค์ผ์ผ ์ (Scale up)์ด๋ ์ค์ผ์ผ ์์(Scale out) ๊ฐ์ด ๋ฆฌ์์ค๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๊ฐ๋ฐํ๋ ์๋ฒ๊ฐ ์ธ๋ถ API์ ์๋ต ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ๋ค ์ค๋ค๊ฑฐ๋, ๋น์ฉ์ ์ธ ๋ฌธ์ ๋ก
๋ฆฌ์์ค๋ฅผ ๋๋ฆด ์ ์๋ ๊ฒฝ์ฐ์๋ ๋งค์ฐ ๋๊ฐํ ๊ฒ์ ๋๋ค.
Throttling
์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ผ๋ถ ์์์ ์ด์ฉ์ ์ ํ ํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ์ฐ๋กํ๋ง(Throttling)์ ๋๋ค. Throttling์ ์ผ๋ฐ์ ์ผ๋ก ์์์ ์ฌ์ฉ์ ์ ํํ๊ฑฐ๋ ์กฐ์ ํ์ฌ ์ผ์ ํ ์๋๋ก ์ฒ๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋คํธ์ํฌ์์ ์ผ๋ถ ํด๋ผ์ด์ธํธ์ ๊ณผ๋ํ ์ฌ์ฉ์ผ๋ก ํธ๋ํฝ ๋ถํ๋ฅผ ๋ฐฉ์งํ๊ณ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์ QoS(์๋น์ค ํ์ง)์ ์ง์ผ๋ผ ์ ์์ต๋๋ค.
Throttling์ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ ํธ๋ํฝ์ ์์ฒญ์ ์๋ฅผ ์ ํํ๊ฑฐ๋ ์ ์ดํจ์ผ๋ก์จ ํน์ ์ฌ์ฉ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด API๋ฅผ ๊ณผ๋ํ๊ฒ ํธ์ถํ๋ ๊ฒ์ ๋ง๋ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๋ฌด์์ ๋ง๊ธฐ๋งํด์๋ ์คํ๋ ค ํธ๋ํฝ์ ์ ์ด๊ฐ ์๋ ํน์ ์ฌ์ฉ์์ ๋ฐด(ban)์ผ๋ก ์ด์ด์ง๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ์ ํ๊ฒ ์กฐ์ ํ๋ ๊ฒ์ด ์ค์ํ๋ฐ, ์ด๋ฅผ ์ํด ์ด๋น ํ์ฉ๋๋ ์์ฒญ ์๋ฅผ ์ ํํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ฐ๋ฆฌ๋ RateLimit์ด๋ผ ํ๋ฉฐ ์์คํ ๋ถํ๋ฅผ ์ค์ด๊ณ , ๋๊ธฐ์ด์ด๋ ์ค๋ฒ๋ก๋๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
RateLimit
RateLimit์ API ๋๋ ์น ์๋น์ค์์ ์์ฒญ ์๋๋ฅผ ์ ํํ๋ ๋งค์ปค๋์ฆ์ ๋๋ค. ๋ง์ฝ ํน์ ์๋น์ค ํน์ IP ์ฃผ์์์ ๋ง์ ํธ๋ํฝ์ ๋ฐ์์ํค๊ณ ์๋ค๋ฉด ๋ค๋ฅธ IP ํน์ ์๋น์ค์์ ์์ ์ด ๊ฐ๋ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ์ ์ํ ์ ์๋ ์๋น์ค ์ฅ์ ํน์ ๊ฑฐ๋ถ ํ์์ด ๋ฐ์ํ ์ ์๋๋ฐ, ์ด๋ฅผ ์ ํน์ ์๋๋ก ์กฐ์ ํจ์ผ๋ก์จ ์์ ์ ์๋น์ค์ ํ์ง์ ์ ์ง์ํฌ ์ ์์ต๋๋ค.
ํํ ์๋ก ํฌํธ์์ ์ฌ์ฉํ๋ ์ง๋ API, ๋ฒ์ญ API ๋ฑ์ด ๋ํ์ ์ธ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๋ค์ด ์๋ก ์ํ๋ ์์ฒญ์ ์งํํ๋๋ฐ, ํ ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ์๋ฒ์ ๋ฆฌ์์ค๋ฅผ ๋ ์ ํด์ ์ฌ์ฉํ๋ค๋ฉด ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ ๋๊ฐ์ด ์ง๋ถํ ๋น์ฉ๋งํผ ํ์ง์ ๋ณด์ฅ๋ฐ์ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ RateLimit ๊ธฐ๋ฒ ๋ฑ์ ํตํด ๋์ผํ ํ์ง์ ๋ณด์ฅํ ์ ์๋๋ก ํด์ค์ผ ํฉ๋๋ค.
์ข ๋ ์ดํด๊ฐ ์ฝ๊ฒ ๋๋๋ก ์ํ์ค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ์ค๋ช ํด๋ณด์๋ฉด, ์ฌ์ฉ์๊ฐ HTTP API ํธ์ถ์ ๋ ๋ฆฌ๋ฉด Rate Limiter๊ฐ ์ด ์์ฒญ์ ๋์ ๋ฐ์ ์์ฒญ ํ์๊ฐ ์ ํ๋์ด ์๋์ง๋ฅผ ํ์ธํ ํ ์ ํ ํ์๋ฅผ ์ด๊ณผํ์ง ์์๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ตํ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด Rate Limiter๊ฐ ํ์ฌ ์ํ๋ฅผ ์๋ตํ๋ ๊ตฌ์กฐ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ Rate Limit์ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น์?
Rate Limit์ ๊ตฌํ์ ์ํด ๋ฏธ๋ฆฌ ์ ์๋์ด ์๋ ์๊ณ ๋ฆฌ์ฆ๋ค์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ด์ฉํ์ฌ ์๋น์ค์ ๋ง๋ Rate Limit์ ๊ตฌํํ์ฌ ์ ์ฉํ ์ ์๊ณ , ๋ง์ดํฌ๋ก์๋น์ค๋ผ๋ฉด ๊ฒ์ดํธ์จ์ด์์ ์ ๊ณตํด์ฃผ๋ Rate Limit ๊ตฌํ์ฒด๋ฅผ ์ด์ฉํ ์๋ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Rate Limit ๊ตฌํ์ฒด๋ฅผ ์ ๊ณตํ๋ ํ๋ ์์ํฌ ํน์ ๊ฒ์ดํธ์จ์ด๋ ์๋์ ๊ฐ์ต๋๋ค.
- nginx Rate Limit
- Spring Cloud Rate Limit
๊ฒ์ดํธ์จ์ด๋ฅผ ์์ง ์ ์ ํ์ง ๋ชปํ๊ฑฐ๋ ๊ณ ๋ คํ๊ณ ์๋ค๋ฉด ์์ 3๊ฐ์ง๋ฅผ ๊ณ ๋ คํด๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค. nginx์ Rate Limit ๊ธฐ๋ฅ์ ์ฐ๋ฆฌ๊ฐ Rate Limit์ ๋ํด์ ์์ธํ ์๊ณ ์์ง ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋จ์ ํ๋ก์๋ฅผ ๋๊ณ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ํธ๋ํฝ์ ์กฐ์ ์ํฌ ์ ์์ต๋๋ค.
https://www.nginx.com/blog/rate-limiting-nginx/
NGINX Rate Limiting
Protect your applications from excessive traffic, including DDoS attacks, by controlling the requests they receive with NGINX rate limiting.
www.nginx.com
์ ํ์ด์ง๋ฅผ ํตํด nginx์์ Rate Limit์ ์ด์ฉํ๋ ๋ฐ ๋ง์ ๋์์ ๋ฐ์ ์ ์์ต๋๋ค. limit_req_zone ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ IP ์ฃผ์๋ณ๋ก ํธ๋ํฝ ํธ์ถ๋์ ์กฐ์ ์ํฌ ์ ์๊ณ , ์ด๋น ์ ํ๋์ ์ง์ ํ๋ ๋ฑ ๊ฐ๋จํ ์ฝ๋๋ก ์ฝ๊ฒ ์์ฒญ ์ ํ์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด ์ธ์๋ ์๊ฐ ํธ๋ํฝ(์งง์ ์๊ฐ ๋ด ๋ค์ด์ค๋ ํธ๋ํฝ)์ ์ ์ดํ๊ธฐ ์ํ Handling Bursts ๊ธฐ๋ฅ ๋ฑ์ ์ ๊ณตํ์ฌ ๋ ๋ง์ ํธ๋ํฝ์์๋ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์๋ ๊ตฌํ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ์ง๋ง nginx๋ฅผ ์ฌ์ฉํ ๋๋ ์ง์ ๋ ํค๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ํ๊ณ์ ์ด ์์ต๋๋ค. ๋ฌผ๋ก ์ฌ์ฉํ๋ ค๋ ํด๋ผ์ด์ธํธ ์ธก์์ ํค๋ ๊ฐ์ ์ง์ ํ ์ ์๋ค๋ฉด ์ข๊ฒ ์ง๋ง ๊ทธ๋ ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๊ฐ ์๋น์ค์์ ๋ค์ด์ค๋ ํธ๋ํฝ๋ค์ด ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฑ์ผ๋ก ๋ถ์ฐ๋์ด ์์ ๋ ์ ์ ํ ์ ์ดํ๊ธฐ ์ํด ํธ๋ํฝ ์์ ์ ๋์ ์ผ๋ก ๊ณ์ฐํ์ฌ ์ค์ ํด์ผ ํ๋ค๋ ๊ด๋ฆฌ ๋ถ๋ด์ด ์ปค์ง๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ์ ์ธ ์น ์๋ฒ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ดํธ์จ์ด ๋ณด๋ค๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ ํํ์ ๊ฒ์ดํธ์จ์ด๋ฅผ ํตํด ์ถ๊ฐ์ ์ธ ์๊ตฌ ์ฌํญ์ ๊ฐ๋ฐํ ์ ์๋ ๊ฒ์ดํธ์จ์ด๊ฐ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
https://spring.io/blog/2021/04/05/api-rate-limiting-with-spring-cloud-gateway
API Rate Limiting with Spring Cloud Gateway
One of the imperative architectural concerns is to protect APIs and service endpoints from harmful effects, such as denial of service, cascading failure. or overuse of resources. Rate limiting is a technique to control the rate by which an API or a service
spring.io
๊ทธ๋ฐ ๊ฒฝ์ฐ๋ผ๋ฉด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ ์ค์์๋ Spring Cloud Gateway๋ Spring ํ๋ ์์ํฌ์ ๋ง์ถฐ RateLimit ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฉฐ ์ด๋ค ๊ตฌํ์ฒด์๋ Redis๋ฅผ ์ด์ฉํ Rate Limit ๊ตฌํ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค. Spring Webflux๋ฅผ ๋ฐํ์ผ๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ Spring Webflux๋ก ๋์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ Rate Limit์ ๊ตฌํํ๊ณ ์ ํ๋ค๋ฉด ์ข์ ์ ํ์ด ๋ ๊ฒ์ ๋๋ค.
Spring Cloud ์คํ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ฐํด ๋ณผ ์ ์์ต๋๋ค. ํ ๊ฐ์ง๋ Spring Cloud Gateway๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ ์๋จ์ ๋๊ณ , ํธ๋ํฝ์ ๋ฐ์ ์ ์ดํ๋ ๋ฐฉ๋ฒ๊ณผ ์ง์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ๊ตฌํํ์ฌ ์ง์ ํธ๋ํฝ์ ๋ฐ์ Filter ๋ฑ์ ํ์ฉํ์ฌ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
Spring Cloud Gateway๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ ์๋จ์ ๋๊ฒ ๋๋ค๋ฉด ํด๋ผ์ด์ธํธ๋ Spring Cloud Gateway ์ฃผ์๋ฅผ ํธ์ถํ๊ฒ ๋ ๊ฒ์ด๋ฉฐ ์ฌ๊ธฐ์ Rate Limit ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ํฝ์ ์กฐ์ ํ ์ ์์ต๋๋ค. ์์ nginx์์ ๊ฐ ์ฌ์ฉ์๋ณ ์๋น์ค ํธ๋ํฝ ๊ด๋ฆฌ๋ฅผ ์ํด ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ํตํ์ฌ ์ฌ์ฉ์ ์๋ณ ์ ๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์ฌ์ ์ ์ ์ฅํด๋์ด Redis๋ก๋ ํ์ฌ ํธ๋ํฝ ํธ์ถ๋์ ์ ์ดํ๊ณ , ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ ์ฌ์ฉ์์๊ฒ ํ ๋นํ ์ด๊ธฐ ํธ๋ํฝ ์กฐ์ ๋๊ณผ ์ค์ ๊ฐ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ๋๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
mix
๋ง์ฝ ์ด๋ฏธ ์ ํ๋ฆฌ์ผ์ด์ ์ด Spring ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์ด ์๋ค๋ฉด ์ง์ Spring Cloud์ RateLimit ๊ตฌํ์ฒด๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ตฌํํ์ฌ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด Filter ๋ด์ง Interceptor ๋ฑ์ผ๋ก ์์ฒญ์ ํ ๋ฒ ๋ฐ์ ๋ค์ ํ์ฌ ํธ๋ํฝ ํธ์ถ๋ ๋ฑ์ ๊ณ ๋ คํ์ฌ ํธ๋ํฝ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ...
์์ฃผ ๊ฐ๋จํ๊ฒ Throttling๊ณผ Rate Limit์ ์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ ํ๋ ๊ธฐ์ ์คํ์ผ๋ก ๊ฐ๋ ์ ์ ํด๋ดค์ต๋๋ค. ๋น์ฅ Rate Limit์ ํ์ ์ ์ ์ฉํด์ผ ํ๋ค๋ฉด ์ด๋ฏธ ์ ๋ง๋ค์ด์ง ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค์ ๋ น์ด๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ง์ฝ Spring Cloud Gateway๋ฅผ ์ฌ์ฉํด์ผ ํ์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ Rate Limit์ ๊ตฌํํ์ฌ ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ ๋ฐ๋์ Spring ์คํ์ด Spring Webflux ์คํ์ด์ด์ผ ํฉ๋๋ค. ์๋ํ๋ฉด ํด๋น ๊ตฌํ์ฒด๊ฐ Netty ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์ด ์์ด Spring MVC์ ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค์ ํฌ์คํธ์์๋ Rate Limit์ ์ฌ๋ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'Infrastructure > Network' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Network] Load Balancing (๋ก๋ ๋ฐธ๋ฐ์ฑ)์ ๊ฐ๋ ๊ณผ ์ดํด (0) | 2020.06.02 |
---|---|
MQTT ํ๋กํ ์ฝ ๊ฐ๋ ๊ณผ ์ดํด (0) | 2017.08.26 |
๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ์ด - Socket (0) | 2017.04.09 |
IP MASQUERADE (0) | 2016.07.02 |
NAT (Network Address Translation) (0) | 2016.06.24 |