1. λͺ¨λ“  것이 HTTP

πŸ“Œ HTTP(HyperText Transfer Protocol)
ν•˜μ΄νΌν…μŠ€νŠΈλ₯Ό κ΅ν™˜ν•˜κΈ° μœ„ν•œ ν”„λ‘œν† μ½œμ΄λ‹€. HTTP에 HTML, TEXT, IMAGE, μŒμ„±, μ˜μƒ, 파일, JSON, XML (API) λ“± 거의 λͺ¨λ“  ν˜•νƒœμ˜ 데이터 λ‹΄μ•„ 전솑할 수 μžˆλ‹€. μ„œλ²„ 간에 데이터λ₯Ό 주고받을 λ•Œλ„ λŒ€λΆ€λΆ„ HTTPλ₯Ό μ‚¬μš©ν•œλ‹€.


πŸ“Œ HTTP 역사

  • HTTP/0.9 (1991λ…„): GET λ©”μ„œλ“œλ§Œ 지원, HTTP 헀더X
  • HTTP/1.0 (1996λ…„): λ©”μ„œλ“œ, 헀더 μΆ”κ°€
  • HTTP/1.1 (1997λ…„): κ°€μž₯ 많이 μ‚¬μš©, μš°λ¦¬μ—κ²Œ κ°€μž₯ μ€‘μš”ν•œ 버전
    πŸ‘‰ RFC2068 (1997) -> RFC2616 (1999) -> RFC7230~7235 (2014)
  • HTTP/2 (2015λ…„): μ„±λŠ₯ κ°œμ„ 
  • HTTP/3 (진행 쀑): TCP λŒ€μ‹ μ— UDP μ‚¬μš©, μ„±λŠ₯ κ°œμ„ 

πŸ“Œ HTTP의 기반 ν”„λ‘œν† μ½œ
HTTP/1.1, HTTP/2λŠ” TCP ν”„λ‘œν† μ½œ μœ„μ—μ„œ λ™μž‘ν•œλ‹€. HTTP/3λŠ” UDP ν”„λ‘œν† μ½œ 기반으둜 κ°œλ°œλ˜μ–΄ μžˆλ‹€. TCPλŠ” 3 way handshakeλ₯Ό μˆ˜ν–‰ν•˜κ³  데이터양이 많고 λ©”μ»€λ‹ˆμ¦˜ μžμ²΄κ°€ 속도가 느린 νŽΈμ΄λ‹€.

이 λ•Œλ¬Έμ— UDP ν”„λ‘œν† μ½œ μœ„μ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‹¨κ³„μ—μ„œ μ„±λŠ₯을 μ΅œμ ν™”ν•˜λ„λ‘ μƒˆλ‘œ μ„€κ³„ν•œλ‹€. ν˜„μž¬ HTTP/1.1 주둜 μ‚¬μš©ν•˜μ§€λ§Œ, HTTP/2, HTTP/3의 μ‚¬μš©λ„ 점점 μ¦κ°€ν•˜κ³  μžˆλ‹€.

πŸ‘‰ μ›Ή μ‚¬μ΄νŠΈ 개발자 λ„κ΅¬μ—μ„œ ν˜„μž¬ μ›Ή μ‚¬μ΄νŠΈμ˜ ν”„λ‘œν† μ½œμ„ 확인할 수 μžˆλ‹€. μΈν”„λŸ° κ°•μ˜ μ‚¬μ΄νŠΈλŠ” HTTP/2 버전이 μ‚¬μš©λ˜κ³  μžˆλ‹€.


πŸ“Œ HTTP νŠΉμ§•
HTTPλŠ” ν΄λΌμ΄μ–ΈνŠΈ μ„œλ²„ ꡬ쑰둜 λ™μž‘ν•œλ‹€. λ¬΄μƒνƒœ ν”„λ‘œν† μ½œ(stateless)이고 λΉ„μ—°κ²°μ„±μ΄λΌλŠ” νŠΉμ§•μ΄ μžˆλ‹€. λ˜ν•œ, HTTP λ©”μ‹œμ§€λ₯Ό ν†΅ν•΄μ„œ ν†΅μ‹ ν•˜κ³  λ‹¨μˆœν•˜κ³  ν™•μž₯ κ°€λŠ₯ν•˜λ‹€.



