Alert

์ด ๊ธ€์€ Claude Code์˜ ๋„์›€์„ ๋ฐ›์•„ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

TL;DR

  • Reverse Proxy: ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ์•ž์—์„œ SSL ์ข…๋ฃŒ, ์บ์‹ฑ, ์••์ถ•, ๋ณด์•ˆ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘๊ฐœ ๊ณ„์ธต
  • Load Balancer: Reverse Proxy์— ์ง€๋Šฅ์  ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ ๋Šฅ๋ ฅ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ. L4(TCP)์™€ L7(HTTP) ๋ฐฉ์‹ ์กด์žฌ
  • API Gateway: HTTP๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด API ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์ธ์ฆ, ์†๋„ ์ œํ•œ, ๋ฒ„์ „ ๊ด€๋ฆฌ)๊นŒ์ง€ ์ค‘์•™ ์ฒ˜๋ฆฌ
  • ์‹ค์ œ ๋„๊ตฌ๋“ค(Nginx, Kong, Envoy)์€ ์„ธ ์—ญํ• ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋‚˜๋“ค๋ฉฐ ๋™์ž‘

Source


1. ๋‹จ์ผ ์„œ๋ฒ„์˜ ํ•œ๊ณ„

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์›น ๊ตฌ์กฐ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์ง์ ‘ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.

ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ ํŠธ๋ž˜ํ”ฝ์ด ์ ์„ ๋•Œ๋Š” ๋ฌธ์ œ์—†์ง€๋งŒ, ์„œ๋ฒ„๊ฐ€ ๊ณต๊ฐœ ์ธํ„ฐ๋„ท์— ์ง์ ‘ ๋…ธ์ถœ๋˜๋ฉด ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

  • SSL/TLS ์ฒ˜๋ฆฌ ๋ถ€๋‹ด: ๋ชจ๋“  HTTPS ์š”์ฒญ๋งˆ๋‹ค TLS ํ•ธ๋“œ์…ฐ์ดํฌ๋ฅผ ์„œ๋ฒ„๊ฐ€ ์ง์ ‘ ์ฒ˜๋ฆฌ. ์•”ํ˜ธํ™” ์—ฐ์‚ฐ์€ CPU๋ฅผ ๋งŽ์ด ์†Œ๋น„ํ•œ๋‹ค
  • ๋‹ค์ค‘ ์—ญํ•  ๊ณผ๋ถ€ํ•˜: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง ์‹คํ–‰, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ, ์ •์  ํŒŒ์ผ ์„œ๋น™, ์‘๋‹ต ์••์ถ•์„ ํ•œ ์„œ๋ฒ„๊ฐ€ ์ „๋ถ€ ๋‹ด๋‹น
  • ๋ณด์•ˆ ๋…ธ์ถœ: ์„œ๋ฒ„ IP๊ฐ€ DNS์— ๊ณต๊ฐœ๋˜์–ด ์žˆ์–ด ๋ˆ„๊ตฌ๋‚˜ ์Šค์บ”, ํƒ์ƒ‰, ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅ

๋น„์œ 

์™ธ๊ณผ์˜์‚ฌ๊ฐ€ ์ˆ˜์ˆ ์„ ํ•˜๋ฉด์„œ ๋™์‹œ์— ํ™˜์ž ์ ‘์ˆ˜, ์žฅ๋น„ ์†Œ๋…, ์ „ํ™” ์‘๋Œ€, ์ฒญ๊ตฌ ์—…๋ฌด๊นŒ์ง€ ์ฒ˜๋ฆฌํ•˜๋Š” ์ƒํ™ฉ๊ณผ ๊ฐ™๋‹ค. ๊ฒฐ๊ตญ ์ˆ˜์ˆ  ํ’ˆ์งˆ์ด ๋–จ์–ด์ง„๋‹ค.


2. Reverse Proxy

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ์•ž์— ๋†“๋Š” ๋ณดํ˜ธ ๊ณ„์ธต์ด Reverse Proxy๋‹ค.

Forward Proxy vs Reverse Proxy

๋‘ ๊ฐœ๋…์€ ์ด๋ฆ„์ด ๋น„์Šทํ•˜์ง€๋งŒ ๋ฐฉํ–ฅ์ด ๋ฐ˜๋Œ€๋‹ค.

