HTTP (HyperText Transfer Protocol)

์ž‘์„ฑ์ผ2021-03-19

HTTP๋ž€?

HTTP(HyperText Transfer Protocol)๋Š” ์›น ์„œ๋ฒ„์™€ ์›น ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

HTTP ํ†ต์‹ 
HTTP ํ†ต์‹ 

HTTP์˜ ์ผ๋ฐ˜์ ์ธ ๋™์ž‘์€ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ TCP ์œ„์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค. ์ด๋ฏธ ์—ฐ๊ฒฐ์ด ๋งบ์–ด์กŒ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์—, ๋ฉ”์„ธ์ง€๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ฐ ์žฅ์น˜์—์„œ๋Š” TCP ์„ธ๊ทธ๋จผํŠธ์˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ HTTP ๋ฉ”์„ธ์ง€๋กœ, ํ‘œ์ค€ํ™”๋œ ๊ทœ๊ฒฉ์— ๋งž๊ฒŒ ํ•ด์„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค. HTTP/1.1์€ 1999๋…„์— ํ‘œ์ค€ํ™”๋˜์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ๋Š” HTTP/2 ๋“ฑ ์ƒ์œ„ ๋ฒ„์ „๋„ ๋‚˜์™€์žˆ๋‹ค.

HTTP ๋ฉ”์„ธ์ง€ ๊ตฌ์กฐ

HTTP๋Š” ์ƒํƒœ๊ฐ€ ์—†๋Š”(Stateless) ํ”„๋กœํ† ์ฝœ์ด๊ธฐ ๋–„๋ฌธ์— ์„œ๋ฒ„์—์„œ ์ด์ „ ์š”์ฒญ๋“ค์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฉ”์„ธ์ง€๋Š” ํฌ๊ฒŒ ์š”์ฒญ(Request) ๋ฉ”์„ธ์ง€์™€ ์‘๋‹ต(Response) ๋ฉ”์„ธ์ง€๋กœ ๋‚˜๋‰˜๋ฉฐ ๊ฐ ๋ฉ”์„ธ์ง€๋Š” ํ‘œ์ค€ ๊ทœ๊ฒฉ์„ ๋”ฐ๋ฅธ๋‹ค.

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

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

HTTP ๋ฉ”์„ธ์ง€๋Š” ์š”์ฒญ ๋ผ์ธ, ํ—ค๋”, ๋ณธ๋ฌธ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ์ดํ•ด๋ฅผ ์œ„ํ•ด ์š”์ฒญ ๋ผ์ธ๊ณผ ํ—ค๋”๋ฅผ ์•Œ์•„๋ณด์ž.

Request Line

  • Method: ์š”์ฒญ ๋ฐฉ์‹์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. (GET, POST, PUT, DELETE ๋“ฑ)
  • Request-URI: ์š”์ฒญ ๋Œ€์ƒ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Protocol: HTTP ํ”„๋กœํ† ์ฝœ์˜ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์š”์ฒญ ๋ผ์ธ์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•˜์—ฌ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญํ•˜๋Š”์ง€ ์™€ ์–ด๋–ค ํ”„๋กœํ† ์ฝœ์˜ ๋ฒ„์ „์œผ๋กœ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์š”์ฒญํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

Header

  • Host: ์š”์ฒญ ๋Œ€์ƒ์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • User-Agent: ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Accept: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” ์ปจํ…์ธ  ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Content-Type: ์š”์ฒญ ๋ณธ๋ฌธ์˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Content-Length: ์š”์ฒญ ๋ณธ๋ฌธ์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ํ—ค๋”์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. ์ด๋ฏธ์ง€์—์„œ๋Š” ์ผ๋ถ€ ํ—ค๋”๊ฐ€ ์ƒ๋žต ๋˜์—ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ Content-Length ๊ฐ™์ด ์š”์ฒญ์˜ ๋์„ ์•Œ ์ˆ˜ ์—†์–ด ๋ฉ”์„ธ์ง€ ํ•ด์„์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ TCP ์—ฐ๊ฒฐ์ข…๋ฃŒ ๋์„ ํŒ๋‹จํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์€ HTTP ํด๋ผ์ด์–ธํŠธ๋Š” ๊ธฐ๋ณธ์ ์ธ ํ—ค๋”๋ฅผ ํฌํ•จ๋˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค.

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

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

HTTP ์‘๋‹ต ๋ฉ”์„ธ์ง€๋Š” ์ƒํƒœ ๋ผ์ธ, ํ—ค๋”, ๋ณธ๋ฌธ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ์ดํ•ด๋ฅผ ์œ„ํ•ด ์ƒํƒœ ๋ผ์ธ๊ณผ ํ—ค๋”๋ฅผ ์•Œ์•„๋ณด์ž.

Status Line

  • Protocol: HTTP ํ”„๋กœํ† ์ฝœ์˜ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Status-Code: ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • ์ „์ฒด ๋ฒ”์œ„ ์ •์˜๋œ ๋ฒ”์œ„ ๋ถ„๋ฅ˜
      1xx 100 ~ 101 ์ •๋ณด
      2xx 200 ~ 206 ์„ฑ๊ณต
      3xx 300 ~ 305 ๋ฆฌ๋‹ค์ด๋ ‰์…˜
      4xx 400 ~ 415 ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ
      5xx 500 ~ 505 ์„œ๋ฒ„ ์—๋Ÿฌ
  • Reason-Phrase: ์ƒํƒœ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • ์ƒํƒœ ์ฝ”๋“œ ์‚ฌ์œ  ๊ตฌ์ ˆ ์˜๋ฏธ
      200 OK ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์Œ
      404 Not Found ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ
      500 Internal Server Error ์„œ๋ฒ„ ๋‚ด๋ถ€ ์—๋Ÿฌ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Œ