2. ν΄λΌμ΄μ–ΈνŠΈ μ„œλ²„ ꡬ쑰

πŸ“Œ Request Response ꡬ쑰

HTTPλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ HTTP λ©”μ‹œμ§€λ₯Ό 톡해 μ„œλ²„μ— μš”μ²­μ„ 보내고 μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ 응닡이 올 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦°λ‹€. μ„œλ²„κ°€ μš”μ²­μ— λŒ€ν•œ κ²°κ³Όλ₯Ό λ§Œλ“€μ–΄μ„œ 응닡이 였면, κ·Έ 응닡 κ²°κ³Όλ₯Ό μ—΄μ–΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ™μž‘ν•œλ‹€.


πŸ’‘ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„λ₯Ό λΆ„λ¦¬ν•˜λŠ” 이유

ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„λ₯Ό λΆ„λ¦¬ν•΄μ„œ ν΄λΌμ΄μ–ΈνŠΈλŠ” UI와 μ‚¬μš©μ„±μ— μ§‘μ€‘ν•˜κ³ , μ„œλ²„λŠ” λΉ„μ§€λ‹ˆμŠ€ 둜직과 데이터에 μ§‘μ€‘ν•˜κ²Œ ν–ˆλ‹€.

μ΄μŠˆκ°€ λ°œμƒν•΄λ„ μ„œλ‘œμ˜ 역할이 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šκ³  λ…λ¦½μ μœΌλ‘œ μ΄μŠˆμ— λŒ€μ‘ν•˜λ©΄μ„œ 진화할 수 μžˆλ‹€.



3. Stateful, Stateless

πŸ™β€β™‚οΈ 고객은 λ…ΈνŠΈλΆ 2개λ₯Ό μ‹ μš©μΉ΄λ“œλ‘œ ꡬ맀할 μ˜ˆμ •μ΄λ‹€.
πŸ™β€β™€οΈ Stateful, Stateless에 λ”°λ₯Έ 고객과 μ μ›μ˜ μƒνƒœ λ³€ν™”λ₯Ό μ•Œμ•„λ³΄μž.

πŸ“Œ μƒνƒœ μœ μ§€(Stateful)

μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό μœ μ§€ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­ 정보λ₯Ό 맀칭된 μ„œλ²„μ— 계속 μœ μ§€ν•΄μ•Ό ν•˜λ―€λ‘œ μ„œλ²„λ₯Ό 늘릴 μˆ˜κ°€ μ—†λ‹€. 쀑간에 μœ μ§€ν•΄μ•Ό ν•˜λŠ” μ„œλ²„μ— μž₯μ• κ°€ λ°œμƒν•˜μ—¬ μ„œλ²„κ°€ λ³€κ²½λœλ‹€λ©΄, ν΄λΌμ΄μ–ΈνŠΈκ°€ 정보λ₯Ό λ‹€μ‹œ μš”μ²­ν•΄μ•Ό ν•œλ‹€.

점원(μ„œλ²„)이 '고객이 λ…ΈνŠΈλΆ 2개λ₯Ό μ‹ μš©μΉ΄λ“œλ‘œ ꡬ맀할 것이닀.'λΌλŠ” λ‚΄μš©μ„ κΈ°μ–΅ν•˜κ³  μžˆλŠ”λ‹€.


πŸ“Œ λ¬΄μƒνƒœ(Stateless)

μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€. ν΄λΌμ΄μ–ΈνŠΈμ˜ λͺ¨λ“  μš”μ²­ 정보λ₯Ό μ„œλ²„μ— μš”μ²­ν•˜λ©΄ μ„œλ²„λŠ” μƒνƒœλ₯Ό λ³΄μ‘΄ν•˜μ§€ μ•Šκ³  μ‘λ‹΅λ§Œ ν•œλ‹€. 쀑간에 μ„œλ²„μ— μž₯μ• κ°€ λ°œμƒν•΄λ„ ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ— ν•„μš”ν•œ 정보가 λͺ¨λ‘ λ‹΄κ²¨μžˆκΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ μ„œλ²„μ— μš”μ²­ν•˜κ³  μ„œλ²„κ°€ 응닡할 수 μžˆλ‹€.
πŸ‘‰ λ¬΄ν•œ μ„œλ²„ 증섀 κ°€λŠ₯.

