HTTP?

HTTP(HyperText Transfer Protocol)λŠ” μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ‘œ 데이터λ₯Ό μ£Όκ³ λ°›κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” ν†΅μ‹ κ·œμ•½μ΄λ‹€. μ‰½κ²Œλ§ν•΄ μ›Ήμ—μ„œ 데이터λ₯Ό μ£Όκ³  λ°›λŠ” κ·œμΉ™μ΄λ‹€.

HTML, TEXT, IMAGE, μŒμ„±, μ˜μƒ 파일, JSON, XMLλ“± 거의 λͺ¨λ“  ν˜•νƒœμ˜ 데이터가 전솑가λŠ₯ν•˜λ‹€.

κ·Έλ ‡λ‹€λ©΄ μ™œ 이름이 β€œHyperTextβ€μΌκΉŒ?

처음 HTTPκ°€ λ§Œλ“€μ–΄μ‘Œμ„ λ•ŒλŠ” μ›Ή νŽ˜μ΄μ§€(HTML λ¬Έμ„œ)λ₯Ό μ£Όκ³ λ°›λŠ” 것이 λͺ©μ μ΄μ—ˆλ‹€.
κ·Έλž˜μ„œ β€œν•˜μ΄νΌν…μŠ€νŠΈ 전솑 κ·œμ•½β€μ΄λΌλŠ” 이름이 λΆ™μ—ˆλ‹€.

ν•˜μ§€λ§Œ μ§€κΈˆμ˜ HTTPλŠ” λ‹¨μˆœνžˆ HTML만 λ³΄λ‚΄λŠ” 것이 μ•„λ‹ˆλ‹€.
μ›Ή νŽ˜μ΄μ§€λ„ 보내고, 이미지도 보내고, 둜그인 κ²°κ³Ό(JSON)도 λ³΄λ‚΄λŠ” λ“± ν˜„λŒ€μ˜ HTTPλŠ” μ›Ή μœ„μ—μ„œ μ˜€κ°€λŠ” 거의 λͺ¨λ“  λ°μ΄ν„°μ˜ 운반 κ·œμΉ™μ΄λΌκ³  보면 λœλ‹€.

그럼 어김없이 λ‚˜μ˜€λŠ” 질문..μ™œ ν•„μš”ν• κΉŒ??

μš°λ¦¬κ°€ λΈŒλΌμš°μ €μ— https://google.com μž…λ ₯ν•œλ‹€ ν•΄λ³΄μž
κ·Έ μˆœκ°„ λΈŒλΌμš°μ €λŠ” μ„œλ²„μ—κ²Œ β€œgoogle.com νŽ˜μ΄μ§€ μ’€ μ£Όμ„Έμš”β€λΌκ³  μš”μ²­ν•œλ‹€. 그리고 μ„œλ²„λŠ” HTML λ¬Έμ„œλ₯Ό 보내쀀닀.
μ΄λ•Œ μ‚¬μš©ν•˜λŠ” 약속이 HTTPλ‹€.


HTTP λ™μž‘ 방식

기본적으둜 μš”μ²­(Request)κ³Ό 응닡(Response)의 ꡬ쑰이닀.
예λ₯Όλ“€μ–΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­μ„ ν•˜κ³  μ„œλ²„μ—μ„œ 응닡이 올 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦°λ‹€. 그리고 μ„œλ²„λŠ” μš”μ²­μ— λŒ€ν•œ κ²°κ³Όλ₯Ό λ§Œλ“€μ–΄ μ‘λ‹΅ν•œλ‹€.

  • μš”μ²­
    • λΈŒλΌμš°μ €κ°€ μ„œλ²„μ—κ²Œ 보낸닀
    • GET /users/1 HTTP/1.1
      • GET β†’ 쑰회
      • /users/1 β†’ 이 μ£Όμ†Œ μš”μ²­
      • HTTP/1.1 β†’ HTTP 버전
  • 응닡
    • HTTP/1.1 200 OK
    • Content-Type: application/json
    • { β€œid”: 1, β€œname”: β€œSeungje” }
      • 200 OK β†’ 성곡
      • JSON 데이터 전달 (아이디와 이름)



HTTP의 버전 (역사)

image


HTTP/0.9

  • GET λ©”μ„œλ“œλ§Œ 지원
  • HTTP 헀더 x

