HTTP/1.1 vs HTTP/2

HTTP/1.1 ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์‹ 

 

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

 

HTTP 1.1์˜ ๋‹จ์  

 HOLB 

pipelining์ด๋ž€?
ํ•œ๋ฒˆ์˜ Connection์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ฒ• 

ํŒŒ์ดํ”„๋ผ์ด๋‹์˜ ๋‹จ์ ์€ ํ•œ ์š”์ฒญ์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด, ๋‹ค์Œ ์š”์ฒญ์ด ์ง€์—ฐ๋œ๋‹ค. ์ด๊ฒƒ์„ Head of Line Blocking๋ผ๊ณ  ํ•œ๋‹ค.

RTT 

์ผ๋ฐ˜์ ์œผ๋กœ HTTP 1.1์€ ํ•œ๋ฒˆ์˜ ์ปค๋„ฅ์…˜์— ํ•œ๋ฒˆ์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋‹ค๋ณด๋‹ˆ, HandShaking ๊ณผ์ •์ด ๋ฐ˜๋ณต๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ณด๋‹ˆ ๋ถˆํ•„์š”ํ•œ RTT๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜์–ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค.

 

RTT๋ž€? 
ํŒจํ‚ท์ด ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ•˜๊ณ  ๋‚˜์„œ ํ•ด๋‹น ํŒจํ‚ท์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์ถœ๋ฐœ์ง€๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ค๊ธฐ๊นŒ์ง€์˜ ์‹œ๊ฐ„. ์ฆ‰, RTT๋Š” ํŒจํ‚ท ์™•๋ณต ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

 

๋ฌด๊ฑฐ์šด Header 

http/1.1์˜ ํ—ค๋”์—๋Š” ๋งŽ์€ ๋ฉ”ํƒ€์ •๋ณด๋“ค์ด ์ €์žฅ๋˜์–ด์ ธ ์žˆ๋‹ค.  ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•œ ์›นํŽ˜์ด์ง€๋Š” ๋‹ค์ˆ˜์˜ http์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๊ฒฝ์šฐ ๋งค ์š”์ฒญ์‹œ ๋งˆ๋‹ค ์ค‘๋ณต๋œ ํ—ค๋”๊ฐ’์„ ์ „์†กํ•˜๊ฒŒ ๋˜๋ฉฐ ๋˜ํ•œ ํ•ด๋‹น domain์— ์„ค์ •๋œ cookie ์ •๋ณด๋„ ๋งค ์š”์ฒญ์‹œ ๋งˆ๋‹ค ํ—ค๋”์— ํฌํ•จ๋˜์–ด ์–ด์ฉ”๋• ์š”์ฒญ์„ ํ†ตํ•ด์„œ ์ „์†กํ•˜๋ ค๋Š” ๊ฐ’๋ณด๋‹ค ํ—ค๋” ๊ฐ’์ด ๋” ํฐ ๊ฒฝ์šฐ๋„ ๋น„์ผ๋น„์žฌ ํ•˜๋‹ค.



์œ„์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋…ธ๋ ฅ๋“ค 

 Image Spriting 

์•„์ด์ฝ˜์„ ํ•˜๋‚˜์˜ ํฐ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด, ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ ์š”์ฒญ ํšŸ์ˆ˜ ์ž์ฒด๋ฅผ ์ค„์ด๋Š” ๋ฐฉ์‹์ด๋‹ค. 

CSS์—์„œ ํ•ด๋‹น ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ์•„์ด์ฝ˜ ์ขŒํ‘œ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•œ๋‹ค.

 Domain Sharding 

๋‹ค์ˆ˜์˜ Connection์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ๋กœ ์š”์ฒญํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ณ„๋กœ Connection ๊ฐœ์ˆ˜ ์ œํ•œ์ด ์กด์žฌํ•œ๋‹ค.

 Minify CSS/javascript 

