๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์›น ์„œ๋น„์Šค

HTTP ๊ธฐ๋ณธ

by alswlfl 2022. 11. 29.

HTTP(HyperText Transfer Protocol)

HTTP ๋ฉ”์‹œ์ง€์— ๋ชจ๋“  ๊ฒƒ์„ ๋‹ด์•„์„œ ์ „์†ก

- HTML, TEXT

- IMAGE, ์Œ์„ฑ, ์˜์ƒ, ํŒŒ์ผ

- JSON, XML (API)

- ๊ฑฐ์˜ ๋ชจ๋“  ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ€๋Šฅ

- ์„œ๋ฒ„ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ๋„ ๋Œ€๋ถ€๋ถ„ HTTP ์‚ฌ์šฉ

 

HTTP ์—ญ์‚ฌ

- HTTP/0.9 1991๋…„: GET ๋ฉ”์„œ๋“œ๋งŒ ์ง€์›, HTTP ํ—ค๋” X

- HTTP/1.0 1996๋…„: ๋ฉ”์„œ๋“œ, ํ—ค๋” ์ถ”๊ฐ€

- HTTP/1.1 1997๋…„: ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ, ์šฐ๋ฆฌ์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฒ„์ „

RFC2068 (1997) -> RFC2616 (1999) -> RFC7230~7235 (2014)

- HTTP/2 2015๋…„: ์„ฑ๋Šฅ ๊ฐœ์„ 

- HTTP/3 ์ง„ํ–‰์ค‘: TCP ๋Œ€์‹ ์— UDP ์‚ฌ์šฉ, ์„ฑ๋Šฅ ๊ฐœ์„ 

 

๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ

TCP: HTTP1.1, HTTP/2

UDP: HTTP/3

ํ˜„์žฌ HTTP/1.1 ์ฃผ๋กœ ์‚ฌ์šฉ

HTTP/2, HTTP/2๋„ ์ ์  ์ฆ๊ฐ€

 

HTTP ํŠน์ง•

  1. ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ๊ตฌ์กฐ
  2. ๋ฌด์ƒํƒœ ํ”„๋กœํ† ์ฝœ(์Šคํ…Œ์ด์Šค๋ฆฌ์Šค), ๋น„์—ฐ๊ฒฐ์„ฑ
  3. HTTP ๋ฉ”์‹œ์ง€
  4. ๋‹จ์ˆœํ•จ, ํ™•์žฅ ๊ฐ€๋Šฅ

1. ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ๊ตฌ์กฐ

  • Request Response ๊ตฌ์กฐ
  • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต์„ ๋Œ€๊ธฐ
  • ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‘๋‹ต

 

2. ๋ฌด์ƒํƒœ ํ”„๋กœํ† ์ฝœ(์Šคํ…Œ์ด์Šค๋ฆฌ์Šค)

: ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š์Œ

์žฅ์ : ์„œ๋ฒ„ ํ™•์žฅ์„ฑ์ด ๋†’์Œ(์Šค์ผ€์ผ ์•„์›ƒ)

๋‹จ์ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์ „์†ก

 

Stateful, Stateless ์ฐจ์ด

Stateful: ์ƒํƒœ ์œ ์ง€

- ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ด์ „ ์ƒํƒœ๋ฅผ ๋ณด์กด(๋ฌธ๋งฅ ๋ณด์กด)

- ์ค‘๊ฐ„์— ์„œ๋ฒ„๊ฐ€ ๋ฐ”๋€Œ๋ฉด, ์„œ๋น„์Šค ์žฅ์•  ๋ฐœ์ƒ → ํ•ญ์ƒ ๊ฐ™์€ ์„œ๋ฒ„๊ฐ€ ์œ ์ง€๋˜์–ด์•ผ ํ•จ