HTTP/1.0

  • λ©”μ„œλ“œ, 헀더, μƒνƒœμ½”λ“œ μΆ”κ°€
  • μƒνƒœμ½”λ“œμ™€ content-type이 생겨 html 파일 외에 λ‹€λ₯Έ νƒ€μž… νŒŒμΌλ„ 전솑
  • μš”μ²­λ§ˆλ‹€ 컀λ„₯μ…˜ 수립(맀번 μƒˆλ‘œμš΄ μ—°κ²°) -> 느림
  • 컀λ„₯μ…˜ ν•˜λ‚˜λ‹Ή μš”μ²­ ν•˜λ‚˜μ™€ 응닡 ν•˜λ‚˜λ§Œ μ²˜λ¦¬ν•¨

HTTP/1.1

  • ν˜„μž¬ κ°€μž₯ 많이 μ‚¬μš©
  • ν•œλ²ˆμ— μ—¬λŸ¬ μš”μ²­ κ°€λŠ₯
  • νŒŒμ΄ν”„λΌμ΄λ‹(Pipelining) 지원 : ν•˜λ‚˜μ˜ 컀λ„₯μ…˜μ—μ„œ 응닡을 기닀리지 μ•Šκ³  순차적인 μ—¬λŸ¬ μš”μ²­μ„ μ—°μ†μ μœΌλ‘œ 보내 κ·Έ μˆœμ„œμ— 맞좰 응닡을 λ°›λŠ” λ°©μ‹μœΌλ‘œ μ§€μ—° μ‹œκ°„μ„ μ€„μ΄λŠ” 방식 -> HOL Blocking 문제
    • Head Of Line Blocking : μš°μ„  μˆœμœ„λ‘œ λ“€μ–΄μ˜¨ μš”μ²­μ˜ 응닡 μ‹œκ°„μ΄ κΈΈμ–΄μ§€λ©΄ ν›„ μˆœμœ„μ— μžˆλŠ” μš”μ²­μ˜ μ‘λ‹΅μ‹œκ°„λ„ κΈΈμ–΄μ§€λŠ” 단점

HTTP/2.0

  • HTTP/1.1 μ„±λŠ₯ κ°œμ„  및 ν™•μž₯
  • λ°”μ΄λ„ˆλ¦¬ ν”„λ ˆμ΄λ° 계측 μ‚¬μš©μ˜ λ©”μ„Έμ§€ 전솑 방식 λ³€ν™”
    • 1.0의 text ν˜•μ‹ μ „λ‹¬μ—μ„œ μš”μ²­, 응닡 λ©”μ‹œμ§€λŠ” ν”„λ ˆμž„ λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄μ§€λŠ” 것
  • 였λ₯˜ λ°œμƒ κ°€λŠ₯μ„± μ €ν•˜
  • νŒŒμ‹±, 전솑속도 증가
  • HOL Blocking 문제 ν•΄κ²° -> λ©€ν‹°ν”Œλ ‰μ‹±(Multiplexed Streams)
    • image
    • ν•˜λ‚˜μ˜ μ—°κ²°μ—μ„œ μ—¬λŸ¬ μš”μ²­κ³Ό 응닡을 λ™μ‹œμ— μ£Όκ³ λ°›λŠ” 기술
  • Header 쀑볡 문제 ν•΄κ²° (HPACK μ••μΆ•)

HTTP/3.0

  • TCP λŒ€μ‹  UDPλ₯Ό μ΄μš©ν•œ QUIC ν”„λ‘œν† μ½œ μ‚¬μš©
    • μ§€κΈˆκΉŒμ§€λŠ” TCP 방식을 μ‚¬μš©ν–ˆμ§€λ§Œ(TCP에 λŒ€ν•΄μ„œλŠ” μΆ”ν›„ μžμ„Ένžˆ μ„€λͺ… μ˜ˆμ •), 3.0λΆ€ν„°λŠ” UDP QUIC(UDP μœ„μ— TCP κΈ°λŠ₯을 μ†Œν”„νŠΈμ›¨μ–΄λ‘œ κ΅¬ν˜„ν•œ ν”„λ‘œν† μ½œ) μ‚¬μš©


μ΄λ ‡κ²Œ 보면 3.0이 제일 μ’‹μ€κ±°λ‹ˆκΉŒ λ‹€ 3.0만 μ‚¬μš©ν•˜λ©΄ λ˜λŠ”κ±° μ•„λ‹ˆλƒ?라 생각할 수 μžˆλ‹€.
λ‚˜λ„ κ·Έλ ‡κ²Œ μƒκ°ν–ˆλŠ”λ° μ•„λ‹ˆλ‹€..μ‰½κ²Œ μ„€λͺ…ν•΄μ£Όλ§ˆ

HTTP/1.1 = μˆ˜λ™ κΈ°μ–΄, μ˜€λž˜λμ§€λ§Œ μ–΄λ””μ„œλ‚˜ κ°€λŠ₯
HTTP/2 = μžλ™ 변속기, 효율 쒋아짐
HTTP/3 = μ΅œμ‹  μ „κΈ°μ°¨, λΉ λ₯΄κ³  효율적

