Skip to content

HTTP (HyperText Transfer Protocol) โ€‹

๐Ÿงฉ Reference

  • ํ”„๋กœํ† ์ฝœ: ์ปดํ“จํ„ฐ๋ผ๋ฆฌ ํ†ต์‹ ํ•  ๋•Œ ์ง€์ผœ์•ผ ํ•˜๋Š” ๊ทœ์น™ + ํ˜•์‹

  • TLS Handshake: ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋น„๋Œ€์นญํ‚ค(๊ณต๊ฐœํ‚ค/๊ฐœ์ธํ‚ค)๋ฅผ ์ด์šฉํ•ด, ์ดํ›„ ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ๋Œ€์นญํ‚ค(์„ธ์…˜ ํ‚ค)๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ฉ์˜ํ•˜๋Š” ๊ณผ์ •

  • MDN - HTTP ๋ฉ”์‹œ์ง€

๐Ÿงฉ ์•„๋ž˜ ์ •๋ฆฌ๋ฅผ ํ•˜๊ณ  ๊นจ๋‹ฌ์€ ์ !

  • ์™œ refreshToken์„ ์ฟ ํ‚ค์— ๋„ฃ๋Š”์ง€
    โ†’ JS๋กœ ์ ‘๊ทผ ๋ชป ํ•˜๋Š” httpOnly ์ฟ ํ‚ค๋กœ ๊ด€๋ฆฌํ•ด์„œ, ํƒˆ์ทจ ์œ„ํ—˜์„ ์ค„์ด๊ณ  ์ž๋™ ์ „์†ก๋งŒ ๋งก๊ธฐ๋ ค๊ณ .
  • ์™œ accessToken์€ Authorization ํ—ค๋”์— ๋„ฃ๋Š”์ง€
    โ†’ ๋งค ์š”์ฒญ๋งˆ๋‹ค ๋‚ด๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์–ด๋–ค ์‚ฌ์šฉ์ž ๊ถŒํ•œ์ธ์ง€ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด, ํ—ค๋”์— Bearer ํ† ํฐ ํ˜•ํƒœ๋กœ ๋ถ™์ธ๋‹ค.
  • ์™œ httpOnly ์ฟ ํ‚ค๊ฐ€ ๋ณด์•ˆ์ ์œผ๋กœ ์•ˆ์ „ํ•œ์ง€
    โ†’ JS์—์„œ ์ฝ์„ ์ˆ˜ ์—†์–ด์„œ, XSS๋กœ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋– ๋„ ์ฟ ํ‚ค ๋‚ด์šฉ์„ ํ›”์ณ๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ.
  • ์™œ state๊ฐ€ ์—†๋Š” HTTP์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ† ํฐ์„ ๊ณ„์† ๋ณด๋‚ด์•ผ ํ•˜๋Š”์ง€
    โ†’ ์„œ๋ฒ„๋Š” ์ด์ „ ์š”์ฒญ์„ ๊ธฐ์–ตํ•˜์ง€ ์•Š์œผ๋‹ˆ, โ€œ๋‚˜ ๋ˆ„๊ตฌ์ธ์ง€ + ๋‚ด ๊ถŒํ•œโ€ ์ •๋ณด๋ฅผ ํ† ํฐ์œผ๋กœ ๋งค๋ฒˆ ์ฆ๋ช…ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ.
  • ์™œ HTTPS๊ฐ€ ์—†์œผ๋ฉด ํ† ํฐ/์ฟ ํ‚ค๊ฐ€ ํ„ธ๋ฆฌ๋Š”์ง€
    โ†’ ์•”ํ˜ธํ™”๊ฐ€ ์—†์œผ๋ฉด ๋„คํŠธ์›Œํฌ ์ค‘๊ฐ„์—์„œ ํŒจํ‚ท์„ ํ›”์ณ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ, Authorization ํ—ค๋”/์ฟ ํ‚ค๊ฐ€ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ.

HTTP๋ž€? โ€‹