ex) ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ์ ์›์œผ๋กœ ๋ฐ”๋€Œ๋ฉด ์•ˆ๋จ(์ค‘๊ฐ„์— ๋‹ค๋ฅธ ์ ์›์œผ๋กœ ๋ฐ”๋€” ๋•Œ ์ƒํƒœ ์ •๋ณด๋ฅผ ๋‹ค๋ฅธ ์ ์›์—๊ฒŒ ๋ฏธ๋ฆฌ ์•Œ๋ ค์•ผํ•จ)

- ๋ฌธ์ œ์ : ํด๋ผ์ด์–ธํŠธ๋Š” ํ•œ ์„œ๋ฒ„์™€ ๊ณ„์† ํ†ต์‹ ์„ ํ•ด์•ผํ•˜๋Š”๋ฐ, ์ค‘๊ฐ„์— ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ์ฃฝ์–ด๋ฒ„๋ฆฌ๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์š”์ฒญํ•ด์•ผํ•จ 

 

Stateless: ๋ฌด์ƒํƒœ

- ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋•Œ๊ทธ๋•Œ ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌํ•˜๋ฏ€๋กœ, ์ค‘๊ฐ„์— ์„œ๋ฒ„๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์•„๋ฌด ๋ฌธ์ œ ์—†์Œ → ์•„๋ฌด ์„œ๋ฒ„๋‚˜ ํ˜ธ์ถœํ•ด๋„ ๋จ

- ๊ฐ‘์ž๊ธฐ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด ์ฆ๊ฐ€ํ•ด๋„ ์„œ๋ฒ„๋ฅผ ๋Œ€๊ฑฐ ํˆฌ์ž… ๊ฐ€๋Šฅ

- ๋ฌด์ƒํƒœ๋Š” ์‘๋‹ต ์„œ๋ฒ„๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ → ๋ฌดํ•œํ•œ ์„œ๋ฒ„ ์ฆ์„ค ๊ฐ€๋Šฅ

ex) ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ์ ์›์œผ๋กœ ๋ฐ”๋€Œ์–ด๋„ ๋จ(๊ฐ‘์ž๊ธฐ ๊ณ ๊ฐ์ด ์ฆ๊ฐ€ํ•ด๋„ ์ ์› ๋Œ€๊ฑฐ ํˆฌ์ž… ๊ฐ€๋Šฅ)

- ์ค‘๊ฐ„์— ์„œ๋ฒ„๊ฐ€ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„, ํด๋ผ์ด์–ธํŠธ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Œ

- ์Šค์ผ€์ผ ์•„์›ƒ: ์ˆ˜ํ‰ ํ™•์žฅ ์œ ๋ฆฌ

- ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉ

- ๋ฌธ์ œ์ : ๋ฐ์ดํ„ฐ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๋ณด๋ƒ„

๋ฌด์ƒํƒœ์˜ ํ•œ๊ณ„์ 

๋ชจ๋“  ๊ฒƒ์„ ๋ฌด์ƒํƒœ๋กœ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ณ  ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ

๋ฌด์ƒํƒœ

ex) ๋กœ๊ทธ์ธ์ด ํ•„์š”์—†๋Š” ๋‹จ์ˆœํ•œ ์„œ๋น„์Šค ์†Œ๊ฐœ ํ™”๋ฉด

์ƒํƒœ ์œ ์ง€

 ex) ๋กœ๊ทธ์ธ

๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ๋กœ๊ทธ์ธ ํ–ˆ๋‹ค๋Š” ์ƒํƒœ๋ฅผ ์„œ๋ฒ„์— ์œ ์ง€

์ผ๋ฐ˜์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ์ฟ ํ‚ค์™€ ์„œ๋ฒ„ ์„ธ์…˜ ๋“ฑ์„ ์‚ฌ์šฉํ•ด์„œ ์ƒํƒœ ์œ ์ง€

์ƒํƒœ ์œ ์ง€๋Š” ์ตœ์†Œํ•œ๋งŒ ์‚ฌ์šฉ

 

 


3. ๋น„ ์—ฐ๊ฒฐ์„ฑ(connectionless)

TCP/IP๋Š” ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•จ 

