๐ŸŒ webserv: ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜์˜ ๊ตฌํ˜„ - HTTP/1.1์˜ ์žฌ๊ตฌ์„ฑ

Inception์ด Docker๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ์กฐ๋ฆฝํ•˜๋Š” โ€˜์ธํ”„๋ผ ์•„ํ‚คํ…ํŠธโ€™์˜ ๊ด€์ ์„ ์ œ๊ณตํ–ˆ๋‹ค๋ฉด, webserv๋Š” ๊ทธ ์ธํ”„๋ผ์˜ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ์ธ ์›น ์„œ๋ฒ„์˜ ๋‚ด๋ถ€๋ฅผ C++98๋งŒ์œผ๋กœ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” โ€˜์‹œ์Šคํ…œ ์•„ํ‚คํ…ํŠธโ€™์˜ ์—ญํ• ์„ ์š”๊ตฌํ•˜๋Š” ๊ณผ์ œ์ด๋‹ค.

์ด ํ”„๋กœ์ ํŠธ๋Š” ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋„˜์–ด์„œ, ํ˜„๋Œ€ ๊ณ ์„ฑ๋Šฅ ์›น ์„œ๋ฒ„(NGINX ๋“ฑ)๊ฐ€ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜(Asynchronous Event-driven) ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง์ ‘ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.

webserv๋Š” ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ถœ๋ฐœํ•œ HTTP ์š”์ฒญ์ด๋ผ๋Š” ์ˆœ์ˆ˜ํ•œ ํ…์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์„œ๋ฒ„์˜ ๋ฌธ์„ ํ†ต๊ณผํ•˜๊ณ , ๋‚ด๋ถ€ ๋กœ์ง์„ ๊ฑฐ์ณ ์˜๋ฏธ ์žˆ๋Š” ์‘๋‹ต์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ๋Œ์•„๊ฐ€๋Š”์ง€, ๊ทธ ๋ณด์ด์ง€ ์•Š๋Š” ํ†ต์‹ ์˜ ์ „ ๊ณผ์ •์„ ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์žฌ๊ตฌ์„ฑํ•˜๊ณ  ๊ทธ ์ดํ•ด๋„๋ฅผ ๋„“ํžˆ๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค.

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


๐Ÿ“œ 1. ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„: C10K ๋ฌธ์ œ์™€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ๋ฒ•

์ „ํ†ต์ ์ธ โ€˜์š”์ฒญ ๋‹น ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑโ€™ ๋ชจ๋ธ, ์ด๋ฅผ ๊ธฐ๋ฐ˜ํ•œ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ์ˆ˜์ฒœ, ์ˆ˜๋งŒ ๊ฐœ์˜ ๋™์‹œ ์ ‘์†(C10K Problem)์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ๋น„์šฉ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ธก๋ฉด์—์„œ ํ•œ๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋†€๋ž๊ฒŒ ํ•ด๊ฒฐํ•˜๊ณ , ํ˜„์žฌ๋Š” ํ”„๋ก์‹œ, ํ˜น์€ ์ •์  ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์•„์ฃผ ๊ธฐ์ดˆ์ ์œผ๋กœ ํ™œ์šฉ๋  ์ •๋„๋กœ ๋˜์ค‘ํ™”๋œ ์ผ€์ด์Šค๊ฐ€ ๋ฐ”๋กœ Nginx๋‹ค.

๊ทธ๋Ÿฌํ•œ Nginx ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋ฌผ๋ก  ํ˜„์žฌ์˜ ๊ทธ๊ฒƒ์€ ๊ทธ๋Ÿผ์—๋„ โ€˜์š”์ฒญ ๋‹น ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑโ€™์˜ ์ด์ ์„ ํก์ˆ˜ํ•˜์—ฌ ๋ณด๋‹ค ์„ฌ์„ธํ•œ ํ”„๋กœ๊ทธ๋žจํ™” ๋˜์—ˆ์œผ๋‚˜, ๊ทธ ๊ธฐ๋ณธ ์ฒ ํ•™์€ ์—ฌ์ „ํ•˜๊ณ , webserv๋Š” ์ด ์ฒ ํ•™์„ Non-blocking I/O + I/O ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์ด๋ž€ ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop) ๋ชจ๋ธ๋กœ ๋ชจ์‚ฌํ•ด๋‚ธ๋‹ค.