HTTP๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ญ์ƒ ๋จผ์ € ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์š”์ฒญ/์‘๋‹ต ๋ชจ๋ธ์ด๋‹ค.
์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋จผ์ € ๋ง์„ ๊ฑธ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งค๋ฒˆ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ๋งŒ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ†ต์‹  ๊ทœ์•ฝ(ํ”„๋กœํ† ์ฝœ)์ด๋ฉฐ,
HTTP๋Š” ์ƒํƒœ๊ฐ€ ์—†๋Š”(stateless) ํ”„๋กœํ† ์ฝœ์ด๋‹ค.
์ฆ‰ ์„œ๋ฒ„๋Š” ์š”์ฒญ ๊ฐ„์˜ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ธ์ฆ ์ •๋ณด(ํ† ํฐ ๋“ฑ)๋ฅผ ๋งค ์š”์ฒญ๋งˆ๋‹ค ํฌํ•จํ•ด์„œ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค.

plaintext
Client โ†’ (์š”์ฒญ) โ†’ Server
Client โ† (์‘๋‹ต) โ† Server
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์š”์ฒญ(Request)์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต(Response)์„ ๋Œ๋ ค์ค€๋‹ค.

๐Ÿ’ก HTTP๋Š” ์™œ Stateless์ผ๊นŒ?

  • HTTP๋Š” ์š”์ฒญ 1๊ฐœ = ์ฒ˜๋ฆฌ 1๋ฒˆ ํ˜•์‹์˜ ๋‹จ์ˆœํ•œ ํ†ต์‹  ๊ทœ์•ฝ์ด๋‹ค.
  • ์„œ๋ฒ„๋Š” ์ด์ „ ์š”์ฒญ์˜ ์ƒํƒœ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฆ‰, ์„œ๋ฒ„๋Š” "๋„ˆ ๋ˆ„๊ตฌ์˜€์ง€..?" ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ๋งค๋ฒˆ ์ž์‹ ์˜ ์‹ ์›์„ ์ฆ๋ช…ํ•ด์•ผ ํ•˜๊ณ ,
์ด๋ฅผ ์œ„ํ•ด ์š”์ฒญ๋งˆ๋‹ค ์•„๋ž˜ ์ •๋ณด๊ฐ€ ๋ฐ˜๋ณตํ•ด์„œ ํฌํ•จ๋œ๋‹ค:

  • Authorization: Bearer <accessToken>
  • ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ๋ณด๋‚ด๋Š” Cookie (refreshToken)

๐Ÿ’ก ๊ฒฐ๋ก 
HTTP์˜ stateless ํŠน์„ฑ ๋•Œ๋ฌธ์—, ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋Š” ๋งค ์š”์ฒญ๋งˆ๋‹ค ์Šค์Šค๋กœ๋ฅผ ์ฆ๋ช…ํ•ด์•ผ ํ•œ๋‹ค.
JWTยท์ฟ ํ‚คยท์„ธ์…˜ ๊ฐœ๋…์ด ์—ฌ๊ธฐ์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•„์š”ํ•ด์ง„๋‹ค!


HTTP/1.1 vs HTTP/2 โ€‹

HTTP/1.1 โ€‹

HTTP/1.1์—์„œ๋Š” ๋ณดํ†ต

  • ์š”์ฒญ 1 โ†’ ์‘๋‹ต 1 โ†’ ์—ฐ๊ฒฐ ์ข…๋ฃŒ
  • ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค(HTML, JS, CSS, ์ด๋ฏธ์ง€ ๋“ฑ)๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•  ๋•Œ ๊ฐ™์€ ์„œ๋ฒ„์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ์„ ์—ด์–ด์•ผ ํ•ด์„œ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. โ†’ ์ด๋ฏธ์ง€/JS/CSS๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋А๋ ค์ง

์ด ๊ตฌ์กฐ๋Š” ์ •์ ์ธ ์›น์—๋Š” ์ถฉ๋ถ„ํ–ˆ์ง€๋งŒ, ํ˜„๋Œ€ ์›น(์ฑ„ํŒ…, ์•Œ๋ฆผ, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ, ๋Œ€๋Ÿ‰ ๋ฆฌ์†Œ์Šค ๋กœ๋”ฉ)์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.
์ด๋Ÿฐ ์„ฑ๋Šฅ ๋ฌธ์ œ์™€ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด HTTP/2๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค.


