HTTP
HTTP(Hyper Text Transfer Protocol)
ν΄λΌμ΄μΈνΈμ μλ² κ°μ λ°μ΄ν°(ν
μ€νΈ, μ€λμ€, λΉλμ€, μ΄λ―Έμ§ λ±)λ₯Ό μ£Όκ³ λ°κ² ν΄μ£Όλ TCP/IP κΈ°λ°μ νλ‘ν μ½μ΄λ©°, κΈ°λ³Έ 80ν¬νΈλ₯Ό μ¬μ©νλ€.
μΉμ μλ²μ§λΌ λΆλ¦¬λ Tim Bernes-Leeμ μν΄ λ°λͺ
λμλ€. μ΄κΈ°μλ MeshλΌκ³ λΆλ ΈμΌλ©°, μ΄ν κ°λ° κ³Όμ μ€μ World Wide Web(WWW)μΌλ‘ μ΄λ¦μ λ°κΎΈμλ€.
μλ 4κ°μ λΈλ‘μΌλ‘ ꡬμ±λμ΄ μλ€.
- νμ΄νΌν μ€νΈ λ¬Έμλ₯Ό νννκΈ° μν λ§ν¬μ μΈμ΄(HTML)
- λ¬Έμλ₯Ό κ΅ννκΈ° μν κ°λ¨ν νλ‘ν μ½(HTTP)
- λ¬Έμλ₯Ό λμ€νλ μ΄ ν΄μ£Όλ ν΄λΌμ΄μΈνΈ(Web Browser)
- λ¬Έμμ μ κ·Όνλλ‘ ν΄μ£Όλ μλ²(httpd)
HTTP νΉμ§
- ν΄λΌμ΄μΈνΈ μλ² κ΅¬μ‘°
- μλ²κ° μμ²(request)μ λν κ²°κ³Όλ₯Ό λ§λ€μ΄μ μλ΅μ΄ μ€λ©΄ ν΄λΌμ΄μΈνΈκ° μλ΅(response) κ²°κ³Όλ₯Ό μ΄μ΄μ λμμ νκ²λλ€.
- 무μν(Stateless)
- μλ²κ° ν΄λΌμ΄μΈνΈμ μνλ₯Ό 보쑴νμ§ μλλ€.
- μλ² νμ₯μ±μ΄ λλ€λ μ₯μ μ΄ μκ³ , ν΄λΌμ΄μΈνΈκ° μΆκ° λ°μ΄ν°λ₯Ό μ μ‘ν΄μΌνλ λ¨μ μ΄ μλ€.
- λΉμ°κ²°μ±(Connectionless)
- ν΄λΌμ΄μΈνΈκ° μλ²μ μμ²μ 보λ΄κ³ μλ΅μ λ°κ²λλ©΄ λ°λ‘ ν΄λΌμ΄μΈνΈμ μλ²μ μ°κ²°μ λμ΄λ²λ¦°λ€.
- μ μ²λͺ μ΄ μλΉμ€λ₯Ό μ¬μ©ν΄λ μ€μ μλ²μμ λμμ μ²λ¦¬νλ μμ²μ μ μκ° μ΄νλ‘ μμΌλ―λ‘ μλ² μμμ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μλ€.
- http λ©μΈμ§
- νλ¨ μ°Έκ³
HTTP λμ κ³Όμ
- μ¬μ©μκ° μΉ λΈλΌμ°μ μ μ μνλ€.
- DNS μλ²μ μΉ μλ²μ νΈμ€νΈ μ΄λ¦μ IP μ£Όμλ‘ λ³κ²½νλ€.
- μΉ μλ²μ TCP μ°κ²°μ μλνλ€.(3-way handshake: ν΄λΌμ΄μΈνΈ - μλ² κ°μ μ λ’°μ± μλ μ°κ²°μ μν΄ 3λ²μ ν¨ν· κ΅ν κ³Όμ )
- ν΄λΌμ΄μΈνΈ β μλ²(SYN): ν΄λΌμ΄μΈνΈλ μλ²μ 컀λ₯μ μ μ°κ²°νκΈ° μν΄ ν¨ν·(SYN(x))μ μ μ‘νλ€.
- μλ² β ν΄λΌμ΄μΈνΈ(ACK + SYN): μλ²λ ν΄λΌμ΄μΈνΈμμ μ μ‘ν ν¨ν·(SYN(x))μ λ°κ³ ν΄λΌμ΄μΈνΈμκ² λ°μλ€λ μ νΈμΈ ACK(x+1)μ SYN(y) ν¨ν·μ μ μ‘νλ€.
- ν΄λΌμ΄μΈνΈ β μλ²(ACK): ν΄λΌμ΄μΈνΈλ μλ²μ μλ΅ ν¨ν·(ACK(x+1) + SYN(y))μ λ°κ³ ACK(y+1)λ₯Ό μλ²λ‘ μ μ‘νλ€.
- ν΄λΌμ΄μΈνΈκ° μλ²μ λ°μ΄ν°λ₯Ό μμ²(REQUEST) νλ€.
- μλ²κ° ν΄λΌμ΄μΈνΈμκ² μλ΅(RESPONSE) νλ€.
- μλ²μ ν΄λΌμ΄μΈνΈ κ°μ μ°κ²° μ’
λ£νλ€.(4-way handshaking: ν΄λΌμ΄μΈνΈ - μλ² κ°μ μ°κ²°μ ν΄μ νλ 4λ²μ ν¨ν· κ΅ν κ³Όμ )
- ν΄λΌμ΄μΈνΈ β μλ²(FIN(+ACK)): ν΄λΌμ΄μΈνΈλ μλ²μκ² μ°κ²°μ μ’ λ£νλ€λ FIN ν¨ν·(ACK ν¬ν¨)μ μ μ‘νλ€.
- μλ² β ν΄λΌμ΄μΈνΈ(ACK): μλ²λ FINμ λ°κ³ νμΈνλ€λ ACKλ₯Ό ν΄λΌμ΄μΈνΈμκ² μ μ‘νκ³ μμ μ ν΅μ μ΄ λλ λκΉμ§ κΈ°λ€λ¦°λ€.(TIME_WAIT μν)
- μλ² β ν΄λΌμ΄μΈνΈ(FIN): λ°μ΄ν°λ₯Ό λͺ¨λ μ μ‘νλ€λ©΄ μλ²λ μ°κ²°μ΄ μ’ λ£λλ€λ μλ―Έλ‘ FIN ν¨ν·μ ν΄λΌμ΄μΈνΈμκ² μ μ‘ν ν μΉμΈλ²νΈλ₯Ό μ€ λκΉμ§ κΈ°λ€λ¦°λ€.(LAST_ACK μν)
- ν΄λΌμ΄μΈνΈ β μλ²(ACK): ν΄λΌμ΄μΈνΈλ FINμ λ°κ³ νμΈνλ€λ ACK ν¨ν·μ μ μ‘νλ€.
- μΉ λΈλΌμ°μ κ° μΉ λ¬Έμλ₯Ό μΆλ ₯νλ€.
HTTP λ©μμ§
ν΄λΌμ΄μΈνΈμμ μλ²λ‘ λ°μ΄ν°λ₯Ό 보λ΄λ κ²μ μμ²(REQUEST), μλ²μμ ν΄λΌμ΄μΈνΈλ‘ λ°μ΄ν°λ₯Ό 보λ΄λ κ²μ μλ΅(RESPONSE)μ΄λΌκ³ νλ€.
μ΄ μμ²κ³Ό μλ΅μ μμμ€, ν€λ, μν°ν° λ³Έλ¬ΈμΌλ‘ ꡬμ±λλ€. κ·Έλ¦¬κ³ μμμ€, ν€λ, μν°ν°λ μ€λ°κΏμΌλ‘ ꡬλΆλλ€.
- μμ² λ©μμ§(Request Message)
- λ©μλ(Method)
첫 μ€μλ ν΄λΌμ΄μΈνΈκ° 무μμ, μ΄λ»κ² μ²λ¦¬νκ³ μ νλ€λ μ λ³΄κ° λ΄κ²¨ μλλ° μ΄ λ λ©μλλ βμ΄λ»κ²β, μ¦ μ²λ¦¬ λ°©μμ ν΄λΉνλ€.
λ€μ λ§ν΄μ ν΄λΌμ΄μΈνΈκ° μλ²μκ² λ°μ΄ν°λ₯Ό μμ²νκ³ , μμ²νλ λ°μ΄ν°μ μννκ³ μ νλ λμμ λνλΈλ€.
λ©μλμ μ’ λ₯λ μλμ κ°λ€.- GET: μ‘΄μ¬νλ μμμ λν μμ²
- POST: μλ‘μ΄ μμμ μμ±
- PUT: μ‘΄μ¬νλ μμμ λν λ³κ²½
- DELETE: μ‘΄μ¬νλ μμμ λν μμ
-
κ²½λ‘(URL)
λ©μλκ° βμ΄λ»κ²βμ ν΄λΉνλ€λ©΄, κ²½λ‘λ λ©μλλ₯Ό μ°Έκ³ νμ¬ μνν λμ, μ¦ β무μμβμ ν΄λΉνλ€. μ£Όλ‘ κ°μ Έμ€λ €λ 리μμ€μ κ²½λ‘λ₯Ό νμνλ©° ννλ βhttps://www.google.comβμ²λΌ μμ ν νμ, β/index.htmlβμ²λΌ μλμ μΈ νμ λ± λ©μλμ μ νμ λ°λΌ λ€μν ν¬λ§·μ΄ μλ€. -
νλ‘ν μ½ λ²μ (Vesion of protocol)
HTTP νλ‘ν μ½μ λ²μ μ νμνλ€. νμ¬λ 1.1λ²μ κ³Ό 2λ²μ μ΄ μ£Όλ₯Ό μ΄λ£¨κ³ μλ€. - ν€λ(Headers)
μλ²μ λν μΆκ° μ 보λ₯Ό μ λ¬νλ€. μ£Όλ‘ νΈμ€νΈμ μ 보λ μ μνκ³ μλ μ¬μ©μμ μ 보, κ·Έλ¦¬κ³ μ μνλ €κ³ νλ νμ΄μ§μ μ 보 λ±μ νμΈν μ μλ€.- user-agent: μΉ λΈλΌμ°μ μ λ€λ₯Έ νν. μμ²νλ μΉ λΈλΌμ°μ μ μ 보 λ° μ΄μ체μ λ₯Ό νμνλ€.
- accept-encoding: ν΄λΌμ΄μΈνΈκ° μ΄ν΄ν μ μλ μμΆ λ°©μμ νμνλ€. accept-encodingμ νκΈ°νμ¬ μλ²μκ² μ μ‘νλ©΄ μλ²λ νμν κ²½μ° λ¦¬μμ€λ₯Ό μμΆνμ¬ λ°ννλ€.
-
곡백 λΌμΈ(Empty Line)
곡백 λΌμΈμ ν€λμ λ³Έλ¬Έμ ꡬλΆνλ μν μ΄λ€. λΉ μ€μ΄ μμΌλ©΄ λ©μμ§λ₯Ό μ½μ λ μ΄λκΉμ§κ° ν€λμ΄λ©° μ΄λλΆν°κ° λ³Έλ¬ΈμΈμ§λ₯Ό νμ ν μ μκΈ° λλ¬Έμ μ€μν μμμ΄λ€. - λ³Έλ¬Έ(Request Message Body)
λ©μμ§μ κ°μ₯ λ§μ§λ§μ λ€μ΄κ°λ 컨ν μΈ μ΄λ€. λ€λ§ λ€λ₯Έ 컨ν μΈ μλ λ€λ₯΄κ² λ³Έλ¬Έμ νμ μμλ μλλ€. λ©μλκ° GET, HEAD, DELETE, OPTIONS μ²λΌ 리μμ€λ₯Ό κ°μ Έμ€λ μμ²μ λ³΄ν΅ λ³Έλ¬Έμ΄ νμ μκΈ° λλ¬Έμ΄λ€.
λ°λΌμ POSTμ²λΌ μλ²μ μλ‘μ΄ μμμ μΆκ°ν΄μΌ νλ κ²½μ°μ κ·Έ μ 보λ₯Ό λ³Έλ¬Έμ μμ±νμ¬ μ λ¬νλ€.
- λ©μλ(Method)
- μλ΅ λ©μμ§(Response Message)
-
νλ‘ν μ½ λ²μ (Vesion of protocol)
μμ² λ©μμ§μ λμΌνλ©° HTTP νλ‘ν μ½μ λ²μ μ λνλΈλ€. - μν μ½λ(Status code)
μν μ½λλ ν΄λΌμ΄μΈνΈ μμ²μ μ±κ³΅ μ¬λΆλ₯Ό μ«μλ‘ λνλΈ κ²μ΄λ©°, μν λ©μμ§λ μν μ½λλ₯Ό μ΄ν΄νκΈ° μ½κ² μμ΄λ‘ νμ΄μ΄ λ©μμ§μ΄λ€. μν μ½λμ μν λ©μμ§λ 100λ²λλΆν° 500λ²λκΉμ§ μ‘΄μ¬νλλ° κ·Έ μ€ μ°λ¦¬κ° κ°μ₯ μμ£Ό μ νλ μ½λλ μ±κ³΅νμ λ λμ€λ 200λ²λ, μΉ λΈλΌμ°μ μΈ‘μμ μ€λ₯κ° λ°μνμ λ λμ€λ 400λ²λμ΄λ€.
ν¬κ² 5κ°λ‘ λνλ΄λ μνμ½λλ μλμ κ°λ€.(μμΈν μν μ½λλ λ§ν¬ μ°Έκ³ )- 1xx(μ‘°κ±΄λΆ μλ΅): μμ²μ λ°μμΌλ©° μμ μ κ³μνλ€.
- 2xx(μ±κ³΅): μ μμ μΌλ‘ μμ²μ μννμ λ λνλ΄λ μ½λμ΄λ€.
- 3xx(리λ€μ΄λ μ μλ£): ν΄λΌμ΄μΈνΈκ° μμ²μ λ§μΉκΈ° μν΄ μΆκ° λμμ μ·¨ν΄μΌν λ λνλλ€.
- 4xx(μμ² μ€λ₯): ν΄λΌμ΄μΈνΈμ μμ²μ μ€λ₯κ° μμ λ λνλ΄λ μ½λμ΄λ€.
- 5xx(μλ² μ€λ₯): μλ²κ° λ€μ΄μ¨ μμ²μ μννμ§ λͺ»νμ λ λνλ΄λ μ½λμ΄λ€.
- ν€λ(Headers)
μμ² ν€λμ μ μ¬ν νμμΌλ‘ μΆκ° μ 보λ₯Ό μ λ¬νλ€.- content-type: μ λ¬ν 리μμ€μ νμ . text/htmlμ΄λΌλ©΄ ν μ€νΈ μ€μμλ HTML νμ μ΄λΌλ λ»μ΄λ©°, image/jpegλΌλ©΄ jpeg νμ₯μλ₯Ό κ°μ§ μ΄λ―Έμ§μμ μλ―Ένλ€.
- content-encoding: μλ΅ λ©μμ§ ν€λμ accept-encodingμ²λΌ 컨ν μΈ κ° μμΆλ λ°©μμ νμνλ€.
- date: ν΄λΉ λ©μμ§κ° λ§λ€μ΄μ§ λ μ§μ μκ°μ ν¬ν¨νλ€.
- λ³Έλ¬Έ(Body)
κ°μ Έμ¨ 리μμ€κ° νμλλ€. λ§μ½ 리μμ€ μ νμ΄ HTMLμ΄λΌλ©΄ <html><body></body></html> ννμ HTMLμ½λκ° λνλκ³ , μ νμ΄ μ΄λ―Έμ§ λλ λμμμ΄λ©΄ κ·Έμ λ§λ μ½λκ° νμλλ€.
-
HTTP λ²μ λ³ νΉμ§
- HTTP/0.9
- ν€λ, μν, λ°λ, μ€λ₯μ κ°μ κ°λ μ΄ μμκ³ , GET λ©μλλ§μ΄ μ μΌνλ€.
- μλΌμΈ νλ‘ν μ½μ΄λ€.
- HTTP/1.0
- ν€λκ° μΆκ°λμ΄ λ©νλ°μ΄ν°λ₯Ό μ μ‘ν μ μκ² λμλ€.
- Content-Typeμ΄ μ‘΄μ¬νμ¬ HTMLμ΄ μλ λ€λ₯Έ λ¬Έμλ μ μ‘ν μ μκ² λμλ€.
- HTTP λ²μ μ νμΈν μ μμλ€.
- μνμ½λκ° μλ΅μ μμλΆλΆμ λΆμ΄ μ μ‘λμκ³ , κ·Έ κ²°κ³Όμ λν λμμ ν μ μκ² λμλ€.
- HTTP/1.1
- HTTPμ 첫λ²μ§Έ νμ€ λ²μ μ΄λ€.
- μ¬λ¬ μμ²μ΄ νλμ 컀λ₯μ μ ν΅ν΄ μ²λ¦¬ν μ μκ² λμλ€.
- νλμ 컀ν
μ
μμ μλ΅μ κΈ°λ€λ¦¬μ§ μκ³ μμ°¨μ μΈ μ¬λ¬ μμ²μ μ°μμ μΌλ‘ λ³΄λ΄ κ·Έ μμμ λ§μΆ° μλ΅μ λ°λ λ°©μμΌλ‘, μ§μ° μκ°μ μ€μ΄λ λ°©λ²μΈ Pipeliningμ΄ λμ
λμλ€.
νμ§λ§ μλμ κ°μ΄ λ¬Έμ μ μ΄ μλ€.- Head Of Line Blocking, μ μμ²μ μκ°μ΄ μ€λ 걸리면 λ€μ μ€λ μμ²λ ν΄λΉ μμ²μ΄ μ²λ¦¬λ λκΉμ§ κΈ°λ€λ €μΌνλ νμμ΄λ€.
- Header ꡬ쑰μ μ€λ³΅, μ°μλ μμ²μ κ²½μ° Header κ°μ΄ κ°μ κ²½μ°κ° λ§μμλ λΆκ΅¬νκ³ μ€λ³΅λ κ°μ κ·Έλλ‘ μ μ‘νλ νμμ΄λ€. μ£Όκ³ λ°λ λ°μ΄ν°κ° λΆνμνκ² μ»€μ§λ€.
- 컀λ₯μ μ΄ μ¬μ¬μ©λ μ μλλ‘ μ¬μ©λ 컀λ₯μ μ μ μ§νμ¬ μκ°μ μ μ½νκ² λμλ€.(Keep-Alive)
- μΊμ μ μ΄ λ©μ»€λμ¦μ΄ λμ λμλ€.(ETag)
- λμΌ IP μ£Όμμ λ€λ₯Έ λλ©μΈμ νΈμ€νΈνλ κΈ°λ₯ κ°λ₯ν΄μ‘λ€.(HOST header)
- HTTP/2
- κΈ°μ‘΄ λ²μ μ μ±λ₯ ν₯μμ μ΄μ μ λ§μΆ νλ‘ν μ½μ΄λ€. μ¦, νμ€μ λμ²΄κ° μλ νμ₯μ λͺ©μ μΌλ‘ νλ€.
- μμ²κ³Ό μλ΅μ λ©ν°νλ μ±μ μ§μνλ€.
- λ°μ΄λ리 νλ μ΄λ° κ³μΈ΅μ μ¬μ©νμ¬, νμ±κ³Ό μ μ‘ μλλ₯Ό λμ΄κ³ μ€λ₯ λ°μ κ°λ₯μ±μ μ€μΈλ€.
- λ©μμ§λ₯Ό νλ μμ΄λΌλ λ¨μ(ν€λμ€ νλ μ, λ°μ΄ν νλ μ)λ‘ λΆν νκ³ , μ΄λ₯Ό λ°μ΄λλ¦¬λ‘ μΈμ½λ©νλ€.
- νλμ TCP 컀λ₯μ λ§μΌλ‘ ν΄λΉ μΉ νμ΄μ§μ λͺ¨λ μμ²κ³Ό μλ΅ λ°μ΄ν°λ₯Ό μ μ‘νλ©°, λ°μ΄λ리 νλ μμ μ€νΈλ¦Ό μ μ‘ λ°©μμ ν΅ν΄ μλ΅ μμμ 무κ΄νκ² λ°μ΄ν°λ₯Ό μ²λ¦¬νλ€.
- HTTP/1.1μ Pipeliningκ³Ό λ©ν°νλ μ±μ κ°μ₯ ν° μ°¨μ΄λ μμ°¨μ μλ΅ μ²λ¦¬μ λ°λ₯Έ HOLB(Head Of Line Blocking)λ₯Ό μλ²½νκ² ν΄κ²°νλ€λ κ²μ΄λ€.
- λ¨Όμ μλ΅ λ°κ³ μΆμ μμ²μ μ°μ μμ(Stream Priority)λ₯Ό μ§μ ν μ μλ€.
- HTTP ν€λ λ°μ΄ν° μμΆ κΈ°λ₯μ΄ μΆκ°λμ΄ νμ΄μ§ λ‘λ μκ°μ μ€μλ€.
- Header tableκ³Ό Huffman Encoding κΈ°λ²μ μ¬μ©νμ¬ Header μ 보λ₯Ό μμΆ(HPACK μμΆ λ°©μ)νλ€.
- HPACK μκ³ λ¦¬μ¦μΌλ‘λ Header ν¬κΈ°λ₯Ό μ½ 85%λ‘ μμΆν μ μλ€κ³ νλ€.
- Server Push κΈ°μ λμ
μ΄ λμλ€.
- ν΄λΌμ΄μΈνΈκ° μμ²ν κ²μΌλ‘ μμλλ 리μμ€λ₯Ό ν΄λΌμ΄μΈνΈκ° μμ²νμ§ μμλ μμμ μλ²μμ Pushν΄μ 보λ΄μ€λ€.
- HTTP/3
- UDP κΈ°λ°μ νλ‘ν μ½μ μ¬μ©νλ€.(μ ννκ²λ QUIC)
- βHTTP over QUICβμ΄λΌκ³ νννκ³ μ€μ¬μ HQλΌκ³ νλ€.
- HTTP/2μ μλ νλ μ, μ€νΈλ¦Ό, λ©μμ§ κ΅¬μ‘°μ κΈ°μ λ€μ κ·Έλλ‘ HTTP/3λ‘ μΉκ³λμκ³ λͺ μΉλ§ HQframe, QPACK λ±μΌλ‘ λ³κ²½λμλ€.
- μ§μνλ λΈλΌμ°μ λ λ§ν¬λ₯Ό μ°Έκ³
- UDPλ λ°μ΄ν° μ λ’°μ±μ 보μ₯νμ§ μμ§λ§ QUIC κ³μΈ΅ μΆκ°λ₯Ό ν΅ν΄ TCPμ κ°μ μ λ’°μ±μ μ 곡νλ€.
- Handshakeλ₯Ό μ¬μ©νμ§ μμμ λΉ λ₯΄λ€.
- HTTP/2Dμ λ©ν°νλ μ±κ³Ό κ°μ΄ νλμ μ°κ²°λ‘ λ€μμ λ³λ ¬ μ€νΈλ¦ΌμΌλ‘ λ°μ΄ν°λ₯Ό λμ μ μ‘νλ©° UDP κΈ°λ°μ΄μ§λ§ κ·Έμ λ€λ₯΄κ² TCPμ κ°μ μμμ λ§λ μ μ‘ μ²λ¦¬λ₯Ό νλ€.
- HTTP/2μμλ μ¬λ¬ μ€νΈλ¦Ό μ€μ νλμ μ€νΈλ¦Όμ΄ ν¨ν·μ μλ κ²½μ° λ³΅κ΅¬κ° λμ§ μμμ§λ§ QUICλ λ€λ₯Έ μ€νΈλ¦Όμ΄ μ μ‘ μ€μ μμ μ€νΈλ¦Όμ ν¨ν·μ μ¬μ μ‘νμ¬ μλ£κ° κ°λ₯νλ€.
- μΌλ°μ μΈ μΉ νκ²½μμλ HTTP/2μ μ°¨μ΄κ° ν¬μ§ μμ μ μμ§λ§, λμμ μλΉμ€ λ±μμλ ν° μ°¨μ΄λ₯Ό 보μΈλ€.
- UDP κΈ°λ°μ νλ‘ν μ½μ μ¬μ©νλ€.(μ ννκ²λ QUIC)
Leave a comment