์ด ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹จ์ผ (๋˜๋Š” ์†Œ์ˆ˜์˜) ์Šค๋ ˆ๋“œ๋งŒ์œผ๋กœ ์ˆ˜๋งŽ์€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, I/O ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ CPU๋ฅผ ๋‹ค๋ฅธ ์ž‘์—…์— ํ• ๋‹นํ•˜์—ฌ ์‹œ์Šคํ…œ ์ž์›์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. ์„œ๋ฒ„์˜ ๋ชจ๋“  ๋™์ž‘์€ ์‹œ์Šคํ…œ ์ปค๋„์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” โ€˜์ด๋ฒคํŠธโ€™๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์˜ ์‹œ๊ทธ๋„์— ๋งž์ถ”์–ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.


๐Ÿ› ๏ธ 2. ํ•ต์‹ฌ ๊ตฌํ˜„ ์š”์†Œ: ์‹œ์Šคํ…œ ์ฝœ๊ณผ ํ”„๋กœํ† ์ฝœ์˜ ์กฐ๋ฆฝ

๊ฐ€. ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ํ†ต์‹ ์˜ ๊ด€๋ฌธ

์†Œ์ผ“์€ ์šด์˜์ฒด์ œ์˜ TCP/IP ์Šคํƒ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค(API)์ด๋‹ค. ์„œ๋ฒ„์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ๋‹ค์Œ ์‹œ์Šคํ…œ ์ฝœ๋“ค์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋œ๋‹ค.

  1. socket(): ํ†ต์‹ ์„ ์œ„ํ•œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  2. fcntl(): ์ƒ์„ฑ๋œ ์†Œ์ผ“์„ Non-blocking ๋ชจ๋“œ๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด๋Š” accept(), read(), write() ๋“ฑ์˜ I/O ํ•จ์ˆ˜๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜๋„๋ก ํ•˜์—ฌ, ์ด๋ฒคํŠธ ๋ฃจํ”„ ์ „์ฒด๊ฐ€ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ๋‹จ๊ณ„์ด๋‹ค.
  3. setsockopt(): SO_REUSEADDR ์˜ต์…˜์„ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ€ ๋น„์ •์ƒ ์ข…๋ฃŒ๋œ ํ›„ ์ฆ‰์‹œ ์žฌ์‹œ์ž‘ํ•ด๋„ ๋™์ผํ•œ ํฌํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ๋‹ค.
  4. bind(): ์†Œ์ผ“์— ํŠน์ • IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
  5. listen(): ์†Œ์ผ“์ด ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.
  6. accept(): ์—ฐ๊ฒฐ ์š”์ฒญ ํ์—์„œ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์„ ๊ฐ€์ ธ์™€, ํ†ต์‹ ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์†Œ์ผ“(์ปค๋„ฅ์…˜ ์†Œ์ผ“)์„ ์ƒ์„ฑํ•œ๋‹ค.

๋‚˜. I/O ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ (kqueue): ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ์‹ฌ์žฅ