์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋Š” ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ

ํด๋ผ์ด์–ธํŠธ1๊ณผ ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์„ ํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์Œ, ๊ทธ ์ดํ›„ ํด๋ผ์ด์–ธํŠธ2์™€ ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์„ ํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์Œ(์ด๋•Œ, ํด๋ผ์ด์–ธํŠธ1์€ ์„œ๋ฒ„์™€ ๊ณ„์† ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•จ) → ์ด๋Ÿฐ ๊ฒฝ์šฐ, ์š”์ฒญ/์‘๋‹ต์„ ์ฃผ๊ณ  ๋ฐ›์ง€ ์•Š๋Š” ํด๋ผ์ด์–ธํŠธ์™€๋„ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ์ž์›์ด ์†Œ๋ชจ๋จ

 

์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ

ํด๋ผ์ด์–ธํŠธ1๊ณผ ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์„ ํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์€ ํ›„(์š”์ฒญ, ์‘๋‹ต) ์—ฐ๊ฒฐ์„ ๋Š์–ด๋ฒ„๋ฆผ, ๊ทธ ํ›„ ํด๋ผ์ด์–ธํŠธ2์™€ ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์„ ํ•œํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์€ ํ›„ ์—ฐ๊ฒฐ์„ ๋Š์Œ(์„œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์ฃผ๊ณ  ๋ฐ›๊ณ  ์—ฐ๊ฒฐ์„ ๋Š์Œ) → ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ, ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” ์ž์›์„ ํ˜„์žฌ ์š”์ฒญ์„ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ๋งŒ ์—ฐ๊ฒฐ์„ ํ•˜๊ณ  ๋Š์–ด๋ฒ„๋ ค์„œ, ์„œ๋ฒ„๊ฐ€ ์œ ์ง€ํ•˜๋Š” ์ž์›์„ ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์ž„

๋‹จ์ : ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋Š” ๊ณผ์ •์ด ํ•ญ์ƒ ์žˆ์–ด์•ผํ•จ

 

๋น„ ์—ฐ๊ฒฐ์„ฑ

  • HTTP๋Š” ๊ธฐ๋ณธ์ด ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ธ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ดˆ ๋‹จ์œ„์˜ ์ดํ•˜์˜ ๋น ๋ฅธ ์†๋„๋กœ ์‘๋‹ต
  • 1์‹œ๊ฐ„ ๋™์•ˆ ์ˆ˜์ฒœ๋ช…์ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์‹ค์ œ ์„œ๋ฒ„์—์„œ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์š”์ฒญ์€ ์ˆ˜์‹ญ๊ฐœ ์ดํ•˜๋กœ ๋งค์šฐ ์ž‘์Œ
    • ex) ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ณ„์† ์—ฐ์†ํ•ด์„œ ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์ง€๋Š” ์•Š๋Š”๋‹ค.
  • ์„œ๋ฒ„ ์ž์›์„ ๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋‹จ์ 

TCP/IP ์—ฐ๊ฒฐ์„ ์ƒˆ๋กœ ๋งบ์–ด์•ผ ํ•จ - 3 way handshake ์‹œ๊ฐ„ ์ถ”๊ฐ€

์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์‚ฌ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜๋ฉด HTML ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, css, ์ถ”๊ฐ€ ์ด๋ฏธ์ง€ ๋“ฑ๋“ฑ ์ˆ˜ ๋งŽ์€ ์ž์›์ด ํ•จ๊ป˜ ๋‹ค์šด๋กœ๋“œ

์ง€๊ธˆ์€ HTTP ์ง€์† ์—ฐ๊ฒฐ(Persistent Connections)๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ

HTTP/2, HTTP/3์—์„œ ๋” ๋งŽ์€ ์ตœ์ ํ™”

 