HTTP/2 โ€‹

HTTP/2๋Š” ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ๊ธฐ์ˆ ์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š”,
๋™์‹œ์— ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ์ˆ ์ด๋‹ค.

  • ํ•˜๋‚˜์˜ TCP ์—ฐ๊ฒฐ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌ(๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ) โ†’ ๋ธŒ๋ผ์šฐ์ € ๋กœ๋”ฉ ์†๋„๊ฐ€ ํฌ๊ฒŒ ๋นจ๋ผ์ง
  • ํ•œ ๋ฒˆ์˜ TCP ์—ฐ๊ฒฐ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋ณ‘๋ ฌ๋กœ ๋ณด๋ƒ„
  • ๊ฐ ์š”์ฒญ์€ ์ŠคํŠธ๋ฆผ(stream)์ด๋ผ๋Š” ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋จ
  • ํ—ค๋” ์••์ถ• ๋“ฑ ์ถ”๊ฐ€์ ์ธ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ œ๊ณต

๊ฒฐ๊ณผ์ ์œผ๋กœ, ๊ฐ™์€ ํŽ˜์ด์ง€๋ผ๋„ ๋” ๋น ๋ฅด๊ฒŒ ๋กœ๋”ฉ๋œ๋‹ค.


HTTP ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์˜ ์ง„ํ™” โ€‹

๊ธฐ๋ณธ HTTP๋Š” ์š”์ฒญ์ด ์žˆ์–ด์•ผ ์‘๋‹ตํ•˜๋Š” 1ํšŒ์„ฑ ํ†ต์‹ ์ด๋ผ ์‹ค์‹œ๊ฐ„์— ์•ฝํ•˜๋‹ค.
์ด ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ํŒจํ„ด๋“ค์ด Polling โ†’ Long Polling โ†’ SSE โ†’ WebSocket์ด๋‹ค.

Polling โ€‹

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ผ์ • ๊ฐ„๊ฒฉ์œผ๋กœ ๊ณ„์† ์„œ๋ฒ„์— ๋ฌผ์–ด๋ณด๋Š” ๋ฐฉ์‹์ด๋‹ค.

plaintext
Client โ†’ "์•Œ๋ฆผ ์žˆ์–ด?" โ†’ Server
Client โ†’ "์•Œ๋ฆผ ์žˆ์–ด?" โ†’ Server
Client โ†’ "์•Œ๋ฆผ ์žˆ์–ด?" โ†’ Server
...
  • ์žฅ์ : ๊ตฌํ˜„์ด(setInterval + fetch ์ •๋„๋กœ ๊ฐ€๋Šฅ) ์‰ฝ๋‹ค.
  • ๋‹จ์ :
    • ์‹ค์‹œ๊ฐ„์ด ์•„๋‹˜ (์š”์ฒญ ์ฃผ๊ธฐ๋งŒํผ ๋”œ๋ ˆ์ด)
    • ๋งค๋ฒˆ ์š”์ฒญ์œผ๋กœ ์ธํ•ด ํŠธ๋ž˜ํ”ฝ ๋‚ญ๋น„
    • ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์ปค์ง ("์—†์Œ" ์‘๋‹ต๋„ ๊ณ„์† ๋ณด๋‚ด์•ผ ํ•จ)

Long Polling โ€‹

์ผ๋ฐ˜ Polling์„ ๊ฐœ์„ ํ•œ ๋ฐฉ์‹์œผ๋กœ, ์„œ๋ฒ„๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ๊ธธ ๋•Œ๊นŒ์ง€ ์‘๋‹ต์„ ๋Šฆ๊ฒŒ ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

