HTTP λ©”μ‹œμ§€λž€?

HTTP λ©”μ‹œμ§€λŠ” μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ 간에 데이터가 κ΅ν™˜λ˜λŠ” 방식이닀. κ°œμš”μ—μ„œ μ„€λͺ…ν–ˆλ˜ κ²ƒμ²˜λŸΌ, λ©”μ‹œμ§€ νƒ€μž…μ€ μš”μ²­(Request), 응닡(Response)이 μžˆλ‹€.

HTTP λ©”μ‹œμ§€λŠ” ASCII둜 μΈμ½”λ”©λœ μ—¬λŸ¬ μ€„μ˜ ν…μŠ€νŠΈ 정보이닀. HTTP/1.1λ•ŒλŠ” 읽을 수 μžˆμ—ˆμ§€λ§Œ HTTP/2λΆ€ν„°λŠ” 읽을 수 μ—†μœΌλ©° HTTP ν”„λ ˆμž„μœΌλ‘œ λ‚˜λˆ„μ–΄μ§„λ‹€.

HTTP/2의 이진 ν”„λ ˆμ΄λ° λ©”μ»€λ‹ˆμ¦˜μ„ 톡해 μ‚¬μš©μžκ°€ APIλ‚˜ μ„€μ • 파일 등을 λ³€κ²½ν•  ν•„μš”κ°€ μ—†κ²Œ μ„€κ³„λ˜μ–΄ 보고 μ΄ν•΄ν•˜κΈ°κ°€ 쉽닀.

μš”μ²­κ³Ό μ‘λ‹΅μ˜ κ΅¬μ‘°λŠ” μ•„λž˜μ™€ κ°™λ‹€

  1. μ‹œμž‘μ€„μ— μ‹€ν–‰λ˜μ–΄μ•Ό ν•  μš”μ²­/응닡(성곡 or μ‹€νŒ¨) 기둝
  2. HTTP 헀더(option) β†’ μš”μ²­, λ©”μ‹œμ§€ λ³Έλ¬Έ 등에 λŒ€ν•œ μ„€λͺ…
  3. μš”μ²­μ— λŒ€ν•œ λͺ¨λ“  메타 정보가 μ „μ†‘λ˜μ—ˆμŒμ„ μ•Œλ¦¬λŠ” 빈 쀄
  4. μš”μ²­μ— κ΄€λ ¨λœ λ‚΄μš© 응닡 κ΄€λ ¨ λ¬Έμ„œ λ“±(option. 본문의 쑴재 유무 및 ν¬κΈ°λŠ” 첫 쀄과 HTTP 헀더에 λͺ…μ‹œ)
  5. HTTP λ©”μ‹œμ§€μ˜ νŽ˜μ΄λ‘œλ“œλ‘œ μ˜€λŠ” λ³Έλ¬Έ

μš”μ²­ ν—€λ“œ(head): HTTP λ©”μ‹œμ§€μ˜ μ‹œμž‘ 쀄 + HTTP 헀더 λ³Έλ¬Έ(body): HTTP λ©”μ‹œμ§€μ˜ νŽ˜μ΄λ‘œλ“œ(Payload)

μ—¬κΈ°μ„œ μš”μ²­κ³Ό μ‘λ‹΅μ˜ ꡬ쑰에 λŒ€ν•΄μ„œ 쑰금 더 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄μž

HTTP μš”μ²­

μ‹œμž‘ 쀄

  1. HTTP λ©”μ„œλ“œ(GET, PUT, POST, HEAD, OPTIONS λ“±)λ₯Ό 톡해 μ„œλ²„κ°€ μˆ˜ν–‰ν•΄μ•Ό ν•  λ™μž‘μ„ λ‚˜νƒ€λƒ„
  2. μš”μ²­ νƒ€κ²Ÿ β†’ URL/ 포트, 도메인, ν”„λ‘œν† μ½œμ˜ μ ˆλŒ€ 경둜 λ“±
    • νƒ€κ²Ÿμ˜ 포맷은 HTTP λ©”μ„œλ“œμ— 따라 달라짐
      • 일반적인 포맷
        • Origin ν˜•μ‹μœΌλ‘œ μ•Œλ €μ§„ μ ˆλŒ€κ²½λ‘œ
          • ex) HEAD /test.html?query=minsu
        • absolute ν˜•μ‹μœΌλ‘œ μ•Œλ €μ§„ μ™„μ „ν•œ URL
        • authority ν˜•μ‹μœΌλ‘œ μ•Œλ €μ§„ 도메인 이름 & μ˜΅μ…˜ 포트(URL의 인증 μ»΄ν¬λ„ŒνŠΈλ‘œ HTTP 터널을 κ΅¬μΆ•ν•˜λŠ” κ²½μš°μ—λ§Œ CONNECT와 ν•¨κ»˜ μ‚¬μš©κ°€λŠ₯)
          • ex) CONNECT developer.mozilla.org:80 HTTP/1.1
        • asterisk ν˜•μ‹μœΌλ‘œ μ•Œλ €μ§„ λͺ¨λ“  μ„œλ²„ λ‚˜νƒ€λ‚΄λŠ” 포맷
          • ex) OPTIONS * HTTP/1.1
  3. HTTP 버전