๋ณธ๋ž˜ I/O ๋ฉ€ํ‹ฐํ”Œ๋ž™์‹ฑ์„ ์œ„ํ•œ ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์‹์€ select ์™€ poll ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์˜ POSIX ํ‘œ์ค€ ๋ชจ๋ธ์ด ์žˆ๋‹ค. ํŠนํžˆ poll์˜ ๊ตฌํ˜„์€ ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์˜คํžˆ๋ ค ์ง๊ด€์ ์ธ๋ฐ, ๊ฐ์‹œ ๋Œ€์ƒ์„ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ณ , ์ด ๋ฐฐ์—ด์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์Šค์บ”ํ•˜์—ฌ ์ธก์ •ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ์„ ํ˜•์  ๊ตฌ์กฐ์ด๋ฏ€๋กœ, O(N) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ , ์ด์‹์„ฑ์€ ์ข‹๊ณ , ๋ฌด์—‡๋ณด๋‹ค ์ง๊ด€์  ์žฅ์ ์„ ๊ฐ€์ง€๋‚˜, ํ˜„์žฌ๋Š” ๊ณ ์„œ๋Šฅ ์„œ๋ฒ„์—์„œ ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค. ์ดํ›„ ๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.5.44 ๋ฒ„์ „ ์ดํ›„๋ถ€ํ„ฐ๋Š” epoll ์ด๋ผ๋Š” ๊ฑฐ์˜ ํ‘œ์ค€ํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ณ , Linux 5.1 ์ปค๋„์—์„œ ๋„์ž…๋œ ๊ฐ€์žฅ ๊ณ ์„ฑ๋Šฅ ๋น„๋™๊ธฐ I/O ์ธํ„ฐํŽ˜์ด์Šค๋Š” io_uring ์ด ์กด์žฌํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์— ๋”ฐ๋ฅธ ๋ฒ„์ „๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ FreeBSD ๊ณ„์—ด OS์—์„œ epoll๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ kqueue ์ด๋‹ค. ์ฐธ๊ณ ๋กœ FreeBSD ๊ธฐ๋ฐ˜์˜ OS ์˜ ์‚ฌ์šฉ์€ ๋งค์šฐ ํ”ํ•œ ์ผ์€ ์•„๋‹ˆ๊ธฐ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋‚˜, ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ๋„, ์†Œ์Šค ๊ณต๊ฐœ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋ผ์ด์„ผ์Šค ๋•๋ถ„์— ๊ธฐ์—…์šฉ OS ํ”Œ๋žซํผ์— FreeBSD๊ฐ€ ๋งŽ์ด ์“ฐ์ธ๋‹ค๊ณ  ํ•œ๋‹ค(Mac OS, iOS, Sony PS ๊ณ„์—ด, Nintendo์˜ Switch OS ๋“ฑโ€ฆ)

kqueue๋Š” ์†Œ์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋กœ ๋‹ค์ˆ˜์˜ I/O ์ด๋ฒคํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ BSD ๊ณ„์—ด ์šด์˜์ฒด์ œ์˜ ๊ณ ์„ฑ๋Šฅ API์ด๋‹ค. ํŠน์ง•์„ ๊ทธ๋ž˜๋„ ๋‹ค์†Œ ์š”์•ฝํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ๋™์ž‘ ์›๋ฆฌ: ์„œ๋ฒ„๋Š” kqueue()๋กœ ์ปค๋„์— ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ํ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ดํ›„ kevent() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์‹œํ•˜๊ณ ์ž ํ•˜๋Š” ์ด๋ฒคํŠธ(์˜ˆ: โ€˜์„œ๋ฒ„ ์†Œ์ผ“์— ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ ์š”์ฒญ์ด ๋„์ฐฉํ•จโ€™, โ€˜์ปค๋„ฅ์…˜ ์†Œ์ผ“์—์„œ ์ฝ์„ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Œโ€™)๋ฅผ ํ์— ๋“ฑ๋ก(Register)ํ•œ๋‹ค.
  • ์ด๋ฒคํŠธ ๋ฃจํ”„: ์„œ๋ฒ„์˜ ๋ฉ”์ธ ๋กœ์ง์€ ๋ฌดํ•œ ๋ฃจํ”„ ๋‚ด์—์„œ kevent()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. kevent()๋Š” ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€๊ธฐ์‹œํ‚ค๋ฉฐ, ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฃจํ”„๋Š” ๋ฐ˜ํ™˜๋œ ์ด๋ฒคํŠธ๋“ค์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ๊ฐ์— ๋งž๋Š” ํ•ธ๋“ค๋Ÿฌ(์ƒˆ ์—ฐ๊ฒฐ ์ˆ˜๋ฝ, ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ๋“ฑ)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด ๊ตฌ์กฐ ๋•๋ถ„์— ์„œ๋ฒ„๋Š” ์‹ค์ œ ์ž‘์—…์ด ํ•„์š”ํ•  ๋•Œ๋งŒ ๊นจ์–ด๋‚˜ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋†’์€ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ: ๊ฐ์‹œํ•ด์•ผํ•  ๋Œ€์ƒ์ด ๋Š˜์–ด๋‚˜๋„, ์„ฑ๋Šฅ ์ €ํ•˜๋Š” ๊ฑฐ์˜ ์—†๋‹ค.
  • ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ ํ†ตํ•ฉ ๊ด€๋ฆฌ: ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ€์žฅ ํ›Œ๋ฅญํ•œ ์žฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋‹จ์ˆœ ์†Œ์ผ“์˜ ์ฝ๊ธฐ, ์“ฐ๊ธฐ ๊ฐ€๋Šฅ ์ƒํƒœ ๋ฟ ์•„๋‹ˆ๋ผ ์‹œ๊ทธ๋„, ํŒŒ์ผ ๋ณ€๊ฒฝ ์—ฌ๋ถ€, ํ”„๋กœ์„ธ์Šค ์ƒํƒœ ๋ณ€ํ™”๋‚˜ ํƒ€์ด๋จธ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜, ๊ฐ์ง€ ๊ฐ€๋Šฅํ•˜๊ณ  ์ด๋ฅผ ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํ†ตํ•ฉ๊ด€๋ฆฌ๊ฐ€ ๋œ๋‹ค๋Š” ์ ์€ ๋งค์šฐ ์œ ์˜๋ฏธํ•˜๋‹ค.