plaintext
Client โ†’ ์š”์ฒญ ๋ณด๋ƒ„
Server โ†’ ์ƒˆ ์ด๋ฒคํŠธ๊ฐ€ ์ƒ๊ธธ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
Server โ†’ ์ด๋ฒคํŠธ ๋ฐœ์ƒ! ์‘๋‹ต ์ „์†ก
Client โ†’ ๋ฐ”๋กœ ๋‹ค์‹œ ์š”์ฒญ
  • ์žฅ์ :
    • ์ผ๋ฐ˜ ํด๋ง๋ณด๋‹ค ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊น๋‹ค.
    • ๊ฑฐ์˜ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €/์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•œ๋‹ค.
  • ๋‹จ์ :
    • ์—ฐ๊ฒฐ์„ ๊ณ„์† ์—ด์—ˆ๋‹ค ๋‹ซ์•˜๋‹ค ๋ฐ˜๋ณต
    • ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์—ฌ์ „ํžˆ ํฌ๊ณ 
    • ์ฑ„ํŒ…/๊ฒŒ์ž„์ฒ˜๋Ÿผ ์ด๋ฒคํŠธ๊ฐ€ ๋งŽ์€ ์„œ๋น„์Šค์—๋Š” ๋น„ํšจ์œจ์ ์ด๋‹ค.

SSE (Server-Sent Events) โ€‹

Polling์ด ์•„๋‹ˆ๋ผ, ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ ๋ฐฉํ–ฅ์œผ๋กœ ์ผ๋ฐฉ์ ์œผ๋กœ ๊ณ„์† ํ‘ธ์‹œ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์ด๋‹ค.
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•œ ๋ฒˆ ์—ฐ๊ฒฐ์„ ์—ด๋ฉด, ์„œ๋ฒ„๊ฐ€ ์ŠคํŠธ๋ฆผ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† push ํ•ด์ค€๋‹ค.

plaintext
Client โ†’ ์—ฐ๊ฒฐ ์—ด๊ธฐ (GET /streams)
Server โ†’ "์•Œ๋ฆผ ๋ฐœ์ƒ!"
Server โ†’ "์ƒˆ ๊ธ€ ๋“ฑ๋ก!"
Server โ†’ "์ฃผ์‹ ๊ฐ€๊ฒฉ ๋ณ€๊ฒฝ!"
...
  • ์žฅ์ :

    • ์ง„์งœ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊น๋‹ค. (๋”œ๋ ˆ์ด ๊ฑฐ์˜ ์—†์Œ)
    • ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ ๋ฐฉํ–ฅ push ๊ฐ€๋Šฅ
    • ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ์ง€์› (EventSource API)
    • HTTP ๊ธฐ๋ฐ˜์ด๋ผ ๋ฐฉํ™”๋ฒฝ/ํ”„๋ก์‹œ ํ†ต๊ณผ๊ฐ€ ์ˆ˜์›”ํ•˜๋‹ค.
  • ๋‹จ์ :

    • ๋‹จ๋ฐฉํ–ฅ: ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ ,
      ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ fetch / AJAX / fetch API ํ•„์š”ํ•˜๋‹ค.
    • ์–‘๋ฐฉํ–ฅ ์ฑ„ํŒ…์—๋Š” ๋ถ€์ ํ•ฉํ•˜๋‹ค.
    • ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €(IE)๋Š” ๋ฏธ์ง€์›

WebSocket (์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„) โ€‹

HTTP ํ•œ๊ณ„๋ฅผ ์™„์ „ํžˆ ๋„˜์–ด์„œ, ์„œ๋ฒ„ โ†” ํด๋ผ์ด์–ธํŠธ ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.
์ดˆ๊ธฐ์—๋Š” HTTP ์š”์ฒญ์œผ๋กœ ํ•ธ๋“œ์…ฐ์ดํฌ๋ฅผ ํ•˜๊ณ , ์ดํ›„์—๋Š” WebSocket ํ”„๋กœํ† ์ฝœ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋˜์–ด ๋™์ž‘ํ•œ๋‹ค.

