๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

CS/Server

HTTP์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค

๐Ÿ“š ๊ตฌ๊ธ€์‹ ์˜ ๋„์›€์„ ๋ฐ›์•„ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ํ•œ ์ž๋ฃŒ ๋ฐ ๋‚ด์šฉ ์ธ์šฉ ์ถœ์ฒ˜๋Š” ๋งจ ์•„๋ž˜์— ๊ธฐ์žฌํ•ด๋’€์Šต๋‹ˆ๋‹ค.

HTTP์˜ ๋ณ€ํ™”

HTTP๋Š” ์›น์ƒ์—์„œ Client์™€ Server ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ Protocol์ž…๋‹ˆ๋‹ค. ์›”๋“œ ์™€์ด๋“œ ์›น์— ๋‚ด์ œ๋˜์–ด์žˆ๊ณ , HTTP/0.9๋ฅผ ์‹œ์ž‘์œผ๋กœ HTTP/2๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์ด ์ถœ์‹œ๋์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ 1.1 ๋ฒ„์ „๊ณผ 2 ๋ฒ„์ „์„ ๊นŠ๊ฒŒ ์•Œ์•„๋ณด๊ณ  ๋‚˜๋จธ์ง€ ๋ฒ„์ „๋“ค์€ ์–ด๋–ค ๊ฒƒ๋“ค์ด์—ˆ๋Š”์ง€๋งŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

HTTP/0.9

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

HTTP/1.0

HTTP/0.9๋ณด๋‹ค ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ๋ชจ๋‘ ์œตํ†ต์„ฑ์„ ๊ฐ€์ง€๋„๋ก ํ™•์žฅ๋์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์—์„œ๋Š” ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๋ถ™์–ด ์ „์†ก๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ , ์‘๋‹ต์—์„  ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ์‘๋‹ต๊ฐ’ ์‹œ์ž‘ ๋ถ€๋ถ„์— ํฌํ•จ๋˜์–ด ์ „์†ก๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. HTTP ํ•ด๋”๊ฐ€ ์š”์ฒญ๊ณผ ์‘๋‹ต ๋‘ ๊ณณ์— ๋„์ž…๋๊ณ , ํ—ค๋”์˜ 'Content-Type'์œผ๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ „์†ก์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋„ POST, HEAD๊ฐ€ ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค.

GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML> 
A page with an image
  <IMG SRC="/myimage.gif">
</HTML>

HTTP/1.1 - ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ

1.0 ๋ฒ„์ „์ด ๋‚˜์˜จ์ง€ ๋ช‡ ๋‹ฌ ์•ˆ๋˜์„œ 1997๋…„ ์ดˆ HTTP์˜ ์ฒซ ๋ฒˆ์งธ ํ‘œ์ค€ ๋ฒ„์ „์ธ 1.1 ๋ฒ„์ „์ด ๊ณต๊ฐœ๋์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ๋ชจํ˜ธํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค์„ ๊ฐœ์„ ํ–ˆ๊ณ , ํ†ต์‹ ์˜ ๋น„์šฉ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„๋“ค์ด ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์— ์ž‘์„ฑํ•œ ๊ฒƒ๋“ค๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒƒ๋“ค์ด ์ถ”๊ฐ€๋์œผ๋‹ˆ ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ MDN์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • OPTION, PUT, DELETE, TRACE๊ฐ€ ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค.
  • ์ปค๋„ฅ์…˜์ด ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. ํƒ์ƒ‰๋œ ๋‹จ์ผ ์›๋ณธ ๋ฌธ์„œ ๋‚ด๋กœ ์ž„๋ฒ ๋“œ๋œ ๋ฆฌ์†Œ์Šค๋“ค์„ ๋””์Šคํ”Œ๋ ˆ์ดํ•˜๊ธฐ ์œ„ํ•ด, ์ด๋ฏธ ์‚ฌ์šฉ๋œ ์ปค๋„ฅ์…˜์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ด๋‹(pipelining)์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์™„์ „ํžˆ ์ „์†ก๋˜๊ธฐ ์ด์ „์— ๋‘ ๋ฒˆ์งธ ์š”์ฒญ ์ „์†ก์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