헀더

λ¬Έμžμ—΄ λ‹€μŒμ— 콜둠(:)이 λΆ™κ³  뒀에 μ˜€λŠ” 값은 헀더 따라 달라짐.

μš”μ²­ ν—€λ”μ˜ μ’…λ₯˜

Via(λ©”μ‹œμ§€ 전달좔적, μš”μ²­λ£¨ν”„ λ°©μ§€, λ°œμ‹ μžμ˜ ν”„λ‘œν† μ½œ κΈ°λŠ₯ 식별) λ“±μ˜ General Header β†’ λ©”μ‹œμ§€ 전체 적용

Request Header β†’ μš”μ²­ ꡬ체화, μ»¨ν…μŠ€νŠΈ 제곡, μ œμ•½ μ„€μ •, μš”μ²­ λ‚΄μš© μˆ˜μ • λ“±

Representation Header β†’ λ©”μ‹œμ§€ λ°μ΄ν„°μ˜ μ›λž˜ ν˜•μ‹κ³Ό 적용된 인코딩 μ„€λͺ…

λ³Έλ¬Έ

μš”μ²­μ˜ λ§ˆμ§€λ§‰ λΆ€λΆ„. GET, HEAD, DELETE, OPTIONS처럼 λ¦¬μ†ŒμŠ€λ₯Ό κ°€μ Έμ˜€λŠ” μš”μ²­μ€ 본문이 ν•„μš”μ—†λ‹€

본문은 두 κ°€μ§€ μ’…λ₯˜λ‘œ λ‚˜λ‰œλ‹€

헀더 두 개(Content-Type, Content-Length)둜 μ •μ˜λœ 단일 νŽ˜μ΄μ§€λ‘œ κ΅¬μ„±λ˜λŠ” 단일-λ¦¬μ†ŒμŠ€ λ³Έλ¬Έ

닀쀑 λ¦¬μ†ŒμŠ€ λ³Έλ¬Έ β†’ Web Form(μœ μ €μ™€μ˜ μƒν˜Έμž‘μš©)κ³Ό κ΄€λ ¨.

HTTP 응닡

μƒνƒœ 쀄

HTTP μ‘λ‹΅μ˜ μ‹œμž‘ 쀄.

  1. 보톡 HTTP/1.1인 ν”„λ‘œν† μ½œ 버전
  2. μš”μ²­μ˜ 성곡 μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μƒνƒœμ½”λ“œ
  3. HTTP λ©”μ‹œμ§€λ₯Ό 이해할 λ•Œ λ„μ›€λ˜λŠ” μƒνƒœ ν…μŠ€νŠΈ

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

μƒνƒœ μ½”λ“œλŠ” 5개의 λΈ”λ‘μœΌλ‘œ λ‚˜λ‰œλ‹€.

  1. 1XX Informational
  2. 2XX 성곡
  3. 3XX λ¦¬λ””λ ‰μ…˜
  4. 4XX ν΄λΌμ΄μ–ΈνŠΈ 였λ₯˜
  5. 5XX Server Error

XXλŠ” 0~99의 숫자λ₯Ό λ‚˜νƒ€λ‚΄λ©° λŒ€λΆ€λΆ„ λŒ€ν‘œμ μΈ μˆ«μžκ°€ μžˆλ‹€. ex) 200, 404, 500 λ“±

헀더

λ‹€λ₯Έ 헀더와 λ™μΌν•œ ꡬ쑰λ₯Ό κ°€μ§„λ‹€ λ¬Έμžμ—΄ λ‹€μŒ 콜둠(:), κ·Έ λ’€μ˜ 값은 헀더 따라 λ‹€λ₯΄λ‹€.

헀더 μ’…λ₯˜

Via(λ©”μ‹œμ§€ 전달좔적, μš”μ²­λ£¨ν”„ λ°©μ§€, λ°œμ‹ μžμ˜ ν”„λ‘œν† μ½œ κΈ°λŠ₯ 식별) λ“±μ˜ General Header β†’ λ©”μ‹œμ§€ 전체 적용