๋‹ค. ์„ค์ • ํŒŒ์ผ ํŒŒ์„œ: ์œ ์—ฐ์„ฑ๊ณผ ๊ฐ€์ƒ ํ˜ธ์ŠคํŒ…

nginx.conf์™€ ์œ ์‚ฌํ•œ ํ˜•์‹์˜ ์„ค์ • ํŒŒ์ผ์„ ํ•ด์„ํ•˜๋Š” ํŒŒ์„œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์ด ํŒŒ์„œ๋Š” ์„œ๋ฒ„์˜ ๋™์ž‘์„ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

  • ํ•ต์‹ฌ ๊ธฐ๋Šฅ: ํฌํŠธ ๋ฐ”์ธ๋”ฉ, ์„œ๋ฒ„ ์ด๋ฆ„ ์ง€์ •, ๊ธฐ๋ณธ ์—๋Ÿฌ ํŽ˜์ด์ง€ ๊ฒฝ๋กœ, ํ—ˆ์šฉ HTTP ๋ฉ”์„œ๋“œ, location ๋ธ”๋ก๋ณ„ ๋ผ์šฐํŒ… ๊ทœ์น™(๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ, CGI ์„ค์ • ๋“ฑ)์„ ํŒŒ์‹ฑํ•˜์—ฌ C++ ๊ฐ์ฒด(์˜ˆ: ServerConfig)๋กœ ๊ตฌ์กฐํ™”ํ•œ๋‹ค.
  • ๊ฐ€์ƒ ํ˜ธ์ŠคํŒ… (Virtual Hosting): ํŒŒ์‹ฑ๋œ ์„ค์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ, ์„œ๋ฒ„๋Š” HTTP ์š”์ฒญ ํ—ค๋”์˜ Host ํ•„๋“œ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋™์ผํ•œ IP์™€ ํฌํŠธ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์ด๋ผ๋„ ๊ฐ๊ฐ ๋‹ค๋ฅธ server ๋ธ”๋ก ์„ค์ •์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ๋ฅผ ์„œ๋น™ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ถ”์ƒํ™” ๋  ๋ฟ ์‹ค์งˆ ๋‹จ์ผ ์ฒ˜๋ฆฌ๊ธด ํ•˜๋‹ค.