๊ตฌ๋ถ„Forward ProxyReverse Proxy
๋Œ€๋ฆฌ ๋Œ€์ƒํด๋ผ์ด์–ธํŠธ์„œ๋ฒ„
์œ„์น˜ํด๋ผ์ด์–ธํŠธ ์•ž์„œ๋ฒ„ ์•ž
์„œ๋ฒ„ ์ž…์žฅ์›๋ž˜ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ชจ๋ฆ„ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹ค์ œ ์„œ๋ฒ„๋ฅผ ๋ชจ๋ฆ„
์˜ˆ์‹œํšŒ์‚ฌ VPN, IP ๋งˆ์Šคํ‚น ์„œ๋น„์ŠคNginx, Caddy, HAProxy

Forward Proxy๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋Œ€์‹ ํ•ด์„œ ์ธํ„ฐ๋„ท์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๊ณ , Reverse Proxy๋Š” ์„œ๋ฒ„๋ฅผ ๋Œ€์‹ ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.

Reverse Proxy๊ฐ€ ํ•˜๋Š” ์ผ
SSL ์ข…๋ฃŒ (SSL Termination)

TLS ํ•ธ๋“œ์…ฐ์ดํฌ๋Š” ์•”ํ˜ธํ™”, ํ‚ค ๊ตํ™˜, ์ธ์ฆ์„œ ๊ฒ€์ฆ์„ ํฌํ•จํ•˜๋Š” ๋น„์šฉ์ด ํฐ ์ž‘์—…์ด๋‹ค. Reverse Proxy๊ฐ€ ์—ฃ์ง€์—์„œ ์ด ์ž‘์—…์„ ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌํ•˜๋ฉด, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ ํ‰๋ฌธ HTTP๋งŒ ๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ โ”€HTTPSโ”€โ†’ [Reverse Proxy] โ”€HTTPโ”€โ†’ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„
                    (SSL ์ข…๋ฃŒ)          (๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ)
์บ์‹ฑ

๊ฐ™์€ ์ƒํ’ˆ ์นดํƒˆ๋กœ๊ทธ๋ฅผ 1,000๋ช…์ด ์š”์ฒญํ•œ๋‹ค๊ณ  ํ•˜์ž. Reverse Proxy๊ฐ€ ์—†์œผ๋ฉด ๋ฐฑ์—”๋“œ๊ฐ€ ๋™์ผํ•œ ์‘๋‹ต์„ 1,000๋ฒˆ ์ƒ์„ฑํ•œ๋‹ค. Reverse Proxy๊ฐ€ ์žˆ์œผ๋ฉด ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ๋งŒ ๋ฐฑ์—”๋“œ์— ๋„๋‹ฌํ•˜๊ณ , ๋‚˜๋จธ์ง€ 999๊ฐœ๋Š” ํ”„๋ก์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฆ‰์‹œ ์‘๋‹ตํ•œ๋‹ค.

์••์ถ•

์‘๋‹ต์ด ํ”„๋ก์‹œ๋ฅผ ๋– ๋‚˜๊ธฐ ์ „์— gzip์ด๋‚˜ Brotli๋กœ ์••์ถ•ํ•œ๋‹ค. ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์ž‘์•„์ง€๊ณ , ๋Œ€์—ญํญ์ด ์ค„๊ณ , ์‘๋‹ต ์‹œ๊ฐ„์ด ๋นจ๋ผ์ง„๋‹ค. ๋ฐฑ์—”๋“œ๋Š” ์••์ถ•์— CPU๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

๋ณด์•ˆ

์‹ค์ œ ์„œ๋ฒ„ IP๋Š” ํ”„๋ก์‹œ ๋’ค์— ์ˆจ๊ฒจ์ง„๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ํ”„๋ก์‹œ ๊ณ„์ธต๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์†๋„ ์ œํ•œ, ํ—ค๋” ๊ฒ€์ฆ, ์˜์‹ฌ์Šค๋Ÿฌ์šด ํŒจํ„ด ์ฐจ๋‹จ, ์ž˜๋ชป๋œ ํ˜•์‹์˜ ์š”์ฒญ ๊ฑฐ๋ถ€๋ฅผ ํ”„๋ก์‹œ ๋‹จ์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