plaintext
Client โ‡„ Server
(์–‘์ชฝ ๋ชจ๋‘ ๋จผ์ € ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ)
  • ์žฅ์ :

    • ์„œ๋ฒ„ โ†” ํด๋ผ์ด์–ธํŠธ ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ 
    • ์ฑ„ํŒ…, ๊ฒŒ์ž„, ๊ณต๋™ ๋ฌธ์„œ ํŽธ์ง‘ ๋“ฑ ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค์— ์ ํ•ฉํ•˜๋‹ค.
  • ๋‹จ์ :

    • SSE๋ณด๋‹ค ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ๋†’๋‹ค.
    • ์„œ๋ฒ„ ์ธํ”„๋ผ์— ๋Œ€ํ•œ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    • ์—ฐ๊ฒฐ์„ ๊ณ„์† ์œ ์ง€ํ•˜๋ฏ€๋กœ, ์ ‘์†์ž ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๊ฐ€ ์ค‘์š”ํ•ด์ง„๋‹ค.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ:

    • ์นด์นด์˜คํ†ก, ๋””์Šค์ฝ”๋“œ, ๊ฒŒ์ž„, ํ˜‘์—…ํˆด ๋“ฑ ์‹ค์ œ ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ

HTTP ์š”์ฒญ(Request)์˜ ๊ตฌ์กฐ โ€‹

๊ตฌ์„ฑ ์š”์†Œ์„ค๋ช…์˜ˆ์‹œ
Request Line์–ด๋–ค ๋ฉ”์„œ๋“œ๋กœ ์–ด๋–ค URL๋กœ ์š”์ฒญํ•˜๋Š”์ง€GET /users/1 HTTP/1.1
Method์„œ๋ฒ„์—๊ฒŒ ์–ด๋–ค ๋™์ž‘์„ ์š”์ฒญํ• ์ง€GET, POST, PUT, DELETE
URL์ž์›์˜ ์œ„์น˜https://api.example.com/users
Header์š”์ฒญ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด (ํ† ํฐ, ํƒ€์ž… ๋“ฑ)Authorization, Cookie, Content-Type
Body์‹ค์ œ ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐJSON, FormData ๋“ฑ

Authorization Header โ€‹

Bearer Token ๋ฐฉ์‹:

http
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

๋‹ค๋ฅธ ์ธ์ฆ ๋ฐฉ์‹๋“ค:

http
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l  // Base64 ์ธ์ฝ”๋”ฉ
Authorization: Digest username="user", realm="example.com"
Authorization: API-Key your-api-key-here

์™œ Bearer๋ฅผ ์“ธ๊นŒ?

  • RFC 6750์—์„œ ์ •์˜๋œ ํ‘œ์ค€
  • ์ด ํ† ํฐ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ(Bearer)์—๊ฒŒ ๊ถŒํ•œ ๋ถ€์—ฌ๋ผ๋Š” ์˜๋ฏธ
  • OAuth 2.0์—์„œ ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ

์š”์ฒญ ํ—ค๋”์—์„œ ๋ฐ˜๋“œ์‹œ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” 3๋Œ€์žฅ โ€‹

    1. Authorization - accessToken์„ ๋‹ด๋Š” ๊ณณ
    http
    Authorization: Bearer eyJhbGciOiJIUzI1Ni...
    1. Cookie - refreshToken์ด ์ž๋™์œผ๋กœ ์ €์žฅ๋˜๊ณ  ์ž๋™์œผ๋กœ ์‹ค๋ฆฌ๋Š” ๊ณณ
    http
    Cookie: refresh_token=abcdefg12345;
    1. Content-Type - ์„œ๋ฒ„์—๊ฒŒ Body ํ•ด์„ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์คŒ
    http
    Content-Type: application/json

HTTP ์‘๋‹ต(Response)์˜ ๊ตฌ์กฐ โ€‹

๊ตฌ์„ฑ ์š”์†Œ์„ค๋ช…
Status Line์„ฑ๊ณต/์‹คํŒจ ์ฝ”๋“œ (200, 400, 401, 500 ๋“ฑ)
Headers์„œ๋ฒ„๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์ •๋ณด
Body์‹ค์ œ ์‘๋‹ต ๋ฐ์ดํ„ฐ

Representation Headers๋ž€? โ€‹

Representation Headers๋Š” ์‘๋‹ต Body(์ฝ˜ํ…์ธ ) ์ž์ฒด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
(Content-Type, Content-Length, Last-Modified, ETag ๋“ฑ)