고객이 μ§μ›μ—κ²Œ 결제λ₯Ό μš”μ²­ν•  λ•Œ 'λ…ΈνŠΈλΆ 2개λ₯Ό μ‹ μš©μΉ΄λ“œλ‘œ ꡬ맀할 것이닀.' 와 같이 λͺ¨λ“  μš”μ²­ λ‚΄μš©μ„ 같이 λ§ν•œλ‹€.


πŸ“Œ λ¬΄μƒνƒœ μŠ€μΌ€μΌ 아웃

λ¬΄μƒνƒœλŠ” μˆ˜ν‰ ν™•μž₯에 μœ λ¦¬ν•˜λ‹€. λ§Œμ•½ 둜그인 없이 κ²€μƒ‰λ§Œ ν•  경우, 검색 μ„œλ²„μ— νŠΈλž˜ν”½μ΄ 많이 μ˜¬λΌκ°€λ”λΌλ„ 검색 μ„œλ²„μ— ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœκ°€ μœ μ§€λ˜μ§€ μ•Šμ•„μ„œ μ„œλ²„λ₯Ό 많이 늘릴 수 μžˆλ‹€. λ˜ν•œ, μƒνƒœλ₯Ό μœ μ§€ν•  ν•„μš”κ°€ μ—†μ–΄ 섀계가 μš©μ΄ν•˜λ‹€.


πŸ“Œ μƒνƒœ μœ μ§€(Stateful)와 λ¬΄μƒνƒœ(Stateless)의 ν•œκ³„

πŸ’‘μƒνƒœ μœ μ§€(Stateful)의 ν•œκ³„

  • λ‘œκ·ΈμΈν•΄μ•Ό ν•˜λŠ” 경우, λ‘œκ·ΈμΈν•œ μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈν–ˆλ‹€λŠ” μƒνƒœλ₯Ό μ„œλ²„μ— μœ μ§€ν•΄μ•Ό ν•œλ‹€.
  • λΈŒλΌμš°μ €μ—μ„œ 쿠킀와 μ„Έμ…˜μ„ 같이 μ‘°ν•©ν•΄μ„œ μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” κΈ°λŠ₯을 μ‚¬μš©ν•œλ‹€.
    πŸ‘‰ μ„œλ²„μ— μ„Έμ…˜μ΄ λ‚ μ•„κ°€κ±°λ‚˜ μ„Έμ…˜ μ„œλ²„κ°€ 죽어버리면 둜그인이 ν’€λ¦°λ‹€.
  • μƒνƒœ μœ μ§€λŠ” μ΅œμ†Œν•œλ§Œ μ‚¬μš©ν•œλ‹€.

πŸ’‘λ¬΄μƒνƒœ(Stateless)의 ν•œκ³„

  • ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ 정보λ₯Ό λ‹΄μ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 데이터양이 λ§Žλ‹€.


4. λΉ„μ—°κ²°μ„±(connectionless)

πŸ“Œ 연결을 μœ μ§€ν•˜λŠ” λͺ¨λΈ

μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„λ‘œ 응닡을 μš”μ²­ν•˜λ©΄ μ„œλ²„λŠ” μš”μ²­μ΄ λ“€μ–΄μ˜¨ ν΄λΌμ΄μ–ΈνŠΈλ§ˆλ‹€ 연결을 μœ μ§€ν•΄μ„œ μƒνƒœλ₯Ό μ €μž₯ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ λ§Žμ•„μ§ˆμˆ˜λ‘ 연결을 μœ μ§€ν•˜λŠ” μ„œλ²„ μžμ›μ΄ 계속 μ†Œλͺ¨λœλ‹€λŠ” 단점이 μžˆλ‹€.


πŸ“Œ 연결을 μœ μ§€ν•˜μ§€ μ•ŠλŠ” λͺ¨λΈ

ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•  λ•Œλ§ˆλ‹€ μ„œλ²„λŠ” μ‘λ‹΅λ§Œ 보내주고 연결을 μ’…λ£Œν•˜κΈ° λ•Œλ¬Έμ— μ΅œμ†Œν•œμ˜ μžμ›μ„ μ‚¬μš©ν•œλ‹€.


πŸ“Œ λΉ„μ—°κ²°μ„±
HTTPλŠ” 일반적으둜 초 λ‹¨μœ„ μ΄ν•˜μ˜ λΉ λ₯Έ μ†λ„λ‘œ μ‘λ‹΅ν•˜κΈ° λ•Œλ¬Έμ— 기본적으둜 연결을 μœ μ§€ν•˜μ§€ μ•ŠλŠ” λͺ¨λΈμ΄λ‹€. 1μ‹œκ°„ λ™μ•ˆ 수천 λͺ…이 μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•΄λ„ μ‹€μ œ μ„œλ²„μ—μ„œ λ™μ‹œμ— μ²˜λ¦¬ν•˜λŠ” μš”μ²­μ€ μˆ˜μ‹­ 개 μ΄ν•˜λ‘œ 맀우 μž‘κΈ° λ•Œλ¬Έμ— μ„œλ²„ μžμ›μ„ 효율적으둜 μ‚¬μš©ν•  수 μžˆλ‹€.


πŸ“Œ λΉ„μ—°κ²°μ„±μ˜ ν•œκ³„

  • TCP/IP 연결을 μƒˆλ‘œ 맺을 λ•Œλ§ˆλ‹€ 3 way handshake μ‹œκ°„μ΄ μΆ”κ°€λΌμ„œ ν΄λΌμ΄μ–ΈνŠΈ μž…μž₯μ—μ„œλŠ” λŠλ¦¬λ‹€.

  • μ›Ή λΈŒλΌμš°μ €λ‘œ μ‚¬μ΄νŠΈλ₯Ό μš”μ²­ν•˜λ©΄ HTML뿐만 μ•„λ‹ˆλΌ μžλ°”μŠ€ν¬λ¦½νŠΈ, css, μΆ”κ°€ 이미지 λ“± μˆ˜λ§Žμ€ μžμ›μ΄ ν•¨κ»˜ λ‹€μš΄λ‘œλ“œλœλ‹€.
    πŸ‘‰ μ΄λ•Œλ§ˆλ‹€ μ—°κ²°ν•˜κ³  끊고λ₯Ό λ°˜λ³΅ν•˜λ©΄ λΉ„νš¨μœ¨μ μ΄λ‹€.

πŸ“Œ λΉ„μ—°κ²°μ„±μ˜ ν•œκ³„ 극볡
HTTP 지속 μ—°κ²°(Persistent Connections)둜 λΉ„μ—°κ²°μ„±μ˜ ν•œκ³„λ₯Ό 극볡할 수 μžˆλ‹€. HTTP/2, HTTP/3μ—μ„œ 지속 연결이 λ”μš± μ΅œμ ν™” λ˜μ–΄μžˆλ‹€.

πŸ’‘ HTTP 초기

πŸ‘‰ 'μ—°κ²°ν•˜κ³  μš”μ²­/μ‘λ‹΅ν•˜κ³  μ’…λ£Œ'λ₯Ό λ°˜λ³΅ν•˜λ―€λ‘œ 속도가 λŠλ¦¬λ‹€.

πŸ’‘ HTTP 지속 μ—°κ²°(Persistent Connections)

πŸ‘‰ 연결을 μœ μ§€ν•˜λ©΄μ„œ λ‚΄λΆ€ λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ μš”μ²­/응닡을 μ™„λ£Œν•œ ν›„ μ’…λ£Œν•˜λ―€λ‘œ 속도가 λΉ λ₯΄λ‹€.


βž•βž•
Statelessλ₯Ό κΈ°μ–΅ν•˜μž
μ„œλ²„ κ°œλ°œμžλ“€μ΄ μ–΄λ €μ›Œν•˜λŠ” μ—…λ¬΄λŠ” μ„ μ°©μˆœ 이벀트, λͺ…μ ˆ KTX μ˜ˆμ•½κ³Ό 같이 같은 μ‹œκ°„μ— λ”± λ§žμΆ°μ„œ λ°œμƒν•˜λŠ” λŒ€μš©λŸ‰ νŠΈλž˜ν”½ 관리이닀. 이와 같은 μƒν™©μ—μ„œλŠ” Stateless ν•˜κ²Œ μ„€κ³„ν•˜λŠ” 게 κ°€μž₯ μ€‘μš”ν•˜λ‹€.