CSS, Javascript ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ถ•์†Œํ•˜์—ฌ ์ „๋‹ฌํ•œ๋‹ค.

 Data URI Scheme 

Data URI Scheme์€ HTML๋ฌธ์„œ๋‚ด ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค๋ฅผ Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋กœ ์ง์ ‘ ๊ธฐ์ˆ ํ•˜๋Š” ๋ฐฉ์‹์ด๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์š”์ฒญ ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ๋„ ํ•œ๋‹ค.

 Load Faster 

์Šคํƒ€์ผ์‹œํŠธ๋ฅผ HTML ๋ฌธ์„œ ์ƒ์œ„์— ๋ฐฐ์น˜

์Šคํฌ๋ฆฝํŠธ๋ฅผ HTML๋ฌธ์„œ ํ•˜๋‹จ์— ๋ฐฐ์น˜

 

 

 

SPDY์˜ ๋“ฑ์žฅ 

HTTP 1.1์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ๋…ธ๋ ฅ๋“ค์€ ์•„์‰ฝ๊ฒŒ๋„ ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ•˜์ง€๋Š” ๋ชปํ–ˆ๋‹ค. Google์€ Latency ๊ด€์ ์—์„œ HTTP๋ฅผ ๊ณ ์†ํ™”ํ•œ SPDY๋ผ๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. HTTP๋ฅผ ๋Œ€์น˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด ์•„๋‹Œ, HTTP๋ฅผ ํ†ตํ•œ ์ „์†ก์„ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค. ๊ฒฐ๊ตญ HTTP2 ์ดˆ์•ˆ์€ Google์˜ SPDY๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 

HTTP 2์˜ ํƒ„์ƒ

HTTP/2 is a replacement for how HTTP is expressed “on the wire.” It is not a ground-up rewrite of the protocol; HTTP methods, status codes and semantics are the same, and it should be possible to use the same APIs as HTTP/1.x (possibly with some small additions) to represent the protocol. The focus of the protocol is on performance; specifically, end-user perceived latency, network and server resource usage. One major goal is to allow the use of a single connection from browsers to a Web site.

์š”์•ฝํ•˜์ž๋ฉด, HTTP ๋ฉ”์†Œ๋“œ, ์ƒํƒœ ์ฝ”๋“œ ๋ฐ ์˜๋ฏธ๋Š” ๋™์ผํ•˜๋ฉฐ ํ”„๋กœํ† ์ฝœ์„ ๋‚˜ํƒ€ ๋‚ด๊ธฐ ์œ„ํ•ด HTTP/ 1.x์™€ ๋™์ผํ•œ API (์ผ๋ถ€ ์ž‘์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ํฌํ•จ)๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํ”„๋กœํ† ์ฝœ์˜ ์ค‘์ ์€ ์„ฑ๋Šฅ, ํŠนํžˆ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ง€ํ•˜๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„, ๋„คํŠธ์›Œํฌ ๋ฐ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์— ์žˆ๋‹ค. 

HTTP2์˜ ๊ฐœ์„ ์  

Multiplexed Streams

HTTP/2๋Š” Multiplexed Streams๋ฅผ ์ด์šฉํ•˜์—ฌ Connection ํ•œ ๊ฐœ๋กœ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‘๋‹ต์€ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด Stream์œผ๋กœ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค. HTTP/1.1์˜ Connection Keep-Alive, Pipelining์˜ ๊ฐœ์„  ๋ฒ„์ „์ด๋ผ ๋ณด๋ฉด ๋œ๋‹ค.

Stream Prioritization

์ˆœ์„œ์— ์ƒ๊ด€ ์—†์ด Stream์œผ๋กœ ์ฃผ๊ณ  ๋ฐ›๊ฒŒ ๋˜๋ฉด ๋งŒ์•ฝ ๋‹น์žฅ ํ•„์š”ํ•œ ํŒŒ์ผ์˜ ์ˆœ์„œ๊ฐ€ ๋’ค๋กœ ๋ฐ€๋ ค๋‚˜๋ฉด ํ™”๋ฉด ๋ Œ๋”๋ง์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ HTTP/2์—์„œ๋Š” ๋ฆฌ์†Œ์Šค์—๊ฐ„ ์˜์กด๊ด€๊ณ„์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•ด ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

 Server Push