[์ถœ์ฒ˜] - MDN

HTTP/1.0์—์„œ๋Š” ๋‹จ๊ธฐ ์ปค๋„ฅ์…˜(Short-lived connections)์„ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ๊ธฐ ์ปค๋„ฅ์…˜์€ ๊ฐ๊ฐ์˜ HTTP ์š”์ฒญ๋งˆ๋‹ค TCP handshake๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. TCP ์ปค๋„ฅ์…˜์€ ์ง€์†์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ์—์„œ ํ†ต์‹ ์ด ์ง€์†๋์„ ๋•Œ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ TCP์˜ ํšจ์œจ์ ์ธ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹จ๊ธฐ ์ปค๋„ฅ์…˜์€ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ HTTP/1.1์—๋Š” ์ง€์†์ ์ธ ์ปค๋„ฅ์…˜(Persistent connection)์ด ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค. ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ปค๋„ฅ์…˜์„ ์—ด์–ด๋†“๊ณ  ๊ทธ ์‹œ๊ฐ„ ๋™์•ˆ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. TCP ์ปค๋„ฅ์…˜์€ ํ•ญ์ƒ ์œ ์ง€๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ตœ์†Œํ•œ ์–ผ๋งˆ๋‚˜ ์—ด๋ ค์žˆ์–ด์•ผํ• ์ง€ ์„ค์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€์†์ ์ธ ์ปค๋„ฅ์…˜์€ TCP handshake ๋น„์šฉ์ด ํฌ๊ฒŒ ์ค„์–ด๋“ค์–ด์„œ ์ด์ „ ๋ฐฉ์‹๋ณด๋‹ค ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์—๋„ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

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

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

๋˜ํ•œ ์‘๋‹ต์˜ ์ค‘์š”๋„์— ๋”ฐ๋ผ ์‘๋‹ต๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋œ ์ค‘์š”ํ•œ ์‘๋‹ต์— ์ค‘์š”ํ•œ ์‘๋‹ต์ด ๋ฐ€๋ ค ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ์ค‘์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, HTTP HOL ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋‚ด์šฉ์ด๋‹ˆ HTTP HOL์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

HTTP HOL

ํ•˜๋‚˜์˜ TCP ์—ฐ๊ฒฐ์—์„œ 3๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ์–ป์œผ๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ HTTP์˜ ์š”์ฒญ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

| --- a.png --- |
                | --- b.png --- |
                                | --- c.png --- |

a.png, b.png, c.png ์ˆœ์„œ๋Œ€๋กœ ์‚ฌ์ง„์„ ์š”์ฒญํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋Œ€๋กœ ๋ณด๋‚ธ ์š”์ฒญ์˜ ์ˆ˜ ๋งŒํผ ์‘๋‹ต์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๊ฐ€์‹ ๋‹ค๋ฉด ์œ„์— ์žˆ๋Š” ์„ธ ๋ฒˆ์งธ ์‚ฌ์ง„์„ ๋ณด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ์ž˜ ๊ฐ€์‹ค๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์ฒซ ๋ฒˆ์งธ๋กœ ์š”์ฒญ์„ ํ•œ a.png์˜ ํŒŒ์ผ์ด ๋„ˆ๋ฌด ํฌ๊ฑฐ๋‚˜ ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์—์„œ ํŒจํ‚ท ์œ ์‹ค์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์‘๋‹ต์ฒ˜๋ฆฌ๊ฐ€ ๋Šฆ์–ด์ง€๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

| ------------------ a.png ----------------- |
                                             | --- b.png --- |
                                                             | --- c.png --- |