Response Header β†’ μ„œλ²„μ— λŒ€ν•œ μΆ”κ°€ 정보 제곡. Varyλ‚˜ Vary : μš”μ²­ λ©”μ‹œμ§€μ˜ λ©”μ„œλ“œ 및 URL을 μ œμ™Έν•˜κ³  응닡 λ‚΄μš©μ— 영ν–₯을 μ€€ λΆ€λΆ„ μ„€λͺ…. μ½˜ν…μΈ  ν˜‘μƒ(λ™μΌν•œ URLμ—μ„œ λ¦¬μ†ŒμŠ€μ˜ μ„œλ‘œ λ‹€λ₯Έ 버전을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜. 제일 잘 λ§žλŠ” μ–Έμ–΄, 인코딩 등을 λͺ…μ‹œ)

Representation Header β†’ λ©”μ‹œμ§€ λ°μ΄ν„°μ˜ μ›λž˜ ν˜•μ‹κ³Ό 적용된 인코딩 μ„€λͺ…

λ³Έλ¬Έ

μ‘λ‹΅μ˜ λ§ˆμ§€λ§‰ λΆ€λΆ„ 본문이 없을 μˆ˜λ„ μžˆλ‹€(201 Created, 204 No content λ“±)

본문의 μ’…λ₯˜

Content-Type와 Content-LengthλΌλŠ” 두 개의 ν—€λ”λ‘œ μ •μ˜ν•˜λŠ” 길이가 μ•Œλ €μ§„ ν•˜λ‚˜μ˜ 파일둜 κ΅¬μ„±λœ 단일-λ¦¬μ†ŒμŠ€ λ³Έλ¬Έ(Single-resource bodies).

Transfer-Encodingκ°€Β chunked둜 μ„€μ •λœ 청크둜 λ‚˜λ‰˜μ–΄ μΈμ½”λ”©λ˜λŠ” 길이λ₯Ό λͺ¨λ₯΄λŠ” ν•˜λ‚˜μ˜ 파일둜 κ΅¬μ„±λœ 단일-λ¦¬μ†ŒμŠ€ λ³Έλ¬Έ Transfer-Encoding : μ‚¬μš©μžμ—κ²Œ entityλ₯Ό μ•ˆμ „ν•˜κ²Œ μ „μ†‘ν•˜κΈ° μœ„ν•΄ 인코딩 ν˜•μ‹μ„ μ§€μ •ν•œ 헀더

μ„œλ‘œ λ‹€λ₯Έ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” λ©€ν‹°νŒŒνŠΈ 본문으둜 이루어진 닀쀑 λ¦¬μ†ŒμŠ€ λ³Έλ¬Έ(option)

HTTP/2 ν”„λ ˆμž„

HTTP/1.X 버전은 μ„±λŠ₯ 결함이 μžˆμ–΄ ν˜„μž¬λŠ” λŒ€λΆ€λΆ„ 2 이상을 μ“΄λ‹€ λ”°λΌμ„œ 2λŠ” 이 λ¬Έμ œλ“€μ„ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ λ³΄μ™„ν–ˆλ‹€κ³  λ³Ό 수 μžˆλ‹€.

  • 본문은 압좕이 λ˜μ§€λ§Œ, ν—€λ”λŠ” 압좕이 λ˜μ§€ μ•ŠλŠ” HTTP/1.X
  • μ—°μ†λœ λ©”μ‹œμ§€λ“€μ€ λΉ„μŠ·ν•œ 헀더 ꡬ쑰λ₯Ό κ°€μ§€μ§€λ§Œ λ©”μ‹œμ§€λ§ˆλ‹€ λ°˜λ³΅λ˜μ–΄ 전솑됨
  • 닀쀑전솑(multiplexing)이 λΆˆκ°€λŠ₯

μ΄λŸ¬ν•œ λ¬Έμ œλ“€μ„ λ³΄μ™„ν•œ HTTP/2의 ν”„λ ˆμž„μ€ λ‹€μŒκ³Ό κ°™λ‹€ μ΄λ ‡κ²Œ ν”„λ ˆμž„μœΌλ‘œ λ‚˜λˆ„μ–΄ μŠ€νŠΈλ¦Όμ— λΌμ›Œλ„£μœΌλ©΄μ„œ 데이터와 헀더 ν”„λ ˆμž„μ„ λΆ„λ¦¬ν•œλ‹€. 데이터와 헀더 ν”„λ ˆμž„μ„ λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ 기쑴에 κ°€μ§„ λ¬Έμ œμ μ„ ν•΄κ²°ν•  수 μžˆλ‹€.

  • ν”„λ ˆμž„μ„ λΆ„λ¦¬ν•˜λ©΄μ„œ 헀더 ν”„λ ˆμž„λ§Œ μ„ νƒν•˜μ—¬ 압좕이 압좕이 κ°€λŠ₯ν•΄μ§„λ‹€.
  • 슀트림 μ—¬λŸ¬κ°œλ₯Ό ν•œ λ²ˆμ— λ¬ΆλŠ” λ©€ν‹°ν”Œλ ‰μ‹±μ΄ κ°€λŠ₯ν•΄μ§€λ©΄μ„œ TCP 연결이 효율적이게 λœλ‹€.