๐Ÿ”ฌComputer Science/๋„คํŠธ์›Œํฌ

TIL) HTTP ํŠน์ง•, ์š”์ฒญ(Request) & ์‘๋‹ต(Response)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ—ค๋”, ์ฝ˜ํ…์ธ  ํ˜‘์ƒ ํ—ค๋”

hellohailie 2022. 7. 13. 14:10

 

HTTP ์—ญ์‚ฌ

์‘์šฉ๊ณ„์ธต์— ์†ํ•˜๋Š” HTTP, ์ด๋Š” ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. 

HTTP ์—ญ์‚ฌ

HTTP/ 1.1 ~ HTTP/2 ๋Š” TCP ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ,

HTTP/3 ๋Š” UDP ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ

 

 


HTTP ํŠน์ง•

  • ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ๊ตฌ์กฐ = ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๋Š” ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค. 
  • ๋ฌด์ƒํƒœ์„ฑ ํ”„๋กœํ† ์ฝœ (stateless) = ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜  ์ƒํƒœ๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š๋Š”๋‹ค. (ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ธฐ์–ตํ•ด์„œ ๋ฐ์ดํ„ฐ ์ „์†ก)

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

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

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

  • ๋น„์—ฐ๊ฒฐ์„ฑ (connectionless) = ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค. (์‹ค์ œ๋กœ ์š”์ฒญ์„ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ๋งŒ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ณ  ์‘๋‹ต์„ ์ฃผ๊ณ  ๋‚˜๋ฉด TCP/IP ์—ฐ๊ฒฐ์„ ๋Š๋Š”๋‹ค. ์ตœ์†Œํ•œ์˜ ์ž์›์œผ๋กœ ์„œ๋ฒ„ ์œ ์ง€๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. )

- ์žฅ์  : ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์ง€ ์•Š๊ณ , ๋น ๋ฅธ ์‘๋‹ต์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋น„์—ฐ๊ฒฐ์„ฑ์˜ ํŠน์ง•์€ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. 

- ๋‹จ์  : ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ๊ณ , ํฐ ๊ทœ๋ชจ์˜ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•  ๋•Œ๋Š” ๋น„์—ฐ๊ฒฐ์„ฑ์— ํ•œ๊ณ„๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค. 

1. TCP/IP ์—ฐ๊ฒฐ์‹œ (3 way handshake) ์‹œ๊ฐ„ ์ถ”๊ฐ€

2. ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์‚ฌ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜๋ฉด html, css, js ๋“ฑ ๋งŽ์€ ์ž์›์ด ํ•จ๊ป˜ ๋‹ค์šด๋กœ๋“œ ๋œ๋‹ค. 

 

๐Ÿ‘‰ HTTP ์ง€์† ์—ฐ๊ฒฐ(persistent connections) ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ

์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ง€๊ณ  ๋‚œ ๋’ค, ๊ฐ๊ฐ์˜ ์ž์›๋“ค์„ ์š”์ฒญํ•˜๊ณ  ๋ชจ๋“  ์ž์›์— ๋Œ€ํ•œ ์‘๋‹ต์ด ๋Œ์•„์˜จ ํ›„์— ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•œ๋‹ค. 

  • HTTP ๋ฉ”์„ธ์ง€
  • ๋‹จ์ˆœํ•จ, ํ™•์žฅ ๊ฐ€๋Šฅ

 

 


HTTP ๋ฉ”์„ธ์ง€ ( HTTP ํ—ค๋” & ๋ฐ”๋””)

  • HTTP ๋ฐ”๋”” : ๋ฐ์ดํ„ฐ ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ์„ ํ†ตํ•ด ํ‘œํ˜„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. (๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์–ด๋‚˜๋ฅด๋Š” ๋ถ€๋ถ„ : ํŽ˜์ด๋กœ๋“œ)

*ํ‘œํ˜„์€ ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์—์„œ ์ „๋‹ฌํ•œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋œปํ•˜๋ฉฐ ํ‘œํ˜„ ํ—ค๋”๋Š” ํ‘œํ˜„ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. 

 

  • HTTP ํ—ค๋” : HTTP ์ „์†ก์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ถ€๊ฐ€์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค. 