์„œ๋ฒ„๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญํ•˜์ง€ ์•Š๋”๋ผ๋„ ์šฐ์„  ํ•„์š”ํ•œ ํŒŒ์ผ์„ ์ž์ฒด์ ์œผ๋กœ  ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.  ์ด๋ฅผ PUSH_PROMISE ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ PUSH_PROMISE๋ฅผ ํ†ตํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์ „์†กํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด์„  ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋˜๋ฉด ํ›„์— HTML ๋ฌธ์„œ์—์„œ ํŠน์ • ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋”๋ผ๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ฐ›๊ฒŒ ํ•จ์œผ๋กœ์จ ์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. 

 Header Compression  

HTTP/2๋Š” Header ์ •๋ณด๋ฅผ ์••์ถ•ํ•˜๊ธฐ ์œ„ํ•ด Header Table๊ณผ Huffman Encoding ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์ด๋ฅผ HPACK ์••์ถ•๋ฐฉ์‹์ด๋ผ ๋ถ€๋ฅด๋ฉฐ ๋ณ„๋„์˜ ๋ช…์„ธ์„œ(RFC 7531)๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค. ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‘๋ฒˆ์˜ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด HTTP/1.x์˜ ๊ฒฝ์šฐ ๋‘๊ฐœ์˜ ์š”์ฒญ Header์— ์ค‘๋ณต๊ฐ’์ด ์กด์žฌํ•ด๋„ ๊ทธ๋ƒฅ ์ค‘๋ณต ์ „์†กํ•œ๋‹ค. 

 

ํ•˜์ง€๋งŒ HTTP/2์—์„  Header์— ์ค‘๋ณต๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ Static/Dynamic Header Table ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต Header๋ฅผ ๊ฒ€์ถœํ•˜๊ณ  ์ค‘๋ณต๋œ Header๋Š” index๊ฐ’๋งŒ ์ „์†กํ•˜๊ณ  ์ค‘๋ณต๋˜์ง€ ์•Š์€ Header์ •๋ณด์˜ ๊ฐ’์€  Huffman Encoding ๊ธฐ๋ฒ•์œผ๋กœ ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ ํ•˜์—ฌ ์ „์†กํ•œ๋‹ค.

 

 

REFERENCE

https://seokbeomkim.github.io/posts/http1-http2/

 

HTTP/1.1๊ณผ HTTP/2์˜ ์ฐจ์ด์ 

์ผ์ƒ ์† ๊ธ€์“ฐ๊ธฐ

seokbeomKim.github.io

https://www.popit.kr/%EB%82%98%EB%A7%8C-%EB%AA%A8%EB%A5%B4%EA%B3%A0-%EC%9E%88%EB%8D%98-http2/

 

๋‚˜๋งŒ ๋ชจ๋ฅด๊ณ  ์žˆ๋˜ - HTTP/2 | Popit

์ž๊ทธ๋งˆ์น˜ 15๋…„์—ฌ์˜ ์‹œ๊ฐ„์„ ์›น ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์˜ ์ ˆ๋Œ€๊ถŒ์ขŒ์˜ ์ž๋ฆฌ์— ์˜ฌ๋ผ ๊ฟ‹๊ฟ‹์ด ๋ฒ„ํ…จ์˜ค๋˜ HTTP/1.1์— ๋Œ€ํ•œ ๋ฌธ์ œ์ ๊ณผ HTTP/2 ํ”„๋กœ์ฝ”ํ†จ์˜ ํŠน์ง•์— ๋Œ€ํ•ด ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

www.popit.kr