๋ผ. HTTP/1.1 ํ”„๋กœํ† ์ฝœ ํŒŒ์„œ ๋ฐ ์‘๋‹ต ์ƒ์„ฑ๊ธฐ

  • ์š”์ฒญ(Request) ํŒŒ์‹ฑ: ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“์œผ๋กœ๋ถ€ํ„ฐ ์ฝ์–ด๋“ค์ธ ์ˆœ์ˆ˜ํ•œ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์„ HTTP/1.1 ๋ช…์„ธ์— ๋”ฐ๋ผ ํŒŒ์‹ฑํ•œ๋‹ค. REST ์›์น™์— ๋”ฐ๋ผ HTTP/1.1 ์˜ ๊ฐœ๋…๋“ค์„ ๋ถ„์„ํ•˜์—ฌ ํŒŒ์„œ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค. ์ฒซ ์ค„์ธ Start-Line์—์„œ Method (GET, POST, DELETE), Request-URI, HTTP-Version์„ ์ถ”์ถœํ•˜๊ณ , ์ดํ›„ ๋นˆ ์ค„(\r\n\r\n)์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ํ—ค๋”๋“ค์„ ํŒŒ์‹ฑํ•˜์—ฌ map๊ณผ ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅํ•œ๋‹ค. Content-Length๊ฐ€ ๋ช…์‹œ๋œ POST ์š”์ฒญ์˜ ๊ฒฝ์šฐ, ๋ช…์‹œ๋œ ๊ธธ์ด๋งŒํผ์˜ Body ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•ด์•ผ ํ•œ๋‹ค.
  • ์‘๋‹ต(Response) ์ƒ์„ฑ: ํŒŒ์‹ฑ๋œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ํ›„, ์„œ๋ฒ„๋Š” ๋‹ค์‹œ ๋ช…์„ธ์— ๋งž์ถฐ ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. Status-Line(HTTP/1.1 200 OK), Headers(Content-Type, Content-Length ๋“ฑ), ๊ทธ๋ฆฌ๊ณ  Body(HTML ํŒŒ์ผ ๋‚ด์šฉ ๋“ฑ)๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“์— ์ „์†กํ•œ๋‹ค.
  • ๋ถ€์ฐจ ์ ์ธ ์š”์†Œ๋“ค: chunk ๋‹จ์œ„๋กœ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ผ€์ด์Šค ๋“ฑ์„ ๊ณ ๋ คํ•˜์—ฌ, ํฐ ๋ฐ์ดํ„ฐ๋“ค์ด ๋“ค์–ด์˜ฌ ๋•Œ๋Š” ์ด์— ๋งž์ถฐ ์ง€์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ณ , ์ด๋ฅผ ํ•ฉ์ณ์„œ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•˜๋Š” ๋“ฑ์˜ HTTP /1.1 ๊ธฐ์ค€์— ๋งž์ถ˜ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

๋งˆ. CGI (Common Gateway Interface): ๋™์  ์ฝ˜ํ…์ธ  ์ƒ์„ฑ

CGI๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ(Python, PHP ๋“ฑ)๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋™์ ์ธ ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ํ•„์š”์‹œ ๋˜๋Š” ์ด์œ ๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ธฐ์—๋Š” ์—ฐ์‚ฐ ์ง‘์•ฝ์ ์ด๊ฑฐ๋‚˜, ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ ์‹ ๊ทœ ํ”„๋กœ์„ธ์Šค๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ฌผ๋ก , ํ˜„์žฌ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, CGI ๋ผ๋Š” ๊ธฐ์ค€์œผ๋กœ ๊ตฌํ˜„ ๋ฐฉ์‹์€ โ€˜์˜ฌ๋“œโ€™ ํ•˜๊ณ  โ€˜๋ฌด๊ฒ๋‹คโ€™ ๊ณ  ์ด์•ผ๊ธฐ ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

  • ๊ตฌํ˜„: fork()๋กœ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„, pipe()๋กœ ๋ถ€๋ชจ-์ž์‹ ๊ฐ„ ํ†ต์‹  ์ฑ„๋„์„ ๋งŒ๋“ ๋‹ค. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค(์„œ๋ฒ„)๋Š” HTTP ์š”์ฒญ ์ •๋ณด๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(REQUEST_METHOD, QUERY_STRING ๋“ฑ)๋กœ ์„ค์ •ํ•˜๊ณ , POST ์š”์ฒญ์˜ ๊ฒฝ์šฐ Body ๋ฐ์ดํ„ฐ๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ stdin์œผ๋กœ ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•œ๋‹ค. ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” dup2()๋กœ ์ž์‹ ์˜ ํ‘œ์ค€ ์ž…์ถœ๋ ฅ์„ ํŒŒ์ดํ”„์— ์—ฐ๊ฒฐํ•œ ๋’ค, execve()๋กœ CGI ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ(ํ‘œ์ค€ ์ถœ๋ ฅ)๋Š” ๋‹ค์‹œ ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋กœ ์ „๋‹ฌ๋˜์–ด, ์ตœ์ข… HTTP ์‘๋‹ต์˜ Body๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†ก๋œ๋‹ค.

๋ฐ”. ํ˜‘์—… ๋„๊ตฌ๋“ค ๋ฐ ์ „๋žต