์ฆ‰, โ€œ์ด Body๋Š” ์–ด๋–ค ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ์ธ์ง€, ์–ธ์ œ ๋งŒ๋“ค์–ด์กŒ๊ณ , ์–ผ๋งˆ๋‚˜ ํฌ๊ณ , ์บ์‹ฑ์€ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”์ง€โ€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.


plaintext
Set-Cookie: refresh_token=abcd1234; HttpOnly; Secure; SameSite=Strict
  • ๋ธŒ๋ผ์šฐ์ €๋Š” Set-Cookie ํ—ค๋”๋ฅผ ๋ฐ›๋Š” ์ˆœ๊ฐ„ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•˜๊ณ ,
    ๊ฐ™์€ ๋„๋ฉ”์ธ/๊ฒฝ๋กœ ๊ทœ์น™์— ๋งž๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ Cookie ํ—ค๋”์— ์ž๋™์œผ๋กœ ์‹ค์–ด ๋ณด๋‚ธ๋‹ค.
  • ํ”„๋ก ํŠธ ์ฝ”๋“œ์—์„œ ๋”ฐ๋กœ ์ €์žฅ ๋กœ์ง์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

ํ”„๋ก ํŠธ์—์„œ ๋”ฐ๋กœ ์ €์žฅ ๋กœ์ง์„ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋Š”?

  1. accessToken์„ localStorage์— ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ
    โ†’ JS ์ฝ”๋“œ๋กœ localStorage.setItem()ํ•ด์•ผ ํ•œ๋‹ค. (Zustand persist๊ฐ€ ์ด ๊ณผ์ •์„ ์ž๋™ํ™”ํ•ด ์ฃผ๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.)

  2. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฟ ํ‚ค(non-httpOnly)๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ
    โ†’ document.cookie = "key=value" ๋กœ ์ €์žฅ ๊ฐ€๋Šฅ
    (ํ•˜์ง€๋งŒ ๋ณด์•ˆ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.)

  3. ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ฃผ์ง€ ์•Š๊ณ , ํ”„๋ก ํŠธ๊ฐ€ ์ง์ ‘ ์ƒํƒœ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•  ๋•Œ
    (์˜ˆ: ๋กœ๊ทธ์ธ ๋˜์–ด ์žˆ์Œ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋‹จ์ˆœํžˆ localStorage์— ๋„ฃ๋Š” ๊ฒฝ์šฐ ๋“ฑ)


๐Ÿ’ก ๊ฒฐ๋ก :

  • refreshToken์€ ์„œ๋ฒ„๊ฐ€ httpOnly ์ฟ ํ‚ค๋กœ ๋‚ด๋ ค์ฃผ๊ณ , ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ํ”„๋ก ํŠธ๋Š” refreshToken์„ localStorage์— ์ง์ ‘ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • accessToken์€ JS ์ฝ”๋“œ(๋˜๋Š” Zustand persist ๋“ฑ)๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ/์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

Set-Cookie๊ฐ€ ์ž๋™ ์ €์žฅ๋˜๋Š” ์กฐ๊ฑด โ€‹

  1. ์„œ๋ฒ„๊ฐ€ Set-Cookie ํ—ค๋”๋กœ ์ฟ ํ‚ค๋ฅผ ๋‚ด๋ ค์ค„ ๊ฒƒ

    http
     Set-Cookie: refresh_token=abc123; HttpOnly; Secure
  2. ๋„๋ฉ”์ธ/๊ฒฝ๋กœ ๊ทœ์น™์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์„ ๊ฒƒ

    http
    Set-Cookie: refresh_token=abc; Domain=example.com; Path=/
  3. ์ถ”๊ฐ€ ์†์„ฑ๋“ค

    • Secure: HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก
    • SameSite: ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์‹œ ์ฟ ํ‚ค ์ „์†ก์„ ์–ผ๋งˆ๋‚˜ ์ œํ•œํ• ์ง€ ์ œ์–ด

์ด ์กฐ๊ฑด๋“ค์„ ๋งŒ์กฑํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ฟ ํ‚ค๋ฅผ ์ž๋™์œผ๋กœ ์ €์žฅํ•˜๊ณ ,
ํ•ด๋‹น ๋„๋ฉ”์ธ/๊ฒฝ๋กœ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์ž๋™์œผ๋กœ Cookie ํ—ค๋”์— ์‹ค์–ด์„œ ๋ณด๋‚ธ๋‹ค.


