[TIL] ๐ŸŒHTTP (Hyper Text Transfer Protocol)

YJinยท2025๋…„ 3์›” 22์ผ

[๋‚ด๋ฐฐ์บ  Spring 6๊ธฐ_TIL]

๋ชฉ๋ก ๋ณด๊ธฐ
13/56

๐ŸŒHTTP (Hyper Text Transfer Protocol)

HTTP ๋™์ž‘ ๋ฐฉ์‹

  • ํด๋ผ์ด์–ธํŠธ: ์„œ๋ฒ„์— ์ž์›์„ ์š”์ฒญ(Request)
  • ์„œ๋ฒ„: ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ต(Response)

์ฃผ์š” ํŠน์ง•

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

  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘
  • ์„œ๋ฒ„๋Š” ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์„ ๊ตฌ์„ฑ

๐Ÿ“Œ ๋น„์—ฐ๊ฒฐ(Connection-less)
: ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์š”์ฒญ-์‘๋‹ต ํ›„ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์ง€ ์•Š์Œ. ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ ์„ค์ • ํ•„์š”.

  • ์„œ๋ฒ„๋Š” ์—ฐ๊ฒฐ ์„ค์ •์— ํ•„์š”ํ•œ ์ž์› ์†Œ๋ชจ ํ•ด๊ฒฐ
  • ์š”์ฒญ๋งˆ๋‹ค ์—ฐ๊ฒฐ ์„ค์ •(3-way Handshaking) ํ•ด์•ผํ•˜๋ฏ€๋กœ ์‘๋‹ต ์‹œ๊ฐ„ ์ฆ๊ฐ€
  • ์บ์‹œ, ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ๋กœ ํ•ด๊ฒฐ
  • ํ˜„์žฌ๋Š” HTTP ์ง€์†์—ฐ๊ฒฐ(Persistent Connections) ์œผ๋กœ ํ•ด๊ฒฐ
    • ํ•˜๋‚˜์˜ ์š”์ฒญ์— ํ•„์š”ํ•œ ์š”์ฒญ๋“ค์ด ๋ชจ๋‘ ์‘๋‹ต๋  ๋•Œ ๊นŒ์ง€ ์—ฐ๊ฒฐ์„ ์œ ์ง€

๐Ÿ“Œ ๋ฌด์ƒํƒœ(State-less)
: ์„œ๋ฒ„๋Š” ์ด์ „ ์š”์ฒญ์˜ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Œ

  • Cookie, Session, Token ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ณด์™„


HTTP ๋ฉ”์†Œ๋“œ

  • POST : ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ
    - Message Body๋ฅผ ํ†ตํ•ด ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ

  • GET : ๋ฆฌ์†Œ์Šค ์กฐํšŒ
    - ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ํฌํ•จ O / X ๊ฒฝ์šฐ

  • PUT : ๋ฆฌ์†Œ์Šค ๋ฎ์–ด์“ฐ๊ธฐ
    - POST์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•˜์—ฌ URI๋ฅผ ์ง€์ •
    - ๊ธฐ์กด ๋ฆฌ์†Œ์Šค ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ: ์ „์ฒด ์ˆ˜์ • (๋Œ€์ฒด๋œ ๋ฆฌ์†Œ์Šค)
    - ๊ธฐ์กด ๋ฆฌ์†Œ์Šค ์กด์žฌ, ์ผ๋ถ€ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ: ๋ฎ์–ด์“ฐ๊ธฐ (๋Œ€์ฒด๋œ ๋ฆฌ์†Œ์Šค)
    - ๊ธฐ์กด ๋ฆฌ์†Œ์Šค X : ์ƒˆ๋กœ ์ƒ์„ฑ

  • PATCH : ๋ฆฌ์†Œ์Šค ๋ถ€๋ถ„ ์ˆ˜์ • (๋ถ€๋ถ„ ์ˆ˜์ •๋œ ๋ฆฌ์†Œ์Šค)
  • DELETE : ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

๐Ÿ’ก PUT vs PATCH

PUT: ์ „์ฒด ์ˆ˜์ • (๋ฆฌ์†Œ์Šค๋ฅผ ์™„์ „ํžˆ ๋ฎ์–ด์”€)

PATCH: ๋ถ€๋ถ„ ์ˆ˜์ • (์ผ๋ถ€ ํ•„๋“œ๋งŒ ๋ณ€๊ฒฝ)

HTTP ๋ฉ”์†Œ๋“œ์˜ ์†์„ฑ

1. ์•ˆ์ „์„ฑ(Safe)
- ์•ˆ์ „: GET (์กฐํšŒ)
- ์•ˆ์ „X: POST, PUT, DELETE, PATCH โ€”> ๋ฐ์ดํ„ฐ ์ˆ˜์ •/์‚ญ์ œ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ์š”์ฒญ

2. ๋ฉฑ๋“ฑ์„ฑ(Idempotent)

  • ๊ฐ™์€ ์—ฐ์‚ฐ ์—ฌ๋Ÿฌ๋ฒˆ ํ•ด๋„ ๊ฒฐ๊ณผ ๋ณ€ํ•˜์ง€์•Š์Œ
    - POST: ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅX
    - GET, PUT, DELETE: ๋ฉฑ๋“ฑ์„ฑ O

  • ์‚ฌ์šฉ์ž์˜ ์‹ค์ˆ˜๋กœ ์ธํ•œ ์ค‘๋ณต ์š”์ฒญ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
    - ์˜๋„์ ์ธ ๋™์ผ ์š”์ฒญ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹˜ (ex. A์—์„œ B๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜์—ˆ์œผ๋‚˜ ๋‹ค์‹œ A๋กœ ๋Œ์•„๊ฐ€ ์š”์ฒญ ๋ณด๋ƒ„)
    - ์ด ๊ฒฝ์šฐ ํ† ํฐ ์‚ฌ์šฉ, ์„œ๋ฒ„์—์„œ ๋™์ผ ์š”์ฒญ ์ œ์ถœ ์ฐจ๋‹จ ๋“ฑ์˜ ์ถ”๊ฐ€์ ์ธ ์กฐ์น˜๊ฐ€ ํ•„์š”

  • ์žฌ์š”์ฒญ ์ค‘์— ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ๋˜๋Š” ๊ฑด ๋ฉฑ๋“ฑ์„ฑ ์œ„๋ฐ˜์œผ๋กœ ๊ณ ๋ ค X

  • ์š”์ฒญ์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ ์žฌ์‹œ๋„ ํ•˜๊ธฐ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.
    1. ํ•ญ์ƒ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋งˆ์Œ๊ป ์žฌ์‹œ๋„ ํ•ด๋„๋œ๋‹ค.
    2. ๋งŒ์•ฝ ๋ฉฑ๋“ฑํ•˜์ง€ ์•Š๋‹ค๋ฉด, ์ค‘๋ณต ์š”์ฒญ์„ ๋ณด๋‚ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
    3. ๋ฉฑ๋“ฑ์„ฑ์€ ๋ณต๊ตฌ ๋งค์ปค๋‹ˆ์ฆ˜์— ์‚ฌ์šฉํ•œ๋‹ค.
    • ex) ์š”์ฒญ ์‹คํŒจ์‹œ ์„œ๋ฒ„์—์„œ ์ž๋™์œผ๋กœ ์žฌ์‹œ๋„ํ•˜๋„๋ก ์ฒ˜๋ฆฌ

3. ์บ์‹œ๊ฐ€๋Šฅ์„ฑ(Cacheable)

  • ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ €์žฅํ•ด๋„ ๋˜๋Š”๊ฐ€?
  • ๊ฐ€๋Šฅ: GET, HEAD, POST
    - ์ฃผ๋กœ GET, HEAD ์ •๋„๋งŒ ์บ์‹œ๋กœ ์‚ฌ์šฉ
    - ์ •์  ์ž์›(HTML, CSS โ€ฆ) ์œ„์ฃผ๋กœ ์บ์‹ฑ


HTTP ์ƒํƒœ ์ฝ”๋“œ

: ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ตํ•˜๋Š” ์ฝ”๋“œ. ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜๋œ๋‹ค.