μ „κΈ°μ°¨κ°€ λ‚˜μ™”λ‹€κ³  μ§€κΈˆ μš°λ¦¬κ°€ λͺ¨λ‘ μ „κΈ°μ°¨λ₯Ό 타지 μ•ŠλŠ”κ²ƒ 처럼 λ˜‘κ°™λ‹€ 이것도.



HTTP νŠΉμ§•

λ¬΄μƒνƒœμ„± (Stateless)

μ•žμ„  API κ΄€λ ¨ κΈ€μ—μ„œ μžμ„Ένžˆ μ„€λͺ…ν–ˆμœΌλ‹ˆ κ°„λ‹¨ν•˜κ²Œλ§Œ μ„€λͺ…ν•œλ‹€.
μ„œλ²„κ°€ 이전 μš”μ²­μ„ κΈ°μ–΅ν•˜μ§€ μ•ŠλŠ” 것이닀. μ„œλ²„κ°€ μ΄μ „μ˜ λͺ¨λ“  μš”μ²­μ„ κΈ°μ–΅ν•˜κ²Œ 되면 λ©”λͺ¨λ¦¬ 많이 μ‚¬μš©ν•˜κ³  μ„œλ²„ λΆ€ν•˜λ„ μ¦κ°€ν•˜λŠ” λ“± 단점이 λ§Žμž–μ•„? κ·Έλž˜μ„œ κ·Έλƒ₯ κΈ°μ–΅ μ•ˆν•˜λŠ” κ±°λ‹€.

λΉ„μ—°κ²°μ„± (Connectionless)

μš”μ²­κ³Ό 응닡이 λλ‚˜λ©΄ 연결을 λŠλŠ” 것이닀. 즉 μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ Connection을 μ§€μ†ν•˜μ§€ μ•ŠλŠ” 것이닀. 연결을 μœ μ§€ν•˜λ©΄ μžμ›μ΄ κ³„μ†ν•΄μ„œ μ‚¬μš©λ˜μ§€λ§Œ, μœ μ§€ν•˜μ§€ μ•ŠμœΌλ©΄ μ„œλ²„μ˜ μžμ›μ„ λ”μš± 효율적으둜 μ‚¬μš©ν•  수 있게 되기 λ•Œλ¬Έμ΄λ‹€.
HTTP/1.0 μ‹œμ ˆμ—λŠ” λ§€ μš”μ²­λ§ˆλ‹€ μƒˆλ‘œ 연결을 ν•˜μ—¬ λŠλ Έμ§€λ§Œ, 1.1λΆ€ν„°λŠ” Keep-Alive κΈ°λŠ₯이라고 연결을 μž μ‹œ μœ μ§€ν•΄μ„œ μ—¬λŸ¬ μš”μ²­μ„ 보낼 수 μžˆλŠ” κΈ°λŠ₯이 생겼닀.

연결을 λŠλŠ” λ‹€λ©΄μ„œ μ™œ μœ μ§€ν•˜μ§€? λΌλŠ” 의문이 생길 수 μžˆλ‹€.
μ°¨κ·Όμ°¨κ·Ό μ•Œμ•„λ³΄μž.

μ›Ή νŽ˜μ΄μ§€ ν•˜λ‚˜λ₯Ό μš”μ²­ν•œλ‹€κ³  μƒκ°ν•΄λ³΄μž. νŽ˜μ΄μ§€μ—λŠ” HTML, CSS, JS, 이미지 10개
μ΄λ ‡κ²Œ μ—¬λŸ¬ μžμ›μ΄ μžˆλ‹€. 그런데 HTTP/1.0은 μžμ› ν•˜λ‚˜λ§ˆλ‹€ μ—°κ²° β†’ 응닡 β†’ μ’…λ£Œλ₯Ό λ°˜λ³΅ν–ˆλ‹€.
λ¬Έμ œλŠ” μ—¬κΈ°μ„œ 생긴닀. μƒˆ 연결을 맺을 λ•Œλ§ˆλ‹€ TCP Handshakeκ°€ λ°œμƒν•œλ‹€λŠ” 것이닀.
μ—¬κΈ°μ„œ 연결은 λ‹¨μˆœν•œ 연결이 μ•„λ‹ˆλ‹€. SYN -> SYN-ACK -> ACK 이런 과정을 κ±°μΉ˜λŠ”λ° μžμ›μ΄ 20개면? 20λ²ˆμ„ ν•˜λŠ”κ±°λ‹€..이게 λŒ€λž΅ 1초 정도 지연이 생기기도 ν•˜λŠ” 것이닀.