์ž์ฃผ ์“ฐ๋Š” HTTP ๋ฉ”์„œ๋“œ โ€‹

๋ฉ”์„œ๋“œ์„ค๋ช…์‚ฌ์šฉ ์˜ˆ์‹œ
GET๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ๋ณด๊ธฐ
POST๋ฐ์ดํ„ฐ ์ƒ์„ฑ์ƒˆ ๊ธ€ ์ž‘์„ฑ
PUT์ „์ฒด ์ˆ˜์ •ํ”„๋กœํ•„ ์ „์ฒด ์ˆ˜์ •
PATCH์ผ๋ถ€ ์ˆ˜์ •๋‹‰๋„ค์ž„๋งŒ ์ˆ˜์ •
DELETE๋ฐ์ดํ„ฐ ์‚ญ์ œ๊ธ€ ์‚ญ์ œ

HTTP Status Code โ€‹

์ธ์ฆ/์ธ๊ฐ€ ๊ด€๋ จํ•ด์„œ ์ž์ฃผ ๋งŒ๋‚˜๋Š” ์ƒํƒœ ์ฝ”๋“œ๋“ค:

์ฝ”๋“œ์˜๋ฏธ์ธ์ฆ ์ƒํ™ฉ์—์„œ
200์„ฑ๊ณต๋กœ๊ทธ์ธ ์„ฑ๊ณต, API ์š”์ฒญ ์„ฑ๊ณต
401UnauthorizedAccessToken ๋งŒ๋ฃŒ/์—†์Œ โ†’ ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ํ•„์š”
403Forbidden๊ถŒํ•œ ์—†์Œ โ†’ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์‹œ๋„
422Unprocessable Entity๋กœ๊ทธ์ธ ์ •๋ณด ํ‹€๋ฆผ (์ด๋ฉ”์ผ/๋น„๋ฐ€๋ฒˆํ˜ธ ์˜ค๋ฅ˜)
500Server Error์„œ๋ฒ„ ์˜ค๋ฅ˜

401 vs 403 ์ฐจ์ด์  โ€‹

  • 401: ๋ˆ„๊ตฌ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด โ†’ ์ธ์ฆ ํ•„์š”
  • 403: ๋ˆ„๊ตฐ์ง€๋Š” ์•Œ๊ฒ ๋Š”๋ฐ ๊ถŒํ•œ ์—†์–ด โ†’ ์ ‘๊ทผ ๊ธˆ์ง€


HTTPS (Hyper-Text Transfer Protocol Secure) โ€‹

HTTPS๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  โ€‹

  1. ๋‚ด๊ฐ€ ์‚ฌ์ดํŠธ์— ๋ณด๋‚ด๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ(ํ† ํฐ, ์ฟ ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ)๊ฐ€ ์•”ํ˜ธํ™”๋œ๋‹ค.

    • ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” + ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ค‘๊ฐ„์—์„œ ํŒจํ‚ท์„ ํ›”์ณ๋ณด๋”๋ผ๋„ ๋‚ด์šฉ์„ ์•Œ์•„๋ณผ ์ˆ˜ ์—†๋‹ค.
  2. ์ ‘์†ํ•œ ์„œ๋ฒ„๊ฐ€ ์ง„์งœ ์„œ๋ฒ„์ธ์ง€ ์ธ์ฆ๋œ๋‹ค. (MITM ๊ณต๊ฒฉ ๋ฐฉ์ง€)

    • CA(๊ณต์ธ ์ธ์ฆ๊ธฐ๊ด€)๊ฐ€ ๋ฐœ๊ธ‰ํ•œ ์ธ์ฆ์„œ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์˜ ์‹ ์›์„ ๊ฒ€์ฆํ•œ๋‹ค.
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•œ ๊ณณ์ด โ€œ์ง„์งœ ์šฐ๋ฆฌ ์„œ๋ฒ„์ธ์ง€โ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ€์งœ ์„œ๋ฒ„๋กœ ํ† ํฐ/์ฟ ํ‚ค๊ฐ€ ํ„ธ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