HTTP ์ง€์† ์—ฐ๊ฒฐ: ์—ฐ๊ฒฐ ํ›„, ์š”์ฒญ/์‘๋‹ต์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์—ฐ๊ฒฐ ์œ ์ง€(๋‚ด๋ถ€ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฆ„-๋ช‡ ์ดˆ๋™์•ˆ ์œ ์ง€ ๋“ฑ๋“ฑ)

[์ดˆ๊ธฐ HTTP ๋™์ž‘ ์›๋ฆฌ]

[HTTP ์ง€์† ์—ฐ๊ฒฐ ๋™์ž‘ ์›๋ฆฌ]


HTTP ๋ฉ”์‹œ์ง€

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€์™€ HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€์˜ ๊ตฌ์กฐ๋Š” ๋‹ค๋ฆ„

HTTP ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ

- ๊ณต๋ฐฑ ๋ผ์ธ์€ ๋ฌด์กฐ๊ฑด ์žˆ์–ด์•ผ ํ•จ

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€

์š”์ฒญ ๋ฉ”์‹œ์ง€๋„ body ๋ณธ๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€

 

1) ์‹œ์ž‘ ๋ผ์ธ

์š”์ฒญ ๋ฉ”์‹œ์ง€

start-line=request-line/status-line

request-line=method SP(๊ณต๋ฐฑ) request-target SP HTTP-version CRLF(์—”ํ„ฐ)

  • โญ๏ธ HTTP ๋ฉ”์„œ๋“œ(GET: ์กฐํšŒ)
    • ์ข…๋ฅ˜: GET, POST, PUT, DELETE
    • ์„œ๋ฒ„๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋™์ž‘ ์ง€์ •
    •   GET: ๋ฆฌ์†Œ์Šค ์กฐํšŒ
    •   POST: ์š”์ฒญ ๋‚ด์—ญ ์ฒ˜๋ฆฌ
  • ์š”์ฒญ ๋Œ€์ƒ(/search?q=hello&hl=ko)
    • absolute-path[?query] (์ ˆ๋Œ€๊ฒฝ๋กœ[?์ฟผ๋ฆฌ])
    • ์ ˆ๋Œ€๊ฒฝ๋กœ="/"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ๋กœ
  • HTTP Version

์‘๋‹ต ๋ฉ”์‹œ์ง€

start-line=request-line/status-line

status-line = HTTP-version SP status-code SP reason-phrase CRLF

  • HTTP ๋ฒ„์ „
  • HTTP ์ƒํƒœ ์ฝ”๋“œ: ์š”์ฒญ ์„ฑ๊ณต, ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋ƒ„
    • 200: ์„ฑ๊ณต
    • 400: ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์˜ค๋ฅ˜
    • 500: ์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜
  • ์ด์œ  ๋ฌธ๊ตฌ: ์‚ฌ๋žŒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์งง์€ ์ƒํƒœ ์ฝ”๋“œ ์„ค๋ช… ๊ธ€

 

2) HTTP ํ—ค๋”

header-field = field-name ":" OWS field-value OWS (OWS: ๋„์–ด์“ฐ๊ธฐ ํ—ˆ์šฉ)

field-name์€ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ฌธ ์—†์Œ

<์šฉ๋„>

  • HTTP ์ „์†ก์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ถ€๊ฐ€ ์ •๋ณด ํฌํ•จ
    • ex) ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋‚ด์šฉ, ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ํฌ๊ธฐ, ์••์ถ•, ์ธ์ฆ, ์š”์ฒญ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์ •๋ณด, ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด, ์บ์‹œ ๊ด€๋ฆฌ ์ •๋ณด...
  • ํ‘œ์ค€ ํ—ค๋”๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Œ
  • ํ•„์š”์‹œ ์ž„์˜์˜ ํ—ค๋” ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

 

3) HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””

<์šฉ๋„>

  • ์‹ค์ œ ์ „์†กํ•  ๋ฐ์ดํ„ฐ
  • HTML ๋ฌธ์„œ, ์ด๋ฏธ์ง€, ์˜์ƒ, JSON ๋“ฑ๋“ฑ byte๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ€๋Šฅ