πŸ“Œ κΉ€μ˜ν•œ λ‹˜μ˜ "λͺ¨λ“  개발자λ₯Ό μœ„ν•œ HTTP μ›Ή κΈ°λ³Έ 지식" κ°•μ˜ λ“£κ³  정리

 

πŸ“HTTP (Hyper Text Transfer Protocol)

 

'HTTP'λŠ” λ‹€μ–‘ν•œ ν™˜κ²½μ—μ„œ μ—¬λŸ¬ κΈ°κΈ°κ°€ μ„œλ‘œ 톡신을 μ£Όκ³  받을 수 있게 λ§Œλ“  μΌμ’…μ˜ κ·œμΉ™μ΄λ‹€.     

예λ₯Ό λ“€μ–΄ λ‚΄(κ°€ 이런 데이터λ₯Ό μš”μ²­ν•˜λ©΄ λ„ˆλŠ” 이런 데이터λ₯Ό λ°˜ν™˜ν•˜λΌλŠ” μ‹μ˜ 톡신 κ·œμΉ™μΈ 것이닀.

 

* λ¬Έμ„œκ°„μ˜ 링크λ₯Ό 톡해 μ—°κ²°ν•  수 μžˆλŠ” html을 μ „μ†‘ν•˜λŠ” ν”„λ‘œν† μ½œλ‘œ μ‹œμž‘ν–ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν˜„μž¬λŠ”!

  • HTML, TEXT
  • 이미지, μŒμ„±, μ˜μƒ, 파일
  • JSON, XML (API)

거의 λͺ¨λ“  ν˜•νƒœμ˜ 데이터λ₯Ό 전솑 κ°€λŠ₯ν•΄μ‘Œκ³ , μ„œλ²„κ°„μ— 데이터λ₯Ό μ£Όκ³  받을 λ•Œλ„ λŒ€λΆ€λΆ„ HTTP μ‚¬μš©ν•˜κ³  μžˆλ‹€.

 

* HTTP 역사

  • HTTP/0.9 : 1991λ…„ / GET λ©”μ„œλ“œλ§Œ 지원, HTTP 헀더 μ—†μŒ
  • HTTP/1.0 : 1996λ…„ / λ©”μ„œλ“œμ™€ 헀더 μΆ”κ°€
  • HTTP/1.1 : 1997λ…„ / ν˜„μž¬μ— κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” 버전 (RFCλ¬Έμ„œ : 2068 > 2616 > 7230~7235)
  • HTTP/2 : 2015λ…„  / μ„±λŠ₯ κ°œμ„ 
  • HTTP/3 : 진행쀑 / TCPλŒ€μ‹  UDP μ‚¬μš©, μ„±λŠ₯κ°œμ„ 

* 기반 ν”„λ‘œν† μ½œ

  • TCP : HTTP/1.1 , HTTP/2
  • UDP : HTTP/3

HTTP/2 , HTTP/3 도 μ‚¬μš©μ΄ 점점 μ¦κ°€ν•˜κ³  μžˆλ‹€. 

보면 h2(HTTP/2)와 h3(HTTP/3) 도 λ§Žλ‹€

 

 

πŸ“ν΄λΌμ΄μ–ΈνŠΈ μ„œλ²„ ꡬ쑰

  • HTTPλŠ” Request 와 Response의 ꡬ쑰
  • ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­μ„ 보내고 μ„œλ²„μ˜ 응닡 λŒ€κΈ°
  • μ„œλ²„λŠ” μš”μ²­μ— λŒ€ν•œ κ²°κ³Όλ₯Ό 응닡

* μ™œ μ΄λ ‡κ²Œ λΆ„λ¦¬ν• κΉŒ?

κ°œλ…μ μœΌλ‘œ λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ λΉ„μ§€λ‹ˆμŠ€ 둜직과 λ°μ΄ν„°λŠ” μ„œλ²„μ—κ²Œ UI, μ‚¬μš©μ„± 등은 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ§‘μ€‘μ‹œμΌœ λ…λ¦½μ μœΌλ‘œ μ§„ν™”κ°€ κ°€λŠ₯ν•΄μ§„λ‹€. 

 

πŸ“Stateful, Stateless

HTTP의 μ€‘μš”ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜λŠ” λ¬΄μƒνƒœ ν”„λ‘œν† μ½œμ„ μ§€ν–₯ν•œλ‹€. 

 

* λ¬΄μƒνƒœμ„±(Stateless)μ΄λž€?

ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•˜λŠ” μš”μ²­μ— λŒ€ν•΄ μ„œλ²„λŠ” μ‘λ‹΅λ§Œ ν•  뿐 이전 μƒνƒœμ— λŒ€ν•œ 정보λ₯Ό λ³΄μ‘΄ν•˜μ§€ μ•ŠλŠ”λ‹€.

이전에 무엇을 μš”μ²­ν–ˆλŠ” 지에 따라 κ²°κ³Ό 값이 λ‹¬λΌμ§€λŠ” λ“±μ˜ λ³€ν™”λŠ” μ—†λ‹€. μ² μ €ν•˜κ²Œ 맀번 μš”μ²­ 값에 λŒ€ν•œ κ²ƒλ§Œμ„ μ‘λ‹΅ν•œλ‹€.

 

μƒνƒœ μœ μ§€λŠ” 응닡 μ„œλ²„κ°€ λ°”λ€Œκ²Œ 되면 λ‹€λ₯Έ μ„œλ²„μ—λ„ μ•Œλ €μ•Ό ν•˜λ©°, 쀑간에 μ„œλ²„κ°€ μž₯μ• κ°€ λ‚˜λ©΄ μ²˜μŒλΆ€ν„° ν•΄μ•Όν•œλ‹€.

λ¬΄μƒνƒœλŠ” 응닡 μ„œλ²„λ₯Ό 바꿔도 응닡이 κ°€λŠ₯ν•˜λ©° μ΄λŠ” 쀑간에 μ„œλ²„κ°€ μž₯μ• κ°€ λ‚˜λ„ λ‹€λ₯Έ 응닡 μ„œλ²„κ°€ 계속할 수 μžˆλ‹€. μ΄λŠ” λ¬΄ν•œν•œ μ„œλ²„ 증섀이 κ°€λŠ₯μΌ€ ν•œλ‹€. (μ„œλ²„μ˜ μˆ˜ν‰ ν™•μž₯(Scale Out)이 λ†’λ‹€ )

 

ν•˜μ§€λ§Œ 이것도 ν•œκ³„κ°€ μžˆλ‹€. λͺ¨λ“  것을 λ¬΄μƒνƒœλ‘œ μ„€κ³„ν•˜λŠ” 것은 νž˜λ“€κΈ° λ•Œλ¬Έμ΄λ‹€.

κ·Έλž˜μ„œ μƒνƒœ μœ μ§€λŠ” μ΅œμ†Œν•œ 만으둜 μ‚¬μš©ν•˜λ©° μ΅œλŒ€ν•œ λ¬΄μƒνƒœ 성을 μœ μ§€ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν•œλ‹€. 

보톡 μƒνƒœ μœ μ§€ κ°€μž₯ λŒ€ν‘œμ μΈ μ˜ˆλŠ” λ‘œκ·ΈμΈν•œ μ‚¬μš©μžμ˜ 경우 둜그인 μƒνƒœλ₯Ό μ„œλ²„μ— μœ μ§€ν•˜λŠ” 것이닀. 일반적으둜 μ΄λŠ” λΈŒλΌμš°μ € 쿠킀와 μ„œλ²„ μ„Έμ…˜λ“±μ„ μ‚¬μš©ν•œλ‹€. 

 

그리고 ν•œκ°€μ§€ 단점이 μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 맀번 보내야 ν•˜λŠ” μ •λ³΄λŸ‰μ΄ 더 λ§Žλ‹€λŠ” 단점이 μžˆλ‹€. 

 

πŸ“λΉ„ μ—°κ²°μ„± (Connectionless)

연결을 μœ μ§€ν•˜λŠ” λ™μ•ˆ μ„œλ²„λŠ” 이λ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄ μ„œλ²„ μžμ›μ„ μ†Œλͺ¨ν•˜κ²Œ λœλ‹€.

연결을 μœ μ§€ν•˜μ§€ μ•ŠμœΌλ©΄ ν•„μš”ν•œ κ²ƒλ§Œμ„ μš”μ²­ν•˜κ³  응닡받고 λ‚˜λ©΄ 연결을 λŠμ–΄ μ΅œμ†Œν•œμ˜ μžμ›μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

 

* HTTPλŠ”?

  • HTTPλŠ” 기본이 연결을 μœ μ§€ν•˜μ§€ μ•ŠλŠ” λͺ¨λΈ
  • 일반적으둜 초 λ‹¨μœ„μ˜ μ΄ν•˜μ˜ λΉ λ₯Έ μ†λ„λ‘œ 응닡
  • μ„œλ²„ μžμ›μ„ 맀우 효율적으둜 μ‚¬μš©

* λΉ„ μ—°κ²°μ„±μ˜ ν•œκ³„λŠ”?

  • TCP/IP 연결을 계속 μƒˆλ‘œ λ§Ίμ–΄μ•Όν•œλ‹€. μ—°κ²°μ‹œ 3 way handshake 단계가 λ°˜λ³΅λ˜λ―€λ‘œ 그만큼 μ‹œκ°„μ΄ μΆ”κ°€λœλ‹€
  • μ›Ή λΈŒλΌμš°μ €λ‘œ μ‚¬μ΄νŠΈ μš”μ²­ν•˜λ©΄ 수 λ§Žμ€ μžμ›λ“€μ΄ ν•œκΊΌλ²ˆμ— λ‹€μš΄λ°›μ•„μ§€λŠ” 데, 쀑간에 끊기면 μ²˜μŒλΆ€ν„° λ‹€μ‹œ λ‹€ λ‹€μš΄λ°›μ•„μ•Όν•œλ‹€. 
  • μ§€κΈˆμ€ HTTP 지속 μ—°κ²°(Persistent Connections)둜 문제 ν•΄κ²° (μ—°κ²° μœ μ§€ λ λ•Œ
  • HTTP/2와 HTTP/3μ—μ„œ μ΅œμ ν™”
더보기

**** HTTP 지속 μ—°κ²° 

 

μžμ› ν•˜λ‚˜λ₯Ό μš”μ²­ν–ˆμ„ λ•Œ 이와 λ¬Άμ—¬μžˆλŠ” λͺ¨λ“  μžμ›μ„ μš”μ²­ν•˜κΈ° μœ„ν•΄ 연결을 μœ μ§€ν•œ μƒνƒœ

ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­ λ˜λŠ” TimeOut μ „κΉŒμ§€λŠ” 연결이 μ—΄λ €μžˆμ–΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ μžμ›μ„ μ—°μ†μ μœΌλ‘œ μš”μ²­ν•  수 있고 이에 μ„œλ²„λŠ” μ—°μ†μ μœΌλ‘œ 응닡할 수 μžˆλ‹€ (νŒŒμ΄ν”„ 라이닝)

μ—°κ²° μ‹œλ„ νšŸμˆ˜κ°€ 쀄어듀어 νš¨μœ¨μ μ΄λ‹€.

HTTP/1.1 κΈ°μ€€ 달리 λͺ…μ‹œ λ˜μ–΄μžˆμ§€ μ•ŠμœΌλ©΄ λͺ¨λ“  연결은 지속 μ—°κ²°λ‘œ κ°„μ£Όλœλ‹€. μ„œλ²„λ§ˆλ‹€ Timout이 μ‘΄μž¬ν•œλ‹€.

 

πŸ“HTTP λ©”μ‹œμ§€

 

* HTTP λ©”μ‹œμ§€ ꡬ쑰 μ„€λͺ…

 

- HTTP μ‹œμž‘λΌμΈ

μš”μ²­
  •     HTTP λ©”μ„œλ“œ : μ’…λ₯˜ : GET, POST, PUT, DELETE λ“±μœΌλ‘œ μ„œλ²„κ°€ μˆ˜ν–‰ν•΄μ•Ό ν•  λ™μž‘ μ§€μ •
  •     μš”μ²­ λŒ€μƒ : /μ ˆλŒ€κ²½λ‘œ[?쿼리]
  •     HTTP-version
응닡
  •     HTTP-version
  •     HTTP μƒνƒœμ½”λ“œ :  μš”μ²­ 성곡, μ‹€νŒ¨λ₯Ό λ‚˜νƒ€λƒ„
  •     이유 문ꡬ : μ‚¬λžŒμ΄ 이해할 수 μžˆλŠ” 짧은 μƒνƒœ μ½”λ“œ μ„€λͺ… κΈ€

- HTTP 헀더

  •   HTTP 전솑에 ν•„μš”ν•œ λͺ¨λ“  뢀가정보λ₯Ό λ‹΄λŠ”λ‹€.
  • ν‘œμ€€ 헀더가 μ‘΄μž¬ν•œλ‹€.
  • ν•„μš”μ‹œ μž„μ˜ 헀더가 μΆ”κ°€ κ°€λŠ₯ν•˜λ‹€.  

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

  • μ‹€μ œ 전솑할 데이터
  • byte둜 ν‘œν˜„ν•  수 μžˆλŠ” λͺ¨λ“  데이터 전솑 κ°€λŠ₯

* HTTP μš”μ²­ λ©”μ‹œμ§€ 예제

GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com

* HTTP 응닡 λ©”μ‹œμ§€ 예제

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423

<html>
    <body>...</body>
</html>

 


* HTTP λ©”μ‹œμ§€ ꡬ쑰둜 μ˜ˆμ‹œ νŒŒμ•…

 

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

start-line μ‹œμž‘ 라인 GET /search?q=hello&hl=ko HTTP/1.1
header 헀더 Host: www.google.com
empty line 곡백 라인 (CRLF)  
message body  

μ‹œμž‘ 라인 :

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

HTTP 헀더 :

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

- 응닡 λ©”μ‹œμ§€

start-line μ‹œμž‘ 라인 HTTP/1.1 200 OK
header 헀더 Content-Type: text/html;charset=UTF-8
Content-Length: 3423
empty line 곡백 라인 (CRLF)  
message body <html>
    <body>...</body>
</html>

μ‹œμž‘ 라인 :

HTTP-version SP(곡백) status-code SP(곡백) reason-phrase CRLF
HTTP/1.1   200   OK  

HTTP 헀더 :

field-name: OWS(띄어쓰기 ν—ˆμš©) field-value OWS(띄어쓰기 ν—ˆμš©)
Content-Type:
Content-Length:
  text/html;charset=UTF-8
3423
 

 

 

 

 

+ Recent posts