ํ•ด๋‹น ๊ณผ์ œ์—์„œ๋Š” ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ์˜์—ญ์ด ๋ฐ”๋กœ, ์„œ๋กœ์˜ kqueue ์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์ , ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฐ ์ƒํƒœ์—์„œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค๋Š” ์ ์ด๋‹ค. ์„ค๊ณ„๋ฅผ ํ•˜๋”๋ผ๋„ ๊ตฌ์กฐ๋ฅผ ์ •ํ™•ํ•˜๊ธฐ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ณ , ํŠนํžˆ๋‚˜ ์†Œํ†ต ๋ฌธ์ œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ด์Šˆ๋“ค์ด ์ƒ๊ฒจ๋‚ฌ๋‹ค.

์ด๋Ÿฌํ•œ ์ ์„ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•œ 1์ฐจ ๊ฐœ๋ฐœ ํŒ€์€ ์ƒ๋‹นํ•œ ๊ณค๋ž€, ์–ด๋ ค์›€์— ์žˆ์—ˆ๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‹คํŒจํ•˜๊ณ  ํŒ€์ด ์™€ํ•ด๋˜์—ˆ์—ˆ๋‹ค.

์ดํ›„ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋ฉด ๋˜๋Š”๊ฐ€? ์ง„์ง€ํ•œ ๊ณ ๋ฏผ์„ ์ด์–ด๊ฐ”๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๋˜ ๋…ธ๋ ฅ๊ณผ ๋ณด์•ˆ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • kqueue ์ง€์‹์— ๋Œ€ํ•œ ๊ณต์œ : kqueue ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ณผ์ •์€ ๋งค์šฐ ์–ด๋ ค์šด๋ฐ๋‹ค, ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋‘ ๋น„์Šทํ•˜๊ฒŒ ๊ณต์œ ํ•œ ๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋ ค์› ์ง€๋งŒ, ์ดํ›„ ํ•™์Šต์„ ํ†ตํ•ด kqueue ๋ฅผ ์ด์šฉํ•œ echo ์„œ๋ฒ„ ๊ตฌ์ถ•, ๋ฉ€ํ‹ฐ ์ฑ„๋„, ๋ฉ€ํ‹ฐ ์œ ์ € ๊ธฐ๋ฐ˜์˜ echo ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ํ•ด๋ณด๋ฉด์„œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ชจ๋‘๊ฐ€ ํด๋ก  ์ฝ”๋”ฉ์„ ํ†ตํ•ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ์œ ๋„ํ•˜์˜€๋‹ค.
  • ๋‹คํ˜•์„ฑ์„ ๊ฐ–์ถ˜ ํ†ตํ•ฉ ์ž‘์—… ์ฒด๊ณ„ ๊ณ ์•ˆ: C++ ์˜ ๋‹คํ˜•์„ฑ, ์ƒ์†์„ ํ™œ์šฉํ•˜๊ณ , ๊ฒฐ๊ตญ ๋…ผ๋ธ”๋กํ‚น ๋น„๋™๊ธฐ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ์—ญํ• (ํด๋ผ์ด์–ธํŠธ, ์š”์ฒญ ์ฝ๊ธฐ, ํŒŒ์ผ ์ฝ๊ธฐ, CGI, ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ๋“ฑ)์— ๋”ฐ๋ผ ํ•˜์œ„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•˜๋ถ€ ํด๋ž˜์Šค๋“ค์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋“ค์€ ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜๋ฏ€๋กœ, ๋ฉ”์„œ๋“œ๋“ค์˜ ์—ญํ• ์€ ๊ทœ๊ฒฉํ™”ํ•˜๊ณ , ๊ทธ ์ƒํ™ฉ์„ ์œ ๋„ํ•˜์—ฌ ์ณฌ๊ณ„์˜ ๋™์งˆ์„ฑ์„ ๋†’์—ฌ์„œ, ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์˜ ๋…ผ์˜๊ฐ€ ์šฉ์ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.
  • ์ž์ฒด์ ์ธ ๋กœ๊น… ์‹œ์Šคํ…œ ๊ตฌํ˜„: ๋น„๋™๊ธฐ, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ๊ฐ€์žฅ ์–ด๋ ค์šด ์ง€์ ์€ ๋””๋ฒ„๊น… ์‹œ, ์–ด๋–ค ์‹œ์ ์— ์–ด๋–ค ์ผ๋“ค์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค๋Š” ์ ์ด์˜€๋‹ค. ์ด์—, ์ž‘์—…์— ๋Œ€ํ•œ ์ƒ์œ„ ํด๋ž˜์Šค, ํ•˜๋ถ€ ํด๋ž˜์Šค๋“ค๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™œ์šฉํ•˜์—ฌ ๋กœ๊น…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ, ์–ธ์ œ ์–ด๋–ค ์ž‘์—… ๋„์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋‚œ ๊ฒƒ์ธ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์—ฌ ์ œ๊ณตํ•˜์˜€๋‹ค.
  • ์‹ฌํ”Œํ•˜์ง€๋งŒ ๋ช…ํ™•ํ•œ ์ปจ๋ฒค์…˜ ์ง€์ •: ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์šด ์ปจ๋ฒค์…˜์„ ์ง€์ •ํ•˜๋Š” ์‹์œผ๋กœ๋Š”, ์ด๋ฅผ ์ง€ํ‚ค๋‹ค ํšจ์œจ์„ฑ์ด ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด์— ์‹ฌํ”Œํ•˜๊ฒŒ ์ปจ๋ฒค์…˜์„ ๋ฏธ๋ฆฌ ํ•ฉ์˜ํ•˜๋„๋ก ์œ ๋„ํ•˜์˜€๊ณ , PR ์‹œ์—๋„ ์ง€์ •๋œ ๋ฆฌ๋ทฐ ๋ฐฉ์‹์„ ์ˆ˜ํ–‰๋งŒ ํ•˜๋ฉด ๋ฌธ์ œ ์—†๋‹ค๋Š” ์‹์œผ๋กœ ํ•ฉ์˜๋ฅผ ํ†ตํ•ด, ํŒ€ ์ „์ฒด๊ฐ€ ๋ณต์žกํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ฐ•๋ ฅํ•œ ๊ธฐ์ค€ ํ•˜์— PR ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๋Š” ๋“ฑ์˜ ํ˜•ํƒœ๋ฅผ ์ด์–ด ๋‚˜๊ฐ€๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋‚ด์šฉ๋“ค์„ ํ†ตํ•ด ์ตœ์ดˆ ํŒ€์—์„œ ์ƒ๊ฒผ๋˜ ๋ฌธ์ œ๋“ค์€ ๊ทน์ ์œผ๋กœ ์™„ํ™” ๋˜์—ˆ๊ณ , ๊ธฐ์กด์˜ ๋‘๋‹ฌ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ค ์ž‘์—…์ด ์ง„ํ–‰์กฐ์ฐจ ๋˜์ง€ ์•Š๋˜ ์ƒํ™ฉ์—์„œ, 2์ฐจ ํŒ€์€ ๋ช‡ ์ฃผ๋งŒ์— ์–ผ๊ฐœ๊ฐ€ ์งœ์—ฌ์กŒ๊ณ , 1๋‹ฌ ์ •๋„๋กœ ๊ฑฐ์˜ ์™„์„ฑ ๋‹จ๊ณ„๊นŒ์ง€ ๊ฐœ๋ฐœ์„ ๋งˆ๋ฌด๋ฆฌ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


