Web/HTTP

HTTP ๊ธฐ๋ณธ ๊ฐœ๋…

 

๐Ÿ“’ Intro

๐Ÿ“ŒHTTP๋ž€?

* HyperText Transfer Protocol

* Image, ์Œ์„ฑ, ์˜์ƒ, JSON, XML (API) ๋“ฑ ๊ฑฐ์˜ ๋ชจ๋“  ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ€๋Šฅ.

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

 

๐Ÿ“ŒHTTP์˜ ์—ญ์‚ฌ

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฒ„์ „ ์žˆ์ง€๋งŒ...

HTTP/1.1 (1997) ๋ฒ„์ „๋งŒ ์•Œ๋ฉด ๋จ. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฒ„์ „.

 

๐Ÿ“Œ ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ

* TCP: HTTP/1.1, HTTP/2

* UDP: HTTP/3

 

๐Ÿ“Œ ํŠน์ง•

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

2. ๋ฌด์ƒํƒœ ํ”„๋กœํ† ์ฝœ(Stateless), ๋น„์—ฐ๊ฒฐ์„ฑ

3. HTTP ๋ฉ”์„ธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด ํ†ต์‹ 

-> ๋‹จ์ˆœํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅ

 

๐Ÿ“’ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ๊ตฌ์กฐ

๐Ÿ“Œํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ!

* ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„์—๋งŒ, UI์™€ ์‚ฌ์šฉ์„ฑ ๋“ฑ์€ ํด๋ผ์ด์–ธํŠธ์—์„œ!

*Request Response ๊ตฌ์กฐ

* ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋Œ€๊ธฐ

* ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‘๋‹ต

 

๐Ÿ“’ Stateful, Stateless

๐Ÿ“Œ Stateful (์ƒํƒœ์œ ์ง€)

 * ํ•˜๋‚˜์˜ ํด๋ผ์ด์–ธํŠธ์— ํ•ญ์ƒ ๊ฐ™์€ ์„œ๋ฒ„๊ฐ€ ์œ ์ง€๋˜์–ด์•ผ ํ•จ. ์„œ๋ฒ„์—์„œ ์ •๋ณด๊ฐ€ ๊ณ„์† ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋‹ˆ๊นŒ.

-> ์žฅ์• ๋‚˜๋ฉด ๋งํ•˜๋Š”๊ฑฐ์ง€.

๐Ÿ“ŒStateless (๋ฌด์ƒํƒœ)

"์„œ๋ฒ„๋Š” ์•„๋ฌด๊ณ ํ†  ๋ชฐ๋ผ์šฉใ… " ์˜ ๋งˆ์ธ๋“œ๋กœ ์ƒํƒœ ์ •๋ณด๋ฅผ ์‹น ๋‹ค ํ•œ๋ฒˆ์— ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ ค์ค˜์•ผ ํ•จ.

 

์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ทธ๋•Œ๊ทธ๋•Œ ์„œ๋ฒ„์—๊ฒŒ ๋‹ค ๋„˜๊ฒจ์คŒ. ์„œ๋ฒ„๋Š” ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์Œ.

-> ์„œ๋ฒ„๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์„œ OK, ๊ฐ‘์ž๊ธฐ ์š”์ฒญ์ด ํญ์ฃผํ•ด๋„ ์„œ๋ฒ„ ์™•๋งŽ์ด ํˆฌ์ž…ํ•ด์ฃผ๋ฉด ๋˜๋‹ˆ๊นŒ OK

-> ์žฅ์• ๋‚˜๋ฉด ์ค‘๊ณ„ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์„œ๋ฒ„๋ž‘ ํ†ต์‹ ํ•˜๋ฉด ๋˜์ง€.

-> ์Šค์ผ€์ผ ์•„์›ƒ(์„œ๋ฒ„ ํ™•์žฅ) ์œ ๋ฆฌ

 

๐Ÿ“Œ Stateless ์˜ ์‹ค๋ฌด ํ•œ๊ณ„

์ƒํƒœ ์œ ์ง€๋Š” ์ตœ์†Œํ•œ์œผ๋กœ ํ•˜๊ณ  ์ตœ๋Œ€ํ•œ stateless๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•˜์ง€๋งŒ, ๋ชจ๋“  ๊ฒƒ์„ stateless๋กœ ์„ค๊ณ„ํ•  ์ˆ˜๋Š” ์—†์Œ.

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

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

 

๐Ÿ“Œ Stateless ์˜ ์ค‘์š”์„ฑ

์„ ์ฐฉ์ˆœ ์ด๋ฒคํŠธ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. ์ •ํ™•ํžˆ ๋™์‹œ์— ์ˆ˜๋งŽ์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ๋ฐœ์ƒ!

-> ์ตœ๋Œ€ํ•œ statelessํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ์„œ๋ฒ„๋ฅผ ๋Š˜๋ ค์„œ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Œ.

 

๋ณดํ†ต์€ ๋กœ๊ทธ์ธ๋„ ํ•„์š”์—†๊ณ  ์ƒํƒœ๋„ ์—†๋Š” HTML ์ •์  ํŽ˜์ด์ง€๋ฅผ ๋จผ์ € ๋ฟŒ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ๋Œ์–ด์„œ ์š”์ฒญ์„ ์ข€ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ใ…Žใ…Ž

 

๐Ÿ“’ ๋น„์—ฐ๊ฒฐ์„ฑ (connectionless)

๐Ÿ“Œ๋น„์—ฐ๊ฒฐ์„ฑ์ด๋ž€?

* ์—ฌ๋Ÿฌ๊ฐœ์˜ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ์„ ๋•Œ ์„œ๋ฒ„ ํ•˜๋‚˜๋‹น ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ์™€ ๊ณ„์† ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ 1:1๋กœ ํ•˜๋‚˜์”ฉ๋งŒ ์—ฐ๊ฒฐ ์œ ์ง€

-> ์„œ๋ฒ„ ์ž์›์„ ๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

* HTTP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ธ

 

๐Ÿ“Œ ๋น„์—ฐ๊ฒฐ์„ฑ์˜ ํ•œ๊ณ„์™€ ๊ทน๋ณต

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

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

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

๐Ÿ“Œ HTTP ์ง€์† ์—ฐ๊ฒฐ

ํ•œ๋ฒˆ ์—ฐ๊ฒฐ ํ›„ ๊ณ„์† ์—ฐ๊ฒฐ ์œ ์ง€ - ์š”์ฒญ - ์‘๋‹ต - ์š”์ฒญ - ์‘๋‹ต - ์š”์ฒญ - ์‘๋‹ต - ์ข…๋ฃŒ

 

๐Ÿ“’ HTTP ๋ฉ”์„ธ์ง€

๐Ÿ“Œ ์ „์ฒด์ ์ธ HTTP ๋ฉ”์„ธ์ง€ ๊ตฌ์กฐ

๐Ÿ“Œ HTTP ์š”์ฒญ ๋ฉ”์„ธ์ง€ 

HTTP ์š”์ฒญ ๋ฉ”์„ธ์ง€

 

๐Ÿ“ start-line (์‹œ์ž‘ ๋ผ์ธ)

start-line์€ request-line ๊ณผ status-line์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š”๋ฐ ์š”์ฒญ ๋ฉ”์„ธ์ง€์˜ start-line์€ request-line!

request-line์˜ ๊ตฌ์กฐ๋Š” ๋ฐ”๋กœ

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

* HTTP method:  GET, POST, PUT, DELETE ๋“ฑ๋“ฑ

* request-target: '/'๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ ˆ๋Œ€๊ฒฝ๋กœ

* HTTP-version: HTTP/1.1 ๊ฐ™์€ ๋ฒ„์ „

 

 

๐Ÿ“Œ HTTP ์‘๋‹ต ๋ฉ”์„ธ์ง€

HTTP ์‘๋‹ต ๋ฉ”์„ธ์ง€

๐Ÿ“ start-line (์‹œ์ž‘ ๋ผ์ธ)

์‘๋‹ต ๋ฉ”์„ธ์ง€์˜ start-line์€ status-line!

status-line์˜ ๊ตฌ์กฐ๋Š” ๋ฐ”๋กœ

HTTP-version SP(๊ณต๋ฐฑ) status-target SP reason-phrase CRLF(์—”ํ„ฐ)

* HTTP-version: HTTP/1.1 ๊ฐ™์€ ๋ฒ„์ „

* status-target: ์š”์ฒญ ์„ฑ๊ณต,์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋ƒ„ (200: ์„ฑ๊ณต / 400: ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์˜ค๋ฅ˜ / 500: ์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜)

* reason-target: ์ด์œ  ๋ฌธ๊ตฌ. ์‚ฌ๋žŒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์งง์€ ์ƒํƒœ ์ฝ”๋“œ ์„ค๋ช…๊ธ€

 

๐Ÿ“Œ header (ํ—ค๋”)

๐Ÿ“ ๊ตฌ์กฐ

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

* field-name: ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„X

 

๐Ÿ“ ์šฉ๋„

* HTTP ์ „์†ก์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ถ€๊ฐ€์ •๋ณด. 

* ๋ฉ”์„ธ์ง€ ๋ฐ”๋””์˜ ๋‚ด์šฉ, ๋ฉ”์„ธ์ง€ ๋ฐ”๋””์˜ ํฌ๊ธฐ, ์••์ถ•, ์ธ์ฆ, ์š”์ฒญ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €) ์ •๋ณด, ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด, ์บ์‹œ ๊ด€๋ฆฌ ์ •๋ณด ๋“ฑ๋“ฑ ํ•„์š”ํ•œ ๋ฉ”ํƒ€์ •๋ณด๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด์žˆ์Œ.

* ํ‘œ์ค€ ํ—ค๋”๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ์Œ

* ํ•„์š”์‹œ ์ž„์˜์˜ ํ—ค๋” ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

 

๐Ÿ“Œ message body

* ์‹ค์ œ ์ „์†กํ•  ๋ฐ์ดํ„ฐ

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