5. HTTP λ©”μ‹œμ§€

πŸ“Œ HTTP λ©”μ‹œμ§€ ꡬ쑰

HTTP λ©”μ‹œμ§€λŠ” start-line, header, empty line(CRLF), message body 4개의 ꡬ쑰둜 λ‚˜λ‰œλ‹€.


πŸ“Œ HTTP μš”μ²­ λ©”μ‹œμ§€

⚑ start-line = request-line

GET/search?q=hello&hl=ko HTTP/1.1
method SP(곡백) request-target SP(곡백) HTTP-version CRLF(μ—”ν„°)

Host: www.google.com
field-name":" OWS field-value OWS Β Β Β Β Β Β  (OWS:띄어쓰기 ν—ˆμš©)

  • method
    HTTP λ©”μ„œλ“œ μ’…λ₯˜: GET, POST, PUT, DELETE 등이 있고 μ„œλ²„κ°€ μˆ˜ν–‰ν•΄μ•Ό ν•  λ™μž‘μ„ μ§€μ •ν•œλ‹€.
    (EX) GET: λ¦¬μ†ŒμŠ€ 쑰회, POST: μš”μ²­ λ‚΄μ—­ 처리

  • request-target

    /absolute-path[?query]
    /μ ˆλŒ€κ²½λ‘œ[?쿼리]

μ ˆλŒ€κ²½λ‘œλŠ” "/"둜 μ‹œμž‘ν•˜κ³  뒀에 쿼리λ₯Ό ν•©μΉœλ‹€.
(*http://...?x=y와 같이 λ‹€λ₯Έ μœ ν˜•μ˜ κ²½λ‘œμ§€μ • 방법도 μžˆλ‹€.)


πŸ“Œ HTTP 응닡 λ©”μ‹œμ§€

⚑ start-line = status-line

HTTP/1.1 200 OK
HTTP-version SP status-code SP reason-phrase CRLF

  • status-code (HTTP μƒνƒœ μ½”λ“œ)
    ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ μ„±κ³΅ν–ˆλŠ”μ§€ μ‹€νŒ¨ν–ˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
    βœ”οΈ 200: 성곡, 400: ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ 였λ₯˜, 500: μ„œλ²„ λ‚΄λΆ€ 였λ₯˜

  • reason-phrase(이유 문ꡬ)
    μ‚¬λžŒμ΄ 이해할 수 μžˆλŠ” 짧은 μƒνƒœ μ½”λ“œ μ„€λͺ…이닀.


⚑ HTTP header

μœ„ μ‚¬μ§„μ—μ„œ
field-name은 Content-Type, Content-Length
field-valueλŠ” 'text/html;charset=UTF-8', ': 3423'

  • field-name: λŒ€μ†Œλ¬Έμž ꡬ뢄 ❌
  • field-value: λŒ€μ†Œλ¬Έμž ꡬ뢄 β­•

HTTP ν—€λ”λŠ” λ©”μ‹œμ§€ λ°”λ””μ˜ λ‚΄μš©, λ©”μ‹œμ§€ λ°”λ””μ˜ 크기, μ••μΆ•, 인증, μš”μ²­ ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €) 정보, μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 정보, μΊμ‹œ 관리 정보 λ“± HTTP 전솑에 ν•„μš”ν•œ λͺ¨λ“  λΆ€κ°€ 정보λ₯Ό λ‹΄κ³  μžˆλ‹€.

ν‘œμ€€ 헀더가 맀우 많고 ν•„μš”μ‹œ μž„μ˜μ˜ 헀더λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.


⚑ HTTP λ©”μ‹œμ§€ λ°”λ””

μ‹€μ œ 전솑할 데이터가 λ‹΄κ²¨μžˆλ‹€. HTML λ¬Έμ„œ, 이미지, μ˜μƒ, JSON λ“± byte둜 ν‘œν˜„ν•  수 μžˆλŠ” λͺ¨λ“  데이터가 전솑 κ°€λŠ₯ν•˜λ‹€.

0개의 λŒ“κΈ€