๋‘ ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ โ€‹

  1. ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”

    • ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”์— ๊ฐ™์€ ํ‚ค๋ฅผ ์‚ฌ์šฉ
    • ์†๋„๊ฐ€ ๋น ๋ฅด์ง€๋งŒ, ํ‚ค๊ฐ€ ํ„ธ๋ฆฌ๋ฉด ๋!
  2. ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” (๊ณต๊ฐœํ‚ค/๊ฐœ์ธํ‚ค)

    • ๋น„๋Œ€์นญํ‚ค๋กœ ์•ˆ์ „ํ•œ ํ†ต์‹  ์ฑ„๋„์„ ๋งŒ๋“ค๊ณ  ์ดํ›„ ๋Œ€์นญํ‚ค๋กœ ๋น ๋ฅด๊ฒŒ ์•”ํ˜ธํ™”ํ•˜๋ฉฐ ํ†ต์‹ ํ•œ๋‹ค.
      (๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™” โ†’ ๊ฐœ์ธํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™” ๊ฐ€๋Šฅ)
    • ํ‚ค ๊ตํ™˜/์ธ์ฆ์— ๊ฐ•ํ•˜๋‹ค.

์‹ค์ œ HTTPS์—์„œ๋Š” ์ฒ˜์Œ ์—ฐ๊ฒฐํ•  ๋•Œ TLS Handshake ๊ณผ์ •์—์„œ ๋น„๋Œ€์นญํ‚ค(๊ณต๊ฐœํ‚ค/๊ฐœ์ธํ‚ค)๋ฅผ ์‚ฌ์šฉํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ์„ธ์…˜ ํ‚ค(๋Œ€์นญํ‚ค)๋ฅผ ๊ตํ™˜ํ•˜๊ณ , ์ดํ›„ ๋ชจ๋“  ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ์ด ๋Œ€์นญํ‚ค๋กœ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์•”ํ˜ธํ™”ํ•ด์„œ ํ†ต์‹ ํ•œ๋‹ค.


์ •๋ฆฌ โ€‹

๐Ÿ’ก

  • HTTP๋Š” ์š”์ฒญ์ด ์žˆ์–ด์•ผ ์‘๋‹ตํ•˜๋Š” stateless ๋ชจ๋ธ์ด๋‹ค.
  • ์ธ์ฆ ์ •๋ณด(ํ† ํฐ)๋Š” ๋งค ์š”์ฒญ๋งˆ๋‹ค ํฌํ•จํ•ด์„œ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค.
  • refreshToken์€ ๋ณดํ†ต httpOnly ์ฟ ํ‚ค๋กœ ๊ด€๋ฆฌ๋˜๊ณ ,
    accessToken์€ ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ์Šคํ† ๋ฆฌ์ง€(localStorage ๋“ฑ)์— ์ €์žฅํ•ด Authorization ํ—ค๋”๋กœ ๋ณด๋‚ธ๋‹ค.
  • Set-Cookie๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™ ์ €์žฅ + ์ž๋™ ์ „์†กํ•˜๋ฉฐ,
    ๋„๋ฉ”์ธ/๊ฒฝ๋กœ/๋ณด์•ˆ ์†์„ฑ(Secure, SameSite ๋“ฑ)์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง„๋‹ค.
  • HTTP/1.1์˜ ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด HTTP/2, SSE/ WebSocket ๊ฐ™์€ ๊ธฐ์ˆ ๋“ค์ด ๋“ฑ์žฅํ–ˆ๋‹ค.
  • HTTPS๋Š” ์•”ํ˜ธํ™” + ์„œ๋ฒ„ ์ธ์ฆ์„ ์ œ๊ณตํ•ด ํ† ํฐ/์ฟ ํ‚ค/๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ง€์ผœ์ค€๋‹ค.

์ด์ œ HTTP๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ–ˆ์œผ๋‹ˆ,
์ธ์ฆ์— ํ•„์š”ํ•œ ์ฟ ํ‚ค, ์Šคํ† ๋ฆฌ์ง€, ์„ธ์…˜์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž!