Home > Backend > CS > ๐Ÿ’พ [CS] ํ”„๋ก์‹œ ํŒจํ„ด๊ณผ ํ”„๋ก์‹œ ์„œ๋ฒ„

๐Ÿ’พ [CS] ํ”„๋ก์‹œ ํŒจํ„ด๊ณผ ํ”„๋ก์‹œ ์„œ๋ฒ„
CS

๐Ÿ’พ [CS] ํ”„๋ก์‹œ ํŒจํ„ด๊ณผ ํ”„๋ก์‹œ ์„œ๋ฒ„

1๏ธโƒฃ ํ”„๋ก์‹œ ํŒจํ„ด

  • ํ”„๋ก์‹œ ํŒจํ„ด(proxy pattern)์€ ๋Œ€์ƒ ๊ฐ์ฒด(subject)์— ์ ‘๊ทผํ•˜๊ธฐ ์ „ ๊ทธ ์ ‘๊ทผ์— ๋Œ€ํ•œ ํ๋ฆ„์„ ๊ฐ€๋กœ์ฑ„ ํ•ด๋‹น ์ ‘๊ทผ์„ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๋“ฑ์˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ณ„์ธต์— ์žˆ๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

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

์šฉ์–ด: ํ”„๋ก์‹œ ์„œ๋ฒ„์—์„œ์˜ ์บ์‹ฑ
์บ์‹œ ์•ˆ์— ์ •๋ณด๋ฅผ ๋‹ด์•„๋‘๊ณ , ์บ์‹œ ์•ˆ์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ์š”๊ตฌํ•˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด ๋‹ค์‹œ ์ € ๋ฉ€๋ฆฌ ์žˆ๋Š” ์›๊ฒฉ ์„œ๋ฒ„์— ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ์บ์‹œ ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์™ธ๋ถ€์™€ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ํ”„๋ก์‹œ ์„œ๋ฒ„

  • ํ”„๋ก์‹œ ์„œ๋ฒ„(proxy server)๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์‹ ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค์— ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์ด๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ์“ฐ๋Š” nginx

  • nginx๋Š” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ๊ตฌ์กฐ์™€ ๋‹ค์ˆ˜์˜ ์—ฐ๊ฒฐ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ์›น ์„œ๋ฒ„์ด๋ฉฐ, ์ฃผ๋กœ Node.js ์„œ๋ฒ„ ์•ž๋‹จ์˜ ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Node.js์˜ ์ฐฝ์‹œ์ž ๋ผ์ธ์–ธ ๋‹ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ–ˆ์Šต๋‹ˆ๋‹ค โ€œNode.js์˜ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ทจ์•ฝ์ ์„ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” nginx๋ฅผ ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ์•ž๋‹จ์— ๋†“๊ณ  Node.js๋ฅผ ๋’ค์ชฝ์— ๋†“๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.โ€๋ผ๊ณ  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ๋ง์€ Node.js ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•  ๋•Œ ๊ต๊ณผ์„œ์ฒ˜๋Ÿผ ์ฐธ๊ณ ๋˜์–ด ๋งŽ์€ ์‚ฌ๋žŒ์ด ์ด๋ ‡๊ฒŒ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
      • Node.js ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ์•ž๋‹จ์— nginx๋ฅผ ๋‘๋Š” ๊ฒƒ์ด์ฃ .
        • ์ด๋ฅผ ํ†ตํ•ด ์ต๋ช… ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•˜๊ณ , ๊ฐ„์ ‘์ ์œผ๋กœ ํ•œ ๋‹จ๊ณ„๋ฅผ ๋” ๊ฑฐ์น˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ nginx๋ฅผ ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ๋’ค์„œ ์‹ค์ œ ํฌํŠธ๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๊ณ  ์ •์  ์ž์›์„ gzip ์••์ถ•ํ•˜๊ฑฐ๋‚˜, ๋ฉ”์ธ ์„œ๋ฒ„ ์•ž๋‹จ์—์„œ์˜ ๋กœ๊น…์„ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฉ์–ด: ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ
๋ฒ„ํผ๋Š” ๋ณดํ†ต ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•  ์˜์—ญ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฎ์–ด์”Œ์–ด์ ธ ์ฃผ์†Œ, ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๊ณต๊ฒฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์šฉ์–ด: gzip ์••์ถ•
LZ77๊ณผ Huffman ์ฝ”๋”ฉ์˜ ์กฐํ•ฉ์ธ DEFLATE ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์••์ถ• ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
gzip ์••์ถ•์„ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ „์†ก๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์••์ถ•์„ ํ•ด์ œํ–ˆ์„ ๋•Œ ์„œ๋ฒ„์—์„œ์˜ CPU ์˜ค๋ฒ„ ํ—ค๋“œ๋„ ์ƒ๊ฐํ•ด์„œ gzip ์••์ถ• ์‚ฌ์šฉ ์œ ๋ฌด๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ์“ฐ๋Š” CloudFlare

  • CloudFlare๋Š” ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๋ถ„์‚ฐ๋œ ์„œ๋ฒ„๊ฐ€ ์žˆ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์–ด๋– ํ•œ ์‹œ์Šคํ…œ์˜ ์ฝ˜ํ…์ธ  ์ „๋‹ฌ์„ ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” CDN ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
  • CloudFlare๋Š” ์›น ์„œ๋ฒ„ ์•ž๋‹จ์— ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ๋‘์–ด DDOS ๊ณต๊ฒฉ ๋ฐฉ์–ด๋‚˜ HTTPS ๊ตฌ์ถ•์— ์“ฐ์ž…๋‹ˆ๋‹ค.
    • ๋˜ํ•œ, ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•œ ์ดํ›„์— ํ•ด์™ธ์—์„œ ๋ฌด์•ˆ๊ฐ€ ์˜์‹ฌ์Šค๋Ÿฌ์šด ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ด ๋–„๋ฌธ์— ๋งŽ์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ด๋•Œ CloudFlare๊ฐ€ ์˜์‹ฌ์Šค๋Ÿฌ์šด ํŠธ๋ž˜ํ”ฝ์ธ์ง€๋ฅผ ๋จผ์ € ํŒ๋‹จํ•ด CAPTCHA ๋“ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฅผ ์ผ์ •๋ถ€๋ถ„ ๋ง‰์•„์ฃผ๋Š” ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž, ํฌ๋กค๋Ÿฌ, ๊ณต๊ฒฉ์ž๊ฐ€ ์ž์‹ ์˜ ์›น ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๊ฒŒ ๋  ํ…๋ฐ, ์ด๋•Œ CloudFlare๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์ž๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DDOS ๊ณต๊ฒฉ ๋ฐฉ์–ด

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

HTTPS ๊ตฌ์ถ•

  • ์„œ๋ฒ„์—์„œ HTTPS๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ์ธ์ฆ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ CloudFlare๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ„๋„์˜ ์ธ์ฆ์„œ ์„ค์น˜ ์—†์ด ์ข€ ๋” ์†์‰ฝ๊ฒŒ HTTPS๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฉ์–ด: CDN(Content Delivery Network)
๊ฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐ๋„ท์—์„œ ์ ‘์†ํ•˜๋Š” ๊ณณ๊ณผ ๊ฐ€๊นŒ์šด ๊ณณ์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ์บ์‹ฑ ๋˜๋Š” ๋ฐฐํฌํ•˜๋Š” ์„œ๋ฒ„ ๋„คํŠธ์›Œํฌ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CORS์™€ ํ”„๋ŸฐํŠธ์—”ํŠธ์˜ ํ”„๋ก์‹œ ์„œ๋ฒ„

  • CORS(Cross-Origin Resource Sharing)๋Š” ์„œ๋ฒ„๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋‹ค๋ฅธ ์˜ค๋ฆฌ์ง„์„ ํ†ตํ•ด ๋กœ๋“œํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” HTTP ํ—ค๋” ๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

  • ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์‹œ ํ”„๋ŸฐํŠธ์—”๋“œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ๋•Œ ์ฃผ๋กœ CROS ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผ์น˜๋Š”๋ฐ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ŸฐํŠธ์—”ํŠธ์—์„œ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์šฉ์–ด: ์˜ค๋ฆฌ์ง„
ํ”„๋กœํ† ์ฝœ๊ณผ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„, ํฌํŠธ์˜ ์กฐํ•ฉ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด https://devkobe24.com:12010/test๋ผ๋Š” ์ฃผ์†Œ์—์„œ ์˜ค๋ฆฌ์ง„์€ https://devkobe24.com:12010์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ๋Š” 127.0.0.1:3000์œผ๋กœ ํ…Œ์ŠคํŒ…์„ ํ•˜๋Š”๋ฐ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” 127.0.0.1:12010์ด๋ผ๋ฉด ํฌํŠธ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— CROS ์—๋Ÿฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
    • ์ด๋•Œ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋‘ฌ์„œ ํ”„๋ŸฐํŠธ์—”๋“œ ์„œ๋ฒ„์—์„œ ์š”์ฒญ๋˜๋Š” ์˜ค๋ฆฌ์ง„์„ 127.0.0.1:12010์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ฐธ๊ณ ๋กœ 127.0.0.1์ด๋ž€ ๋ฃจํ”„๋ฐฑ(loopback) IP๋กœ, ๋ณธ์ธ IP ์„œ๋ฒ„์˜ IP๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.
    • localhost๋‚˜ 127.0.0.1์„ ์ฃผ์†Œ์ฐฝ์— ์ž…๋ ฅํ•˜๋ฉด DNS๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋ณธ์ธ PC ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

  • ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ”„๋ŸฐํŠธ์—”๋“œ ์„œ๋ฒ„ ์•ž๋‹จ์— ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋†“์•„ /api ์š”์ฒญ์€ user API, /api2 ์š”์ฒญ์€ user API2์— ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ž์—ฐ์Šค๋ ˆ CORS ์—๋Ÿฌ ํ•ด๊ฒฐ์€ ๋ฌผ๋ก ์ด๋ฉฐ ๋‹ค์–‘ํ•œ API ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ๋„ ๋งค๋„๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.