์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด a.png์˜ ์‘๋‹ต์ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „๊นŒ์ง€ b.png์™€ c.png๋Š” ๋Œ€๊ธฐ๋ฅผ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ํ˜„์ƒ์„ HTTP์˜ Head of Line Blocking(HTTP HOL)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ์ด๋Š” ํŒŒ์ดํ”„๋ผ์ด๋‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ HTTP/1.1์˜ ํฐ ๋ฌธ์ œ์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Domain Sharding, Image Sprites ๋“ฑ์˜ ๊ธฐ์ˆ ๋„ ๋„์ž…ํ•˜์ง€๋งŒ(์ž์„ธํ•œ ์„ค๋ช…์€ ์—ฌ๊ธธ ํด๋ฆญํ•˜์„ธ์š”) ๊ฒฐ๊ตญ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์•ˆ์ด ๋˜์ง€๋Š” ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

HTTP/2์˜ ๋“ฑ์žฅ

2010๋…„, Google์€ SPDY ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. SPDY๋Š” HTTP ํ—ค๋”๋ฅผ ๋‹จ์ˆœํ™”ํ•˜์—ฌ ์••์ถ•ํ•˜์—ฌ ์ „์†กํ•˜๊ณ , ๊ธฐ์กด์— ๋ณด๋ƒˆ๋˜ HTTP ํ—ค๋”์™€ ๊ฐ™์€ ๋‚ด์šฉ์˜ ํ—ค๋”๊ฐ€ ์žฌ์ „์†ก๋  ๊ฒฝ์šฐ ํ•ด๋”๋Š” ๋นผ๊ณ  ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๋‹ค๋ฅธ ๋‚ด์šฉ์˜ ํ—ค๋”๊ฐ€ ์ „์†ก๋  ๊ฒฝ์šฐ ์ด ๋‹ค๋ฅธ ๋ถ€๋ถ„๋งŒ ์••์ถ•ํ•˜์—ฌ ์ „์†ก์„ ํ•ฉ๋‹ˆ๋‹ค.(๋‹ค๋ฅธ ๊ธฐ์ˆ ๋“ค๋„ ๋” ์žˆ์Šต๋‹ˆ๋‹ค!) SPDY๋Š” ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์คฌ๊ณ , ์ดํ›„ HTTP/2์˜ ์ดˆ์•ˆ์— SPDY ๊ทœ๊ฒฉ์ด ์ฐธ๊ณ ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ๋ถ€ํ„ฐ HTTP/2์˜ ํฐ ํŠน์ง•๋“ค์„ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

Binary protocol