โœจ ์„ฑ์ฐฐ ๋ฐ ๋ฐฐ์šด ์ 

webserv๋Š” ์ธํ„ฐ๋„ท์˜ ๊ทผ๊ฐ„์„ ์ด๋ฃจ๋Š” ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ชจ๋ธ๊ณผ HTTP ํ†ต์‹ ์˜ ์‹ค์ฒด๋ฅผ ์ฝ”๋“œ๋กœ ์ฆ๋ช…ํ•ด๋‚ด๋Š” ๊ณผ์ •์ด๋‹ค. ๋˜ํ•œ ์ด๋งŒํผ์˜ ๊ตฌ์กฐ๋ฅผ ํŒ€์œผ๋กœ ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ•˜๋ฉด์„œ ์†Œํ†ต๊ณผ ์–ด๋–ค ์ฒด๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ํ•จ๊ป˜ ํ•ด๋‚˜๊ฐ€๋ƒ์— ๋”ฐ๋ผ ์–ผ๋งˆ๋‚˜ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์˜ ์ดํ•ด: ๊ณ ์„ฑ๋Šฅ ์„œ๋ฒ„๊ฐ€ ์™œ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊นŠ์€ ๊ณตํ•™์  ์ดํ•ด๋ฅผ ์–ป์—ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋”ฉ์„ ๋„˜์–ด ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•˜๋Š” ์•„ํ‚คํ…ํŠธ์˜ ์‹œ๊ฐ์„ ๊ธธ๋Ÿฌ์ฃผ์—ˆ๋‹ค.
  • ํ”„๋กœํ† ์ฝœ์˜ ์ค‘์š”์„ฑ: HTTP์™€ CGI๋ผ๋Š” ์—„๊ฒฉํ•œ โ€˜์•ฝ์†(Protocol)โ€™ ์œ„์—์„œ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„, ์„œ๋ฒ„์™€ ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ป๊ฒŒ ์งˆ์„œ์ •์—ฐํ•˜๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€๋ฅผ ์ฒด๊ฐํ–ˆ๋‹ค. ๋ชจ๋“  ํ˜„๋Œ€ ๊ธฐ์ˆ ์€ ์ž˜ ์ •์˜๋œ ํ”„๋กœํ† ์ฝœ ์œ„์— ์„œ ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜๋‹ค.
  • ์ €์ˆ˜์ค€ ์ œ์–ด์˜ ํž˜: C++์™€ ์‹œ์Šคํ…œ ์ฝœ๋งŒ์œผ๋กœ ๋„คํŠธ์›Œํฌ ์Šคํƒ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์„ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” ๊ฒฝํ—˜์€, ํ”„๋ ˆ์ž„์›Œํฌ ๋’ค์— ์ˆจ๊ฒจ์ง„ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋ฌด๊ธฐ๊ฐ€ ๋˜์—ˆ๋‹ค.
  • ํ˜‘์—…์˜ ์ค‘์š”์„ฑ, ๋ฐฉ์‹์˜ ์ดํ•ด: ํ˜‘์—… ๊ณผ์ •์—์„œ ์ปจ๋ฒค์…˜์€ ๋ช…ํ™•ํ•ด์•ผํ•˜๋ฉฐ, ํŠนํžˆ๋‚˜ ์กฐ์‹ฌํ•ด์•ผ ํ•  ๊ฒƒ์€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ๋ฐฉํ•ดํ•˜๋Š” ์ง€์‹์˜ ์ˆ˜์ค€, ์†Œํ†ต ๋ฐฉ์‹์˜ ๋ถ€์žฌ ๋“ฑ์ด ์–ผ๋งˆ๋‚˜ ํŒ€ ๊ฐœ๋ฐœ์—์„œ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