Reverse Proxy์˜ ํ•œ๊ณ„

Reverse Proxy๋Š” ๋ฒ”์šฉ์ ์ด๋‹ค. ์—ฐ๊ฒฐ๊ณผ ๋ผ์šฐํŒ… ์ˆ˜์ค€์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค. /users์™€ /orders์˜ ์ฐจ์ด๋ฅผ ๋ชจ๋ฅด๊ณ , ์š”์ฒญ์ด ์ธ์ฆ๋˜์—ˆ๋Š”์ง€, ์–ด๋–ค API ๋ฒ„์ „์ธ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ์„ค์ •๋œ ๊ทœ์น™์— ๋”ฐ๋ผ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•  ๋ฟ์ด๋‹ค.

๋Œ€ํ‘œ ๋„๊ตฌ
  • Nginx
  • HAProxy
  • Caddy
  • Envoy

3. Load Balancer

Reverse Proxy๊ฐ€ SSL, ์บ์‹ฑ, ์••์ถ•, ๋ณด์•ˆ์„ ์ฒ˜๋ฆฌํ•ด๋„ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋‚จ๋Š”๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์„œ๋ฒ„๊ฐ€ ์—ฌ์ „ํžˆ ํ•œ ๋Œ€๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

ํŠธ๋ž˜ํ”ฝ์ด ๊ฐ‘์ž๊ธฐ 2๋ฐฐ, 3๋ฐฐ๋กœ ์ฆ๊ฐ€ํ•˜๋ฉด Reverse Proxy๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ๊ทธ ํ•œ ๋Œ€์˜ ๋ฐฑ์—”๋“œ์— ๊ณ„์† ์ „๋‹ฌํ•˜๊ณ , ๋ฐฑ์—”๋“œ๋Š” ๊ณผ๋ถ€ํ•˜์— ๋น ์ง„๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€๊ฐ€ ๋˜๋ฉด ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

  • ์–ด๋–ค ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ์ง€ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •ํ•  ๊ฒƒ์ธ๊ฐ€?
  • ํ•œ ์„œ๋ฒ„์— ๋น„์šฉ์ด ํฐ ์š”์ฒญ์ด ๋ชฐ๋ฆฌ๋ฉด?
  • ์„œ๋ฒ„ ํ•œ ๋Œ€๊ฐ€ ์ฃฝ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ์ œ์™ธํ•  ๊ฒƒ์ธ๊ฐ€?

์ด๊ฒƒ์ด Load Balancer๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋‹ค. Load Balancer๋Š” Reverse Proxy์— ์ง€๋Šฅ์  ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ ๋Šฅ๋ ฅ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์ด๋‹ค. ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ผ, ํ•œ ๊ฐ€์ง€ ํŠนํ™”๋œ ๊ธฐ์ˆ ์ด ์ง„ํ™”ํ•œ ํ˜•ํƒœ๋‹ค.

๋ถ„๋ฐฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜
Round Robin

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ์‹. ์š”์ฒญ์„ ์„œ๋ฒ„ A โ†’ B โ†’ C โ†’ A โ†’ B โ†’ C ์ˆœ์„œ๋กœ ๋Œ๋ฆฐ๋‹ค. ๋ชจ๋“  ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์ด ๊ฐ™๊ณ , ๋ชจ๋“  ์š”์ฒญ์˜ ๋น„์šฉ์ด ๋น„์Šทํ•  ๋•Œ ์ž˜ ๋™์ž‘ํ•œ๋‹ค.

Least Connections

ํ˜„์žฌ ํ™œ์„ฑ ์—ฐ๊ฒฐ์ด ๊ฐ€์žฅ ์ ์€ ์„œ๋ฒ„์— ๋‹ค์Œ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. ์š”์ฒญ๋งˆ๋‹ค ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๋‹ค๋ฅผ ๋•Œ (์บ์‹œ ํžˆํŠธ vs ๋ฌด๊ฑฐ์šด DB ์ฟผ๋ฆฌ) ํŠธ๋ž˜ํ”ฝ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฌ์œ  ์žˆ๋Š” ์„œ๋ฒ„๋กœ ํ๋ฅธ๋‹ค.

Weighted

์„œ๋ฒ„ ์„ฑ๋Šฅ์ด ๋‹ค๋ฅผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. RAM 64GB ์„œ๋ฒ„์—๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ๋†’๊ฒŒ, 16GB ์„œ๋ฒ„์—๋Š” ๋‚ฎ๊ฒŒ ์„ค์ •ํ•ด์„œ ๊ฐ•ํ•œ ์„œ๋ฒ„๊ฐ€ ๋” ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›๊ฒŒ ํ•œ๋‹ค.

IP Hash

ํด๋ผ์ด์–ธํŠธ IP๋ฅผ ํ•ด์‹œํ•ด์„œ ํ•ญ์ƒ ๊ฐ™์€ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ๋‹ค. ์„ธ์…˜ ์นœํ™”์„ฑ(session affinity)์— ์œ ์šฉํ•˜์ง€๋งŒ, ์š”์ฆ˜์€ ์ƒํƒœ ๋น„์ €์žฅ(stateless) ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํ™•์žฅ์— ์œ ๋ฆฌํ•˜๋ฏ€๋กœ ์„ ํ˜ธ๋„๊ฐ€ ๋‚ฎ๋‹ค.

L4 vs L7 Load Balancing

์ด ๊ตฌ๋ถ„์€ ์‹ค๋ฌด์—์„œ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

๊ตฌ๋ถ„L4 (์ „์†ก ๊ณ„์ธต)L7 (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต)
์ดํ•ดํ•˜๋Š” ๊ฒƒ[[11. TCP์™€ UDPTCP]] ์—ฐ๊ฒฐ, IP ์ฃผ์†Œ, ํฌํŠธ ๋ฒˆํ˜ธ
๋ผ์šฐํŒ… ๊ธฐ์ค€๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๋‹จ์œ„์š”์ฒญ ๋‚ด์šฉ ๊ธฐ๋ฐ˜
์†๋„๋งค์šฐ ๋น ๋ฆ„์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ
์œ ์—ฐ์„ฑ๋‚ฎ์Œ (๋‚ด์šฉ์„ ๋ชจ๋ฆ„)๋†’์Œ (URL ๊ฒฝ๋กœ๋ณ„ ๋ผ์šฐํŒ… ๊ฐ€๋Šฅ)
AWS ์˜ˆ์‹œNetwork Load Balancer (NLB)Application Load Balancer (ALB)

L7 Load Balancer๋Š” /api/users ํŠธ๋ž˜ํ”ฝ์€ ์‚ฌ์šฉ์ž ์„œ๋น„์Šค ํด๋Ÿฌ์Šคํ„ฐ๋กœ, /api/payments ํŠธ๋ž˜ํ”ฝ์€ ๋” ์•ˆ์ „ํ•œ ๊ฒฐ์ œ ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ณด๋‚ด๋Š” ์‹์˜ ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ—ฌ์Šค ์ฒดํฌ

Load Balancer์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ์ง€์†์ ์œผ๋กœ โ€œ์‚ด์•„ ์žˆ์–ด?โ€ ํ•‘์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต์ด ์—†์œผ๋ฉด ์ฆ‰์‹œ ํŠธ๋ž˜ํ”ฝ ํ’€์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

  • ํŠธ๋ž˜ํ”ฝ์€ ์ž๋™์œผ๋กœ ์ •์ƒ ์„œ๋ฒ„๋กœ ์žฌ๋ถ„๋ฐฐ๋œ๋‹ค
  • ์ƒˆ๋ฒฝ 3์‹œ์— ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์ผ์–ด๋‚˜์„œ ์ˆ˜๋™์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋Œ๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค
  • ์žฅ์•  ์„œ๋ฒ„๊ฐ€ ๋ณต๊ตฌ๋˜๋ฉด ์ž๋™์œผ๋กœ ํ’€์— ์žฌํ•ฉ๋ฅ˜ํ•œ๋‹ค

Load Balancer๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ

  1. ์ˆ˜ํ‰ ํ™•์žฅ์„ฑ: ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๋” ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  2. ๊ณ ๊ฐ€์šฉ์„ฑ: ๊ฐœ๋ณ„ ์„œ๋ฒ„ ์žฅ์• ๊ฐ€ ์ „์ฒด ์„œ๋น„์Šค ๋‹ค์šด์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์Œ

์ด ๋‘ ๊ฐ€์ง€๋Š” ์•ˆ์ •์„ฑ์„ ์œ„ํ•œ ๊ธฐ์ˆ ์—์„œ ๋‹ค๋ฃจ๋Š” ์ด์ค‘ํ™”, ๊ฐ€์šฉ์„ฑ ๊ฐœ๋…๊ณผ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ๋‹ค.


4. API Gateway

์„œ๋น„์Šค๊ฐ€ ์„ฑ์žฅํ•˜๋ฉด ๋ชจ๋†€๋ฆฌ์Šค๊ฐ€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ์ชผ๊ฐœ์ง€๋Š” ์‹œ์ ์ด ์˜จ๋‹ค. ์‚ฌ์šฉ์ž ์„œ๋น„์Šค, ์ฃผ๋ฌธ ์„œ๋น„์Šค, ๊ฒฐ์ œ ์„œ๋น„์Šค, ์•Œ๋ฆผ ์„œ๋น„์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ๋˜๊ณ  ํ™•์žฅ๋œ๋‹ค.

์ด๋ก ์ ์œผ๋กœ๋Š” ์™„๋ฒฝํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์‹œ์Šคํ…œ ์ž…๊ตฌ์—์„œ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ๋งŒ๋“œ๋Š” ์ค‘๋ณต ๋ฌธ์ œ
  • ์ธ์ฆ ์ค‘๋ณต: ๋ชจ๋“  ์„œ๋น„์Šค๊ฐ€ JWT ๊ฒ€์ฆ, API ํ‚ค ํ™•์ธ, ๊ถŒํ•œ ์ฒดํฌ๋ฅผ ๊ฐ์ž ๊ตฌํ˜„. 12๊ฐœ ์„œ๋น„์Šค์— ๋™์ผํ•œ ์ธ์ฆ ๋กœ์ง 12๋ฒŒ
  • ์†๋„ ์ œํ•œ ์ค‘๋ณต: ์„œ๋น„์Šค๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ทœ์น™, ๋‹ค๋ฅธ ์ž„๊ณ„๊ฐ’, ๋‹ค๋ฅธ ๋ฒ„๊ทธ๋กœ ์ œํ•œ ๋กœ์ง์„ ๊ตฌํ˜„
  • ๋ชจ๋‹ˆํ„ฐ๋ง ํŒŒํŽธํ™”: ํ•œ ํŒ€์€ ์ง€์—ฐ์‹œ๊ฐ„์„ ์ด๋ ‡๊ฒŒ, ๋‹ค๋ฅธ ํŒ€์€ ์—๋Ÿฌ๋ฅผ ์ €๋ ‡๊ฒŒ ๋กœ๊น…. ์žฅ์•  ์‹œ ์ „์ฒด ๊ทธ๋ฆผ์„ ๋ณผ ์ˆ˜ ์—†์Œ
  • ์š”์ฒญ ๋ณ€ํ™˜ ์ค‘๋ณต: ๋ชจ๋ฐ”์ผ ์•ฑ์€ JSON, ๋ ˆ๊ฑฐ์‹œ ๊ฒฐ์ œ ์‹œ์Šคํ…œ์€ XML. ๊ฐ ์„œ๋น„์Šค์— ๋ณ€ํ™˜ ๋กœ์ง์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์œ„์— ์–นํ˜€์ง

๊ฒฐ๊ณผ์ ์œผ๋กœ 12๊ฐœ์˜ ๋…๋ฆฝ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹ˆ๋ผ, 12๊ฐœ ํŒ€์ด ๊ฐ๊ฐ ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๊ฐ™์€ ์ธํ”„๋ผ ์ฝ”๋“œ์˜ 12๊ฐœ ๋ณต์‚ฌ๋ณธ์ด ๋œ๋‹ค.

API Gateway์˜ ์—ญํ• 

API Gateway๋Š” ์—ฌ์ „ํžˆ Reverse Proxy์ง€๋งŒ, ์ „ํ†ต์ ์ธ Reverse Proxy์™€ ๋‹ฌ๋ฆฌ API๋ฅผ ์ดํ•ดํ•œ๋‹ค. ๋‹จ์ˆœํžˆ HTTP ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์–ด๋–ค ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๊ณต๊ฐœ์ธ์ง€, ์ธ์ฆ์ด ํ•„์š”ํ•œ์ง€, ์–ด๋–ค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–ด๋–ค ๋“ฑ๊ธ‰์ธ์ง€ ์•Œ๊ณ  ์žˆ๋‹ค.

์ค‘์•™ ์ง‘์ค‘ ์ธ์ฆ
ํด๋ผ์ด์–ธํŠธ โ†’ [API Gateway: JWT ๊ฒ€์ฆ] โ†’ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค
                  โ†“ (์‹คํŒจ ์‹œ)
              ์ฆ‰์‹œ ๊ฑฐ๋ถ€ (๋ฐฑ์—”๋“œ ๋„๋‹ฌ ์ „)

๋ชจ๋“  ์„œ๋น„์Šค๊ฐ€ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๋Š” ๋Œ€์‹ , ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์—ฃ์ง€์—์„œ ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ค‘์•™ ์ง‘์ค‘ ์†๋„ ์ œํ•œ
๋ฌด๋ฃŒ ์‚ฌ์šฉ์ž:   100 req/min
ํ”„๋กœ ์‚ฌ์šฉ์ž: 1,000 req/min
์—”ํ„ฐํ”„๋ผ์ด์ฆˆ: 10,000 req/min

๊ฐ ํŒ€์ด ์ž์ฒด ์ œํ•œ ๋กœ์ง์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹ , ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ•œ๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋Š” ๊ณผ๊ธˆ ๋“ฑ๊ธ‰์ด๋‚˜ ๊ตฌ๋… ๋กœ์ง์„ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.

์š”์ฒญ/์‘๋‹ต ๋ณ€ํ™˜

๋ชจ๋ฐ”์ผ ์•ฑ๊ณผ ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์ด ๋‹ค๋ฅธ ํฌ๋งท์„ ์‚ฌ์šฉํ•ด๋„, ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์ค‘๊ฐ„์—์„œ ๋ณ€ํ™˜ํ•œ๋‹ค. ์–‘์ชฝ ๋‹ค ์ƒ๋Œ€๋ฐฉ์˜ ์กด์žฌ๋ฅผ ๋ชจ๋ฅด๊ณ  ์ž์‹ ์˜ ํฌ๋งท์œผ๋กœ๋งŒ ํ†ต์‹ ํ•œ๋‹ค.