ex) ๋ฉ”์„ธ์ง€ ๋ฐ”๋””์˜ ๋‚ด์šฉ, ๋ฉ”์„ธ์ง€ ๋ฐ”๋””์˜ ํฌ๊ธฐ, ์••์ถ•, ์ธ์ฆ, ์š”์ฒญ ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ ์ •๋ณด, ์บ์‹œ ๊ด€๋ฆฌ ์ •๋ณด...

  • HTTP ํ—ค๋” ํ˜•์‹

<field-name> : <field-value>

(field-name์€ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†๋‹ค. )

 

ํ‘œํ˜„ ํ—ค๋”

  • Content-Type : ํ‘œํ˜„ ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹ / ๋ฏธ๋””์–ด ํƒ€์ž…, ๋ฌธ์ž ์ธ์ฝ”๋”ฉ
  • Content-Encoding : ํ‘œํ˜„ ๋ฐ์ดํ„ฐ์˜ ์••์ถ• ๋ฐฉ์‹ / ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณณ์—์„œ ์••์ถ• ํ›„ ์ธ์ฝ”๋”ฉ ํ—ค๋” ์ถ”๊ฐ€ & ๋ฐ์ดํ„ฐ ์ฝ๋Š” ์ชฝ์—์„œ ์ธ์ฝ”๋”ฉ ํ—ค๋”์˜ ์ •๋ณด๋กœ ์••์ถ• ํ•ด์ œ
  • Content-Language : ํ‘œํ˜„ ๋ฐ์ดํ„ฐ์˜ ์ž์—ฐ ์–ธ์–ด
  • Content-Length : ํ‘œํ˜„ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด / ๋ฐ”์ดํŠธ ๋‹จ์œ„ / transfer-encoding ์‚ฌ์šฉํ•˜๋ฉด content-length ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. (transfer-encoding์€ chunked ๋ฐฉ์‹์ธ๋ฐ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•ด์„œ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค. )

ํ‘œํ˜„ ํ—ค๋”๋Š” ์š”์ฒญ, ์‘๋‹ต ๋‘˜ ๋‹ค ์‚ฌ์šฉ.

 


HTTP ์ฃผ์š” header

์š”์ฒญ(Request)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ—ค๋”

* From: ์œ ์ € ์—์ด์ „ํŠธ์˜ ์ด๋ฉ”์ผ ์ •๋ณด

๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 

* Referer: ์ด์ „ ์›น ํŽ˜์ด์ง€ ์ฃผ์†Œ

ํ˜„์žฌ ์š”์ฒญ๋œ ํŽ˜์ด์ง€์˜ ์ด์ „ ์›น ํŽ˜์ด์ง€ ์ฃผ์†Œ,

a -> b ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ, b๋ฅผ ์š”์ฒญํ•  ๋•Œ Referer: a๋ฅผ ํฌํ•จํ•ด์„œ ์š”์ฒญํ•œ๋‹ค. 

์œ ์ž…๊ฒฝ๋กœ ์ˆ˜์ง‘ ๊ฐ€๋Šฅํ•˜๋‹ค. 

* User-Agent: ์œ ์ € ์—์ด์ „ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด

์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํŒŒ์•…๊ฐ€๋Šฅํ•˜๋‹ค. 

ํ†ต๊ณ„ ์ •๋ณด

 

* Host: ์š”์ฒญํ•œ ํ˜ธ์ŠคํŠธ ์ •๋ณด(๋„๋ฉ”์ธ) / ํ•„์ˆ˜ ํ—ค๋”

ํ•˜๋‚˜์˜ ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ํ˜ธ์ŠคํŠธ ์ •๋ณด๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. 

ํ•˜๋‚˜์˜ IP ์ฃผ์†Œ์— ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์ด ์ ์šฉ๋˜์–ด ์žˆ์„ ๋•Œ ํ˜ธ์ŠคํŠธ ์ •๋ณด๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. 

 

(Host ์ •๋ณด๊ฐ€ ์—†๋‹ค๋ฉด IP ์ฃผ์†Œ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์–ด๋–ค ๋„๋ฉ”์ธ์œผ๋กœ ์š”์ฒญ์ด ์™”๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ต๋‹ค. )

* Origin: ์„œ๋ฒ„๋กœ POST ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, ์š”์ฒญ์„ ์‹œ์ž‘ํ•œ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋ƒ„

์—ฌ๊ธฐ์„œ ์š”์ฒญ์„ ๋ณด๋‚ธ ์ฃผ์†Œ์™€ ๋ฐ›๋Š” ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๋ฉด CORS ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

์‘๋‹ต ํ—ค๋”์˜ access-control-allow-origin ๊ณผ ๊ด€๋ จ

* Authorization: ์ธ์ฆ ํ† ํฐ(e.g. JWT)์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ—ค๋”

ํ† ํฐ์˜ ์ข…๋ฅ˜ + ์‹ค์ œ ํ† ํฐ ๋ฌธ์ž๋ฅผ ์ „์†ก

 

ex) Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l


์‘๋‹ต(Response)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ—ค๋”

* Server: ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ORIGIN ์„œ๋ฒ„์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ •๋ณด

* Date: ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„

* Location: ํŽ˜์ด์ง€ ๋ฆฌ๋””๋ ‰์…˜

์›น ๋ธŒ๋ผ์šฐ์ €๋Š” 3xx ์‘๋‹ต ๊ฒฐ๊ณผ์— Location ํ—ค๋”๊ฐ€ ์žˆ์œผ๋ฉด, Location ์œ„์น˜๋กœ ์ž๋™ ์ด๋™

201(created) : Location ๊ฐ’์€ ์š”์ฒญ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค URI

3xx(redirection) : Location ๊ฐ’์€ ์š”์ฒญ์„ ์ž๋™์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 

* Allow: ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ HTTP ๋ฉ”์„œ๋“œ

405(method not allowed)์—์„œ ์‘๋‹ต์— ํฌํ•จ

ex) Allow : GET, HEAD, PUT

* Retry-After: ์œ ์ € ์—์ด์ „ํŠธ๊ฐ€ ๋‹ค์Œ ์š”์ฒญ์„ ํ•˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์‹œ๊ฐ„

 

503(service unavailable) : ์„œ๋น„์Šค๊ฐ€ ์–ธ์ œ๊นŒ์ง€ ๋ถˆ๋Šฅ์ธ์ง€ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Œ

 


์ฝ˜ํ…์ธ  ํ˜‘์ƒ ํ—ค๋” = ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ํ‘œํ˜„ ์š”์ฒญ

Accept : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๋ฏธ๋””์–ด ํƒ€์ž… ์ „๋‹ฌ

Accept-Charset : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๋ฌธ์ž ์ธ์ฝ”๋”ฉ

Accept-Encoding : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์••์ถ• ์ธ์ฝ”๋”ฉ

Accept-Language : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์ž์—ฐ ์–ธ์–ด / ์šฐ์„  ์ˆœ์œ„ ์š”์ฒญ๋„ ๊ฐ€๋Šฅ

if) ํ•œ๊ตญ์–ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŠน์ • ์›น์‚ฌ์ดํŠธ์— ์ ‘์†ํ–ˆ์„ ๋•Œ ์ฝ˜ํ…์ธ  ํ˜‘์ƒ(Accept-Language)์ด ์ ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์„œ๋ฒ„๋Š” ์š”์ฒญ์œผ๋กœ ๋ฐ›์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ ์–ธ์–ด๋กœ ์„ค์ •๋œ ์˜์–ด๋กœ ์‘๋‹ตํ•œ๋‹ค.

if) ํด๋ผ์ด์–ธํŠธ์—์„œ Accept-Language๋กœ KO๋ฅผ ์ž‘์„ฑํ•ด ์š”์ฒญํ•œ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ํ•ด๋‹น ์šฐ์„ ์ˆœ์œ„ ์–ธ์–ด๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๊ตญ์–ด๋กœ ๋œ ์‘๋‹ต์„ ๋Œ๋ ค์ค€๋‹ค.

 

* ํ˜‘์ƒ ํ—ค๋”๋Š” ์š”์ฒญ์‹œ์—๋งŒ ์‚ฌ์šฉ

 

์ฐธ๊ณ ) 

 

https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

https://developer.mozilla.org/ko/docs/Web/HTTP/Content_negotiation

 

 

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“