webserv๋ฅผ ์™„์„ฑํ–ˆ๋‹ค๋Š” ๊ฒƒ์€, ๋ธŒ๋ผ์šฐ์ €์˜ URL ์ž…๋ ฅ์ฐฝ ๋’ค์—์„œ ๋ฒŒ์–ด์ง€๋Š” ๊ฑฐ๋Œ€ํ•œ ํ†ต์‹ ์˜ ์˜ค์ผ€์ŠคํŠธ๋ผ๋ฅผ ์ง์ ‘ ์ง€ํœ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์—ญ๋Ÿ‰์„ ๊ฐ–์ถ”์—ˆ์Œ์„ ์˜๋ฏธํ•˜๋Š”, ๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ์ค‘์š”ํ•œ ์ด์ •ํ‘œ์˜€๋‹ค. ๋™์‹œ์— ๋น„๋ก ์‹ค์ „, ์‹ค์ œ ๋ผ์ด๋ธŒ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•ด๋ณด๊ฑฐ๋‚˜ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์—ˆ์ง€๋งŒ, ๊ทธ๋Ÿผ์—๋„ ๋งค์šฐ ํ›Œ๋ฅญํ•œ ํ˜‘์—…์˜ ๊ฒฝํ—˜์ด์ž, ์•„ํ”„์ง€๋งŒ ์„ฑ์žฅ ๊ฐ€๋Šฅ์„ฑ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ง› ๋ณผ ์ˆ˜ ์žˆ๋˜ ๊ธฐํšŒ๋ผ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.