API ๋ฒ„์ „ ๊ด€๋ฆฌ
/v1/* โ†’ ๊ตฌ ๋ฒ„์ „ ๋ฐฑ์—”๋“œ
/v2/* โ†’ ์‹  ๋ฒ„์ „ ๋ฐฑ์—”๋“œ

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘์—๋„ ๊ตฌ ๋ฒ„์ „ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ณ„์† ๋™์ž‘ํ•˜๊ณ , ์ƒˆ ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‹  ๋ฒ„์ „์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

ํ†ตํ•ฉ ๊ด€์ฐฐ์„ฑ (Observability)

๋ชจ๋“  ์š”์ฒญ์ด ํ•˜๋‚˜์˜ ์ง„์ž…์ ์„ ํ†ต๊ณผํ•˜๋ฏ€๋กœ, ์–ด๋–ค ์—”๋“œํฌ์ธํŠธ์— ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ฆฌ๋Š”์ง€, ์–ด๋–ค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋งŽ์ด ๋‚ด๋Š”์ง€, ์–ด๋””์„œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋Œ€ํ‘œ ๋„๊ตฌ
  • Kong (Nginx ๊ธฐ๋ฐ˜)
  • AWS API Gateway
  • Apigee
  • Tyk
  • Envoy ๊ธฐ๋ฐ˜ ๊ฒŒ์ดํŠธ์›จ์ด

5. ์„ธ ๊ฐœ๋…์ด ํ˜ผ๋™๋˜๋Š” ์ด์œ 

์‹ค์ œ ๋„๊ตฌ๋“ค์ด ์„ธ ์—ญํ• ์˜ ๊ฒฝ๊ณ„๋ฅผ ์กด์ค‘ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Nginx ์˜ˆ์‹œ
Nginx ์›๋ž˜ = Reverse Proxy (SSL ์ข…๋ฃŒ, ์บ์‹ฑ, ์••์ถ•)
  + ์—ฌ๋Ÿฌ ๋ฐฑ์—”๋“œ + ํ—ฌ์Šค ์ฒดํฌ = Load Balancer
  + ์ธ์ฆ ํ”Œ๋Ÿฌ๊ทธ์ธ + ์†๋„ ์ œํ•œ + OpenResty = API Gateway

ํ•˜๋‚˜์˜ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์„ค์ •์— ๋”ฐ๋ผ ์„ธ ๊ฐ€์ง€ ๋ชจ์ž๋ฅผ ๋™์‹œ์— ์“ฐ๊ณ  ์žˆ๋‹ค.

Kong ์˜ˆ์‹œ

Kong์€ ์Šค์Šค๋กœ๋ฅผ API Gateway๋ผ๊ณ  ๋ถ€๋ฅด์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” Nginx ์œ„์— ๊ตฌ์ถ•๋˜์–ด ์žˆ๋‹ค. Reverse Proxy ๋™์ž‘๊ณผ Load Balancing์„ ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ์œ„์— API Gateway ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.

AWS ์˜ˆ์‹œ

AWS์—๋Š” Application Load Balancer(ALB)์™€ API Gateway๊ฐ€ ๋ณ„๋„ ์ œํ’ˆ์œผ๋กœ ์žˆ์ง€๋งŒ, ๊ฒฝ๊ณ„๊ฐ€ ๋งŽ์ด ๊ฒน์นœ๋‹ค. ALB๋„ ์ด๋ฏธ ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ์ง€์›ํ•œ๋‹ค.


6. ์‹ค์ œ ํ”„๋กœ๋•์…˜์—์„œ์˜ ๊ณ„์ธต ๊ตฌ์กฐ

๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ๋Š” ์„ธ ๊ฐ€์ง€๊ฐ€ ๊ณ„์ธต์ ์œผ๋กœ ํ•จ๊ป˜ ๋™์ž‘ํ•œ๋‹ค.

[์ธํ„ฐ๋„ท]
    โ†“
[CDN / Edge Proxy]         โ† SSL ์ข…๋ฃŒ, ์ •์  ์บ์‹ฑ, DDoS ๋ฐฉ์–ด
    โ†“
[API Gateway]              โ† ์ธ์ฆ, ์†๋„ ์ œํ•œ, ๋ฒ„์ „ ๋ผ์šฐํŒ…
    โ†“
[Load Balancer]            โ† ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ, ํ—ฌ์Šค ์ฒดํฌ
    โ†“
[๋ฐฑ์—”๋“œ ์„œ๋น„์Šค ํด๋Ÿฌ์Šคํ„ฐ]     โ† ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ์ฒ˜๋ฆฌ

ํ•ต์‹ฌ ์ •๋ฆฌ

๊ตฌ๋ถ„์ฃผ์š” ์—ญํ• ์ดํ•ด ์ˆ˜์ค€ํ•ต์‹ฌ ํ•ด๊ฒฐ ๋ฌธ์ œ
Reverse ProxySSL, ์บ์‹ฑ, ์••์ถ•, ๋ณด์•ˆ์—ฐ๊ฒฐ/๋ผ์šฐํŒ…์„œ๋ฒ„ ๋ณดํ˜ธ + ๋ถ€ํ•˜ ๊ฒฝ๊ฐ
Load BalancerํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ + ํ—ฌ์Šค ์ฒดํฌTCP ๋˜๋Š” HTTP์ˆ˜ํ‰ ํ™•์žฅ + ๊ณ ๊ฐ€์šฉ์„ฑ
API Gateway์ธ์ฆ, ์†๋„ ์ œํ•œ, ๋ณ€ํ™˜, ๋ฒ„์ „ ๊ด€๋ฆฌAPI ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ธํ”„๋ผ ๊ด€์‹ฌ์‚ฌ์˜ ์ค‘์•™ํ™”

์„ธ ๊ฐœ๋…์€ ๋ณ„๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ์ง„ํ™” ๊ด€๊ณ„๋‹ค. Reverse Proxy โ†’ Load Balancer โ†’ API Gateway ์ˆœ์œผ๋กœ ๋” ๋งŽ์€ ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ , ๋” ๋งŽ์€ ์ฑ…์ž„์„ ๋งก๋Š”๋‹ค.