[์ถœ์ฒ˜] - Google Developers / High Performance Browser Networking(O'Reilly, Ilya Grigorik)

์ด์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ํ…์ŠคํŠธ ํ”„๋กœํ† ์ฝœ์™€๋Š” ์ „ํ˜€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค! ๊ธฐ์กด์— ํ†ตํ•ฉ๋˜์–ด ์ ํ˜€์žˆ๋˜ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ํ—ค๋” ๋ถ€๋ถ„๊ณผ ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์ด๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. HTTP์˜ ์ฒด๊ณ„(Methods, Headers, verbs ๋“ฑ๋“ฑ)๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์—์„œ ์„œ๋กœ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ธ์ฝ”๋”ฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

Stream, Message & Frame

[์ถœ์ฒ˜] - Google Developers / High Performance Browser Networking(O'Reilly, Ilya Grigorik)

Binary Framing ๋งค์ปค๋‹ˆ์ฆ˜์ด ๋„์ž…๋˜๋ฉด์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ๊ตํ™˜ ๋ฐฉ์‹์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ์šฉ์–ด๋“ค์ด ๋“ฑ์žฅํ–ˆ๋Š”๋ฐ ์•ž์œผ๋กœ์˜ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

  • Stream : ์ปค๋„ฅ์…˜ ๋‚ด์—์„œ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์˜ ํ๋ฆ„์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฉ”์„ธ์ง€๊ฐ€ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Message : ์š”์ฒญ ๋˜๋Š” ์‘๋‹ต์˜ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋ ˆ์ž„๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Frame : HTTP/2 ํ†ต์‹ ์˜ ์ตœ์†Œ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.

์œ„ ๊ทธ๋ฆผ์„ ๋ณด์‹œ๋ฉด ํ•œ ๋ฒˆ์˜ ์ปค๋„ฅ์…˜์— N๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์ด ์ „์†ก๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์˜ ์ปค๋„ฅ์…˜์—์„œ ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋•Œ์˜ ์ˆซ์ž ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋”๋ถˆ์–ด ๊ฐ ์ŠคํŠธ๋ฆผ์—๋Š” ๊ณ ์œ ์˜ ์‹๋ณ„์ž์™€ ์šฐ์„ ์ˆœ์œ„ ์ •๋ณด๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ์„œ ์ŠคํŠธ๋ฆผ์ด ์ „์†ก๋˜๊ณ  ๊ณ ์œ ์˜ ์‹๋ณ„์ž๋ฅผ ํ†ตํ•ด ์ด ํ”„๋ ˆ์ž„๋“ค์„ ๋‹ค์‹œ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Multiplexing

HTTP/1.x์€ ๋ฌธ์ œ์ ์„ Domain Sharding์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ๋Š” Multiplexing์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์„ ํ•œ ๋ฒˆ์˜ ์ปค๋„ฅ์…˜์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด, ์ด ๊ณผ์ •์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” HTTP ๋ฉ”์„ธ์ง€๋ฅผ ๋…๋ฆฝ๋œ ํ”„๋ ˆ์ž„์œผ๋กœ ์„ธ๋ถ„ํ™”ํ•˜๊ณ , ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ํ”„๋ ˆ์ž„์„ ์ธํ„ฐ๋ฆฌ๋น™ํ•œ ๋‹ค์Œ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฐ›๋Š” ์ชฝ์—์„œ๋Š” ๊ณ ์œ ์˜ ์‹๋ณ„์ž๋ฅผ ํ†ตํ•ด ์ด ํ”„๋ ˆ์ž„๋“ค์„ ๋‹ค์‹œ ์กฐ๋ฆฝํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ดํ•ดํ•˜๊ธฐ ํŽธํ•˜์‹ค ๊ฒ๋‹ˆ๋‹ค.

[์ถœ์ฒ˜] - Google Developers / High Performance Browser Networking(O'Reilly, Ilya Grigorik)

์ด ๊ธฐ์ˆ ์„ ํ†ตํ•ด HTTP ํ†ต์‹ ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์—„์ฒญ๋‚œ ์˜ํ–ฅ์„ ๋ฏธ์ณค์Šต๋‹ˆ๋‹ค. ๋”๋ถˆ์–ด HTTP/1.x ๊ธฐ์ˆ ์—์„œ ์‚ฌ์šฉํ•˜๋˜ Image Sprites๋‚˜ Domain Sharding๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ๋“ค์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ๋”๋ถˆ์–ด ์šฐ์„ ์ˆœ์œ„ ๋ณ„๋กœ ์ „์†ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€ ๋กœ๋”ฉ์ด ํšจ์œจ์ ์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

[์ถœ์ฒ˜] - MaxCDN / What is Domain Sharding?

[์ถœ์ฒ˜] - https://ngio.co.kr/448

Server Push

HTTP/2์—๋Š” ์„œ๋ฒ„ ํ‘ธ์‹œ๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค. HTTP/1.x์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์„ ํ•˜๋‚˜๋ฅผ ๋ณด๋‚ด๋ฉด ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋‹จ ํ•˜๋‚˜๋งŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. HTTP/2๋ถ€ํ„ฐ ์„œ๋ฒ„ ํ‘ธ์‹œ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ, ํด๋ผ์ด์–ธํŠธ์—์„œ ์›๋ž˜ ์š”์ฒญํ•œ ์‘๋‹ต ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•ž์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญํ•  ์ถ”๊ฐ€์ ์ธ ๋ฆฌ์†Œ์Šค๋“ค์„ ๋ฏธ๋ฆฌ ์‘๋‹ตํ•ด์ค๋‹ˆ๋‹ค. ์ด๋Š” PUSH_PROMISE ํ”„๋ ˆ์ž„์„ ํ†ตํ•ด ๊ตฌํ˜„๋œ ๊ธฐ์ˆ ์ด๊ณ  ์ด ๋˜ํ•œ ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์ด๋‹ˆ ์—ฌ๊ธฐ์—์„œ ์ž์„ธํžˆ ์ฝ์–ด๋ณด์‹œ๊ธธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.

์‰ฝ๊ณ„ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— index.html ํ•˜๋‚˜๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด HTML ์•ˆ์—๋Š” CSS, img, js ๋“ฑ ๋งŽ์€ ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค๋“ค์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์ ํ˜€์žˆ์Šต๋‹ˆ๋‹ค. HTML/1.x ํ†ต์‹ ์ธ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋Š” HTML์„ ์‘๋‹ต๋ฐ›์€ ๋’ค HTML ๋ฌธ์„œ๋ฅผ ํ•ด์„ํ•ด ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋“ค ๋‹ค์‹œ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. HTTP/2 ํ†ต์‹ ๋ถ€ํ„ฐ๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์–ด๋–ค ๋ฆฌ์†Œ์Šค๋“ค์„ ๋ณด๋‚ด์•ผํ•˜๋Š”์ง€ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ์–ด, HTML์„ ์ „์†กํ•˜๋ฉด์„œ ๋™์‹œ์— HTML๋ฌธ์„œ์— ํฌํ•จ๋œ ๋ฆฌ์†Œ์Šค๋“ค์„ ๊ฐ™์ด ํ‘ธ์‹œํ•ด์ค๋‹ˆ๋‹ค.

Header Compression

[์ถœ์ฒ˜] - Google Developers / High Performance Browser Networking(O'Reilly, Ilya Grigorik)

HTTP ํ—ค๋”์—๋Š” ์ „์†ก๋˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ์†์„ฑ์ด ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. HTTP/1.x์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋“ค์€ ํ•ญ์ƒ ํ…์ŠคํŠธ๋กœ ์ „์†ก๋๊ณ  ์ด๋Š” ์ „์†ก ๋‹น 500~800 ๋ฐ”์ดํŠธ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค. HTTP/2์—์„œ๋Š” ์ด๋Ÿฐ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ ์ž HPACK ์••์ถ•์„ ํ†ตํ•ด ์š”์ฒญ ๋ฐ ์‘๋‹ต ํ—ค๋” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค. HPACK์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด

  • ์ด์ „์— ๋ณด๋‚ธ ํ—ค๋” ํ•„๋“œ์˜ ์ƒ‰์ธ ๋ชฉ๋ก์„ ์„œ๋ฒ„๊ฐ€ ์œ ์ง€ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์ค‘๋ณต๋˜๋Š” ํ—ค๋” ํ•„๋“œ๋ฅผ ์ œ์™ธํ•œ ํ—ค๋” ํ•„๋“œ๋งŒ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ์ด์ „ ํ—ค๋”์—์„œ ๋‹ฌ๋ผ์ง„ ๊ฐ’๋งŒ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์ „์— Huffman ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๊ธฐ์ˆ ๋“ค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ๋ฆ„ ์ œ์–ด, One connection per origin ๋“ฑ์˜ ๊ธฐ์ˆ ๋กœ ๊ธฐ์กด์˜ HTTP/1.x ๋ณด๋‹ค ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ TCP ํ†ต์‹ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๊ธฐ์—์„œ ์ง์ ‘ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


[์ถœ์ฒ˜]

https://developers.google.com/web/fundamentals/performance/http2?hl=ko

https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP

https://falsy.me/http์˜-๋ฒ„์ „-๋ณ„-์ฐจ์ด์—-๋Œ€ํ•ด-์•Œ์•„๋ณด๊ณ -ubuntu-nginx์—-http-2๋ฅผ-์ ์šฉํ•ด/

https://www.popit.kr/๋‚˜๋งŒ-๋ชจ๋ฅด๊ณ -์žˆ๋˜-http2/

๋ฐ˜์‘ํ˜•