์ƒํƒœ ๋ผ์ธ์—์„œ๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•˜๋Š” ์ƒํƒœ ์ฝ”๋“œ์™€ ๊ทธ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ƒํƒœ ์ฝ”๋“œ๋Š” RFC9110์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ƒํƒœ ์ฝ”๋“œ์— ๋”ฐ๋ผ ํด๋ผ์ด์–ธํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์‚ฌ์œ ๊ตฌ์ ˆ๊ณผ ํ•œ๊ฐœ์˜ ์ƒํƒœ ์ •๋ณด๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

Header

  • Server: ์„œ๋ฒ„์˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Content-Type: ์‘๋‹ต ๋ณธ๋ฌธ์˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Content-Length: ์‘๋‹ต ๋ณธ๋ฌธ์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Date: ์‘๋‹ต์„ ๋ณด๋‚ธ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Connection: ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋ฉ”์„ธ์ง€ ๋ณธ๋ฌธ

HTTP ๋ฉ”์„ธ์ง€ ์ „๋ฌธ
HTTP ๋ฉ”์„ธ์ง€ ์ „๋ฌธ

HTTP ๋ฉ”์„ธ์ง€์˜ ์š”์ฒญ๋ผ์ธ๊ณผ ์ƒํƒœ๋ผ์ธ ๊ทธ๋ฆฌ๊ณ  ํ—ค๋”๊ฐ€ ๋ฉ”์„ธ์ง€์— ๋Œ€ํ•œ ์„ค์ • ์ •๋ณด๋ผ๋ฉด ๋ณธ๋ฌธ์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค.

HTTP ๋ฉ”์„ธ์ง€ ํ•ด์„์‹œ ๋ณธ๋ฌธ์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋ฉ”์„ธ์ง€ ์ „์ฒด๋ฅผ ๋ณผ ํ•„์š”๊ฐ€์žˆ๋‹ค. ๋จผ์ € ๋ฉ”์„ธ์ง€ ์‹œ์ž‘์„ ์•Œ๊ธฐ์œ„ํ•ด Header์™€ Body๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฐœํ–‰์ด ํ•„์š”ํ•˜๋‹ค. http ๋ฉ”์„ธ์ง€๋Š” ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฝ๊ธฐ ๋•Œ๋ฌธ์— ๋์„ ์•Œ์ˆ˜๊ฐ€ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ๋ฉ”์„ธ์ง€ ํ—ค๋”์˜ Content-Length๋ฅผ ํ†ตํ•ด ๋ณธ๋ฌธ์˜ ๊ธธ์ด๋ฅผ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ณธ๋ฌธ์˜ ๋์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฏธ์ง€์—๋Š” ์š”์ฒญ ๋ณธ๋ฌธ์ด application/x-www-form-urlencodedํ˜•์‹์œผ๋กœ ๋˜์–ด์žˆ๊ณ , ์‘๋‹ต ๋ณธ๋ฌธ์—๋Š” application/htmlํ˜•์‹์œผ๋กœ ๋˜์–ด์žˆ๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›๋Š” ๋Œ€์ƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋„๋ก Content-Type์„ ํ†ตํ•ด ๋ณธ๋ฌธ์˜ ํƒ€์ž…์„ ์•Œ๋ ค์ค€๋‹ค.

HTTP Header Options

HTTP๋Š” TCP ์œ„์—์„œ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, HTTP ํ—ค๋” ์˜ต์…˜์œผ๋กœ TCP์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Keep-Alive ํ—ค๋”๋Š” ํŠน์ • ์‹œ๊ฐ„๋™์•ˆ ์š”์ฒญ์˜ ์„ธ์…˜์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.

Keep-Alive

Keep-Alive๋Š” TCP ์ŠคํŽ™์˜ ์ง€์† ์—ฐ๊ฒฐ(Persistent Connection)์„ ์ด์šฉํ•˜์—ฌ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

GET /index.html HTTP/1.1
Host: www.example.com
Connection: Keep-Alive
Keep-Alive: timeout=60, max=1000
...
Keep-Alive
Keep-Alive๋ฅผ 1๋ถ„์œผ๋กœ ์„ค์ •

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์™€ ๊ฐ™์ด Connection์€ Keep-Alive๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ , Keep-Alive ํ—ค๋”์—๋Š” timeout๊ณผ max๋ฅผ ์„ค์ •ํ•˜์˜€๋‹ค. ์ด ๊ฒฝ์šฐ 60์ดˆ ๋™์•ˆ ์„ธ์…˜์„ ์œ ์ง€ํ•˜๊ณ , ์ตœ๋Œ€ 1000๊ฐœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋จผ์ € ๋„๋‹ฌํ•˜๋ฉด ์„ธ์…˜์„ ์ข…๋ฃŒํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ง€์›๋˜๋Š” Keep-Alive๋Š” ์„ธ์…˜ ๊ณ„์ธต์œผ๋กœ์„œ์˜ ๊ตฌํ˜„์ด๋‹ค.

Copyright ยฉ 2019-2025 Alloc ยท MIT License