๐Ÿ”น ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์„œ๋ฒ„๊ฐ€ ๋ฐ˜ํ™˜ํ•ด๋„, ํด๋ผ์ด์–ธํŠธ๋Š” ์ƒ์œ„ ์ƒํƒœ ์ฝ”๋“œ(1xx, 2xx ๋“ฑ)๋กœ ํ•ด์„ํ•˜์—ฌ ์ฒ˜๋ฆฌ
๐Ÿ”น ์ƒ์œ„ ์ƒํƒœ ์ฝ”๋“œ: 1xx, 2xx, 3xx, 4xx, 5xx


  • 1xx : ์ •๋ณด

    • ์š”์ฒญ ์ˆ˜์‹  ํ›„ ์ฒ˜๋ฆฌ์ค‘์ธ ์ƒํƒœ, ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

  • 2xx : ์„ฑ๊ณต

    • 200 OK
    • 201 Created
    • 202 Accepted : ์š”์ฒญ ์ˆ˜์‹  ์™„๋ฃŒ, ์ฒ˜๋ฆฌ๋Š” ์™„๋ฃŒX
    • 204 No Content : ์š”์ฒญ ์„ฑ๊ณต, ์‘๋‹ต ๋ฐ์ดํ„ฐ๋Š” ๋”ฐ๋กœ ์—†์Œ.
  • 3xx : ๋ฆฌ๋‹ค์ด๋ ‰์…˜

  • 4xx : ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ

    • 400 Bad Request : ์ž˜๋ชป๋œ ์š”์ฒญ(ex. ์š”์ฒญ ๋ฉ”์†Œ๋“œ, ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด API ์ŠคํŽ™๊ณผ ๋งž์ง€ ์•Š์Œ)
    • 401 Unauthorized : ์ธ์ฆ ํ•„์š”
    • 403 Forbidden : ์š”์ฒญ ๋ฐ›์•˜์ง€๋งŒ ์Šน์ธ ๊ฑฐ๋ถ€ (์ฃผ๋กœ ์ธ๊ฐ€ authorized ๋ฌธ์ œ)
    • 404 Not Found : ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์„œ๋ฒ„์— ์—†์Œ (ํ˜น์€ ์—†๋Š”์ฒ™)
  • 5xx : ์„œ๋ฒ„ ์—๋Ÿฌ
    - 500 Internal Server Error : ์„œ๋ฒ„ ๋‚ด๋ถ€ ๋ฌธ์ œ, ์ฃผ๋กœ ์ด๊ฑฐ ์‚ฌ์šฉ
    - 503 Service Unavailable : ์„œ๋น„์Šค ์ด์šฉ ๋ถˆ๊ฐ€


PRG ํŒจํ„ด(Post/Redirect/Get)

: ์‚ฌ์šฉ์ž๊ฐ€ POST ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„, ๊ณง๋ฐ”๋กœ GET ์š”์ฒญ์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋Š” ๋ฐฉ์‹
๐Ÿ‘‰ POST โžก๏ธ Redirect(3xx) โžก๏ธ GET

  • Post ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ๋˜ ๋‹ค๋ฅธ URL๋กœ์˜ GET ์š”์ฒญ์„ ์œ„ํ•œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(์‘๋‹ต ์ฝ”๋“œ๊ฐ€ 3XX)์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ

ํ•„์š”์„ฑ

โœ… ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ

  • POST ์š”์ฒญ์€ ๋ฉฑ๋“ฑ์„ฑ์ด ์—†์œผ๋ฏ€๋กœ ์ƒˆ๋กœ๊ณ ์นจ ๋“ฑ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ ์‹œ ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ›„ GET ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ˆ˜์ • ์—†์ด ์•ˆ์ „ํ•œ ์š”์ฒญ์ด ๊ฐ€๋Šฅ

โœ… ์ค‘๋ณต ์š”์ฒญ ๋ฐฉ์ง€

  • POST ์š”์ฒญ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๋™์ผํ•œ ์š”์ฒญ(POST) ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ์Œ
  • PRG ํŒจํ„ด ์ ์šฉ ํ›„, ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„ GET ์š”์ฒญ๋งŒ ํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์ค‘๋ณต ์ƒ์„ฑ๋˜๋Š” ๋ฌธ์ œ ๋ฐฉ์ง€



๐Ÿช์ฟ ํ‚ค&์บ์‹œ

: HTTP๋Š” ๋ฌด์ƒํƒœ(Stateless) ํŠน์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ, ์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ(๋กœ๊ทธ์ธ ์ •๋ณด, ๋ฐฉ๋ฌธ ๊ธฐ๋ก ๋“ฑ)๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Œ
โžก๏ธ ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค์™€ ์บ์‹œ๋ฅผ ํ™œ์šฉ


์ฟ ํ‚ค

: ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ์ €์žฅ๋˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ๋กœ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ์ƒํƒœ๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•œ๋‹ค.

โœ”๏ธ ์ฃผ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ(๋กœ๊ทธ์ธ ์ •๋ณด), ์„ธ์…˜ ์œ ์ง€, ๊ฐœ์ธํ™”๋œ ์„ค์ • ์ €์žฅ ๋“ฑ์— ์‚ฌ์šฉ

์บ์‹œ

: ์„œ๋ฒ„๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ์ค‘ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋‘์–ด ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ.

โœ”๏ธ ์ •์  ์ž์›(HTML, CSS, JS ๋“ฑ)์„ ์ €์žฅํ•˜์—ฌ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„ ํ–ฅ์ƒ
โœ”๏ธ ์„œ๋ฒ„ ์‘๋‹ต์„ ์บ์‹œ๋กœ ์ €์žฅํ•˜์—ฌ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ๊ฐ์†Œ์‹œํ‚ด


profile
๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ๋„ ๋ฝ์ด๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€