κ·Έλž˜μ„œ λ“±μž₯ν•œ 것이 λ°”λ‘œ Keep-Aliveλ‹€.
ν•œ 번 TCP μ—°κ²° λ§Ίκ³  HTML μš”μ²­, CSS μš”μ²­, JS μš”μ²­, 이미지 μš”μ²­, λ‹€ λλ‚˜λ©΄ μ’…λ£Œ
이걸 지속 연결이라고 ν•˜λŠ” 것이닀.

그럼 κ·Έλƒ₯ 계속 μ—°κ²°ν•˜λ©΄ λ˜μž–μ•„? ➑ μ•„κΉŒ λ§ν–ˆλ“―μ΄ μ„œλ²„ μžμ› 문제라 μ–΄μ©”μˆ˜ μ—†λ‹€ 이건



HTTP μƒνƒœ μ½”λ“œ

  • 200 : OK
  • 201 : Created
  • 400 : Bad Request
  • 401 : Unauthoized
  • 404 : Not Found
  • 500 : Internal Server Error


많이 μ‚¬μš©ν•˜λŠ” μƒνƒœμ½”λ“œμ—λŠ” μœ„μ™€ 같은 μ’…λ₯˜κ°€ μžˆλŠ”λ° 쒀더 μ„€λͺ…ν•΄λ³΄μžλ©΄ μ•„λž˜μ™€ κ°™λ‹€.

1xx(정보) :Β μš”μ²­μ„ λ°›μ•˜μœΌλ©° ν”„λ‘œμ„ΈμŠ€λ₯Ό 계속 μ§„ν–‰
2xx(성곡) :Β μš”μ²­μ„ μ„±κ³΅μ μœΌλ‘œ λ°›μ•˜μœΌλ©° μΈμ‹ν–ˆκ³  수용
3xx(λ¦¬λ‹€μ΄λ ‰μ…˜) :Β μš”μ²­ μ™„λ£Œλ₯Ό μœ„ν•΄ μΆ”κ°€ μž‘μ—… μ‘°μΉ˜κ°€ ν•„μš”
4xx(ν΄λΌμ΄μ–ΈνŠΈ 였λ₯˜) :Β μš”μ²­μ˜ 문법이 잘λͺ»λ˜μ—ˆκ±°λ‚˜ μš”μ²­μ„ μ²˜λ¦¬ν•  수 μ—†μŒ
5xx(μ„œλ²„ 였λ₯˜) :Β μ„œλ²„κ°€ λͺ…λ°±νžˆ μœ νš¨ν•œ μš”μ²­μ— λŒ€ν•œ 좩쑱을 μ‹€νŒ¨


HTTP λ©”μ„Έμ§€

μœ„μ— μ„€λͺ… ν–ˆλ˜ λ™μž‘ 방식과 λΉ„μŠ·ν•œ 이야기이닀.
HTTPλŠ” 우리처럼 말둜 λŒ€ν™”λ₯Ό μ£Όκ³  λ°›λŠ”κ²Œ μ•„λ‹ˆλΌ μ •ν•΄μ§„ ꡬ쑰의 λ©”μ„Έμ§€λ₯Ό μ£Όκ³ λ°›λŠ”λ‹€.
λ©”μ„Έμ§€μ˜ μ’…λ₯˜λŠ” 2μ’…λ₯˜κ°€ μ‘΄μž¬ν•œλ‹€. μš”μ²­(Request)메세지와 응닡(Response)λ©”μ„Έμ§€

μš”μ²­ λ©”μ‹œμ§€

λΈŒλΌμš°μ €κ°€ μ„œλ²„μ—κ²Œ λ³΄λ‚΄λŠ” λ©”μ„Έμ§€λ‹€.

  • μ‹œμž‘μ€„ (Start Line)
    • GET /users/1 HTTP/1.1
      • HTTP/1.1둜 1번 μ‚¬μš©μž 정보 μš”μ²­
  • 헀더 (Header)
    • Host: example.com
    • Content-Type: application/json
      • μΆ”κ°€ 정보에 λŒ€ν•œ λ‚΄μš©μ΄λ‹€
      • Host β†’ μ–΄λŠ μ„œλ²„?
      • Content-Type β†’ 데이터 ν˜•μ‹
      • Authorization β†’ 인증 정보
      • Cookie β†’ 둜그인 정보
  • λ°”λ”” (Body)
    • { β€œname”: β€œSeungje”, β€œage”: 28 }
    • μ„œλ²„μ— 전달할 μ‹€μ œ λ‚΄μš©μ΄λ‹€
  • 전체 ꡬ쑰
      GET /users/1 HTTP/1.1
      Host: example.com
      Content-Type: application/json
    
      {
          "name": "Seungje",
          "age": 28
      }
    
    


응닡 λ©”μ„Έμ§€

μ„œλ²„κ°€ λŒλ €μ£ΌλŠ” λ©”μ„Έμ§€λ‹€.

  • μ‹œμž‘μ€„ (Start Line)
    • HTTP/1.1 200 OK
      • HTTP/1.1 β†’ 버전
      • 200 β†’ μƒνƒœ μ½”λ“œ
      • OK β†’ μ„€λͺ…
      • β€œμ •μƒ 처리 μ™„λ£Œβ€λΌλŠ” 의미
  • 헀더 (Header)
    • Content-Type: application/json
    • 응닡에 λŒ€ν•œ μΆ”κ°€ 정보이닀.
  • λ°”λ”” (Body)
    • μ‹€μ œ 데이터 (JSON, HTML, IMAGE 등이 ν¬ν•¨λ˜μ–΄μžˆλ‹€)


μ‰½κ²Œ μ„€λͺ…ν•˜λ©΄ HTTP λ©”μ„Έμ§€λŠ” νŽΈμ§€ ν˜•μ‹μ΄λΌ μƒκ°ν•˜λ©΄ λœλ‹€.

μ‹œμž‘μ€„ β†’ νŽΈμ§€ 제λͺ©
헀더 β†’ λ³΄λ‚΄λŠ” μ‚¬λžŒ, λ°›λŠ” μ‚¬λžŒ 정보
λ°”λ”” β†’ μ§„μ§œ λ‚΄μš©


HTTP λ©”μ„œλ“œ

많이 듀어봀을 λ‚΄μš©μ΄λ‹€.
HTTP λ©”μ„œλ“œμ˜ μ’…λ₯˜λŠ” 9κ°€μ§€κ°€ μžˆλŠ”λ°, ν•˜λ‚˜μ”© 보자면

1️⃣ GET : 쑰회
2️⃣ POST : μš”μ²­ (주둜 데이터 등둝에 μ‚¬μš©)
3️⃣ PUT : λ¦¬μ†ŒμŠ€λ₯Ό λŒ€μ²΄, ν•΄λ‹Ή λ¦¬μ†ŒμŠ€κ°€ μ—†μœΌλ©΄ 생성 (λ¦¬μ†ŒμŠ€ 전체 μˆ˜μ •)
4️⃣ PATCH : λ¦¬μ†ŒμŠ€ 일뢀 μˆ˜μ •
5️⃣ DELETE : λ¦¬μ†ŒμŠ€ μ‚­μ œ
6️⃣ HEAD : GETκ³Ό λ™μΌν•˜μ§€λ§Œ λ©”μ‹œμ§€ 뢀뢄을 μ œμ™Έν•˜κ³ , μƒνƒœ 쀄과 ν—€λ”λ§Œ λ°˜ν™˜
7️⃣ OPTIONS : λŒ€μƒ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 톡신 κ°€λŠ₯ μ˜΅μ…˜μ„ μ„€λͺ…(주둜 CORSμ—μ„œ μ‚¬μš©)
8️⃣ CONNECT : λŒ€μƒ μžμ›μœΌλ‘œ μ‹λ³„λ˜λŠ” μ„œλ²„μ— λŒ€ν•œ 터널을 μ„€μ •
9️⃣TRACE : λŒ€μƒ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 경둜λ₯Ό 따라 λ©”μ‹œμ§€ 루프백 ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰

주둜 μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œλŠ” 1번 ~ 5λ²ˆμ΄λ‹€. λ‚˜λ¨Έμ§€ λ‚΄μš©μ€ 처음 λ΄€μ„λ•Œ λ‹Ήν™©ν•˜λ©΄ μ—†μ–΄λ³΄μ΄λ‹ˆ ν•œλ²ˆ μ”© λ³΄λŠ” μ •λ„λ‘œ λ§Œμ‘±ν•΄λ³΄μž




참고자료

https://okky.kr/questions/1164521

https://inpa.tistory.com/entry/HTTP-%F0%9F%8C%90-%EB%B0%B1%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5-HTTP%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C%EC%9A%94#http_%EB%A9%94%EC%84%B8%EC%A7%80

https://velog.io/@sweet_sumin/HTTP-%EB%B2%84%EC%A0%84%EB%B3%84-%EC%B0%A8%EC%9D%B4-1.0-1.1-2.0-3

https://bruders.tistory.com/143

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: