Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🟒 HTTP κΈ°λ³Έ, 역사, ν΄λΌμ΄μ–ΈνŠΈ μ„œλ²„ ꡬ쑰, λ¬΄μƒνƒœ ν”„λ‘œν† μ½œ, λΉ„ μ—°κ²°μ„±, HTTP λ©”μ‹œμ§€ #84

Open
leemember opened this issue Mar 16, 2023 · 0 comments

Comments

@leemember
Copy link
Owner

leemember commented Mar 16, 2023

πŸ€μ§€κΈˆμ€ λͺ¨λ“  것을 HTTP ν”„λ‘œν† μ½œμ— λ‹΄μ•„μ„œ μ „μ†‘ν•©λ‹ˆλ‹€.
HTTPλŠ” ν•˜μ΄νΌν…μŠ€νŠΈ 트랜슀퍼 ν”„λ‘œν† μ½œ μ΄λž€ λœ»μž…λ‹ˆλ‹€.

✨λͺ¨λ“  κ²ƒμ΄λž€ ?

  • HTML, TEXT
  • 이미지, μŒμ„±, μ˜μƒ, 파일
  • JSON, XML(API)
  • 거의 λͺ¨λ“  ν˜•νƒœμ˜ 데이터 전솑 κΈ°λŠ₯
    μ„œλ²„κ°„μ— 데이터λ₯Ό μ£Όκ³  받을 λ•Œλ„ λŒ€λΆ€λΆ„ HTTP μ‚¬μš©

πŸ”₯ κ²°λ‘ 

μ§€κΈˆμ€ HTTP μ‹œλŒ€λ‹€.

TCPλ₯Ό 직접 μ—°κ²°ν•΄μ„œ ν•˜λŠ” κ²½μš°μ—λŠ” κ²Œμž„μ„œλ²„λ‚˜ νŠΉμˆ˜ν•œκ²½μš°μ—λ§Œ ν•œλ‹€.
심지어 μš”μ¦˜ λͺ¨λ°”일 κ²Œμž„ 같은 κ²½μš°μ—λ„ HTTP둜 ν†΅μ‹ ν•˜λŠ” ꡬ쑰둜 κ°œλ°œν•œλ‹€.
HTTP λΌλŠ”κ²Œ μ‹œκ°„μ΄ 흐λ₯΄λ©΄μ„œ 거의 λͺ¨λ“  것을 전솑할 수 μžˆλ„λ‘ λ°”λ€Œμ—ˆλ‹€.

πŸ‘€ HTTP의 역사

  • HTTP/0.9 1991λ…„ : GET λ©”μ„œλ“œλ§Œ 지원, HTTP 헀더X
  • HTTP/1.0 1996λ…„ : λ©”μ„œλ“œ, 헀더 μΆ”κ°€
  • ✨HTTP/1.1 1997λ…„ : κ°€μž₯ 많이 μ‚¬μš©ν•˜κ³  μš°λ¦¬μ—κ²Œ κ°€μž₯ μ€‘μš”ν•œ 버전이닀 ✨
  • HTTP/2 2015λ…„ : μ„±λŠ₯ κ°œμ„ 
  • HTTP/3 진행쀑 : TCP λŒ€μ‹ μ— UDPλ₯Ό μ‚¬μš©, μ„±λŠ₯ κ°œμ„ 

πŸ’» 기반 ν”„λ‘œν† μ½œ

TCP : HTTP/1.1, HTTP/2
UDP : HTTP/3
ν˜„μž¬ HTTP/1.1 주둜 μ‚¬μš©ν•œλ‹€.
HTTP/2, HTTP/3 도 점점 μ¦κ°€ν•˜λŠ” μΆ”μ„Έλ‹€.

근데 μš°λ¦¬λŠ” HTTP/1만 λ°°μ›Œλ†“μœΌλ©΄ λœλ‹€. μ™œλƒλ©΄ HTTP/2λž‘ HTTP/3λŠ” μ„±λŠ₯κ°œμ„ λ§Œ ν•œ 것이기 λ•Œλ¬Έ!

ν”„λ‘œν† μ½œ ν™•μΈν•˜λ €λ©΄ 개발자 λ„κ΅¬μ—μ„œ μ΄λ ‡κ²Œ ν”„λ‘œν† μ½œμ„ μ„ΈνŒ…ν•΄μ£Όλ©΄ λœλ‹€. HTTP 1은 λ‹€ μ“°κ³ μžˆκ³  HTTP2 μš”μ¦˜ 많이 μ‚¬μš©ν•˜λŠ” 쀑이닀.

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

  • Request / Response ꡬ쑰
  • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ— μš”μ²­μ„ 보내고, 응닡을 λŒ€κΈ°ν•œλ‹€.
  • μ„œλ²„κ°€ μš”μ²­μ— λŒ€ν•œ κ²°κ³Όλ₯Ό λ§Œλ“€μ–΄μ„œ μ‘λ‹΅ν•œλ‹€.

ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ™€ κ°œλ…μ μœΌλ‘œ 뢄리λ₯Ό ν•œλ‹€.
λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ΄λž‘ λ°μ΄ν„°λŠ” μ„œλ²„μ— λ‹€ λ°€μ–΄λ„£λŠ”λ‹€.
ν΄λΌμ΄μ–ΈνŠΈλŠ” UI 그리고 μ‚¬μš©μ„±μ—λ§Œ 집쀑을 ν•œλ‹€.

μ΄λ ‡κ²Œν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„κ°€ 각각 λ…λ¦½μ μœΌλ‘œ 진화할 μˆ˜κ°€ μžˆλ‹€.

😐 λ¬΄μƒνƒœ ν”„λ‘œν† μ½œ (Stateless)

- μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό 보쑴 ν•˜μ§€ μ•ŠλŠ”λ‹€.

(Stateful μƒνƒœλ₯Ό μœ μ§€ν•œλ‹€λŠ” 것이고 Stateless μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것이닀.)

μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ μ„€λͺ…

πŸ”₯ Statefull

  • 상황1. λ…ΈνŠΈλΆμ„ κ΅¬λ§€ν•˜λŠ”λ° 직원1ν•œν…Œ λ…ΈνŠΈλΆ 2κ°œμ™€ 가격이 μ–Όλ§ˆμΈμ§€ μ•Œκ³  μ‹ μš©μΉ΄λ“œλ‘œ 거래λ₯Ό ν•œλ‹€.
  • 상황2. λ…ΈνŠΈλΆμ„ κ΅¬λ§€ν•˜λŠ”λ° 직원2ν•œν…Œ μ£Όμ–΄(λ…ΈνŠΈλΆ)λ₯Ό μ•ˆλ§ν•˜κ³  2개 κ΅¬λ§€ν•œλ‹€ λ§ν•˜κ³ , 직원 3ν•œν…Œ μ‹ μš©μΉ΄λ“œλ‘œ κ΅¬λ§€ν•˜κ² λ‹€κ³  ν•œλ‹€. 그럼 직원 2와 직원 3이 무엇을 μ–Όλ§ˆμ— μ‚¬λŠ”μ§€λ₯Ό λͺ¨λ₯Έλ‹€.

상황1처럼 직원 ν•œ λͺ…ν•˜κ³ λ§Œ κ±°λž˜κ°€ κ°€λŠ₯ν•˜λ‹€λŠ” 것. 상황2λŠ” 직원듀이 contextλ₯Ό λͺ¨λ₯΄λ‹ˆκΉŒ 상황 μž₯μ• κ°€ λ°œμƒν•œλ‹€. ν•˜μ§€λ§Œ Stateless κ²½μš°μ—λŠ”

πŸ”₯ Stateless
μœ„μ— 상황2처럼 λ…ΈνŠΈλΆμ„ κ΅¬λ§€ν•˜λŠ”λ° 직원2ν•œν…Œ μ£Όμ–΄(λ…ΈνŠΈλΆ)λ₯Ό μ•ˆλ§ν•˜κ³  2개 κ΅¬λ§€ν•œλ‹€ λ§ν•˜κ³ , 직원 3ν•œν…Œ μ‹ μš©μΉ΄λ“œλ‘œ κ΅¬λ§€ν•˜κ² λ‹€κ³  ν•˜λ©΄ 직원 2와 직원 3이 λ…ΈνŠΈλΆμ„ 2개λ₯Ό μ‹ μš©μΉ΄λ“œλ‘œ ꡬ맀 ν•˜κ² λ‹€κ³  이미 λ‹€ μ•„λŠ” μƒνƒœλ‹€. 이게 λ°”λ‘œ Stateless의 μž₯점이닀. ν™•μž₯성이 λ†’λ‹€λŠ” 것.

  • **μƒνƒœ μœ μ§€ **: 쀑간에 λ‹€λ₯Έ μ μ›μœΌλ‘œ λ°”λ€Œλ©΄ μ•ˆλœλ‹€. (쀑간에 λ‹€λ₯Έ μ μ›μœΌλ‘œ λ°”λ€” λ•Œ μƒνƒœ 정보λ₯Ό λ‹€λ₯Έ μ μ›μ—κ²Œ 미리 μ•Œλ €μ€˜μ•Όν•œλ‹€.)
  • λ¬΄μƒνƒœ : 쀑간에 λ‹€λ₯Έ μ μ›μœΌλ‘œ λ°”λ€Œμ–΄λ„ λœλ‹€.
  • κ°‘μžκΈ° 고객이 증가해도 점원을 λŒ€κ±° νˆ¬μž…ν•  수 μžˆλ‹€.
  • κ°‘μžκΈ° ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ 증가해도 μ„œλ²„λ₯Ό λŒ€κ±° νˆ¬μž…ν•  수 μžˆλ‹€.
  • λ¬΄μƒνƒœλŠ” 응닡 μ„œλ²„λ₯Ό μ‰½κ²Œ λ°”κΏ€ 수 μžˆλ‹€. -> λ¬΄ν•œν•œ μ„œλ²„ 증섀 κ°€λŠ₯

- μž₯점 : μ„œλ²„ ν™•μž₯μ„± λ†’μŒ (μŠ€μΌ€μΌ 아웃)

- 단점 : ν΄λΌμ΄μ–ΈνŠΈκ°€ μΆ”κ°€ 데이터 전솑

이처럼 **Statefull(μƒνƒœμœ μ§€)**은 쀑간에 μ„œλ²„κ°€ μž₯μ• λ‚˜λ©΄ μž‘μ—…μ„ λ‹€μ‹œ ν•΄μ•Όν•œλ‹€.
Stateless(λ¬΄μƒνƒœ)λŠ” 아무 μ„œλ²„λ‚˜ ν˜ΈμΆœν•΄λ„ λœλ‹€. μ²˜μŒλΆ€ν„° ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μš”μ²­μ„ ν•  λ•Œ 데이터λ₯Ό λ‹€ λ‹΄μ•„μ„œ μš”μ²­ν•œλ‹€.
그러면 μ„œλ²„λŠ” μƒνƒœλ₯Ό λ³΄κ΄€ν•˜μ§€ μ•Šκ³  κ·Έλƒ₯ μ‘λ‹΅λ§Œ ν•΄μ€€λ‹€.

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„1에 μš”μ²­μ„ ν•˜κ³  μ„œλ²„1에 μž₯μ• κ°€ 생기면 μ€‘κ³„μ„œλ²„κ°€ λ‹€λ₯Έ μ„œλ²„2둜 λ„˜κ²¨μ€€λ‹€. κ·Έλž˜μ„œ ν™•μž₯성이 μ’‹λ‹€.

❗ μ‹€λ¬΄ν•œκ³„

  • λͺ¨λ“  것을 λ¬΄μƒνƒœλ‘œ 섀계 ν•  수 μžˆλŠ” κ²½μš°λ„ 있고 μ—†λŠ” κ²½μš°λ„ μžˆλ‹€.

  • λ¬΄μƒνƒœ : 둜그인이 ν•„μš” μ—†λŠ” λ‹¨μˆœν•œ μ„œλΉ„μŠ€ μ†Œκ°œ ν™”λ©΄

  • μƒνƒœ μœ μ§€ : 둜그인

  • λ‘œκ·ΈμΈν•œ μ‚¬μš©μžμ˜ 경우 둜그인 ν–ˆλ‹€λŠ” μƒνƒœλ₯Ό μ„œλ²„μ— μœ μ§€

  • 일반적으둜 λΈŒλΌμš°μ € 쿠킀와 μ„œλ²„ μ„Έμ…˜λ“±μ„ μ‚¬μš©ν•΄μ„œ μƒνƒœ μœ μ§€ν•œλ‹€.

  • μƒνƒœ μœ μ§€λŠ” μ΅œμ†Œν•œλ§Œ μ‚¬μš©ν•˜λŠ”κ²Œ μ’‹λ‹€. (λ‘œκ·ΈμΈκ°™μ€ 경우)

πŸ”— λΉ„μ—°κ²°μ„±

μš”μ²­μ„ν•˜κ³  응닡을 ν•˜λ©΄ TCP/IP 연결을 μ’…λ£Œν•΄ 버린닀.

μž₯점

  • HTTPλŠ” 기본이 연결을 μœ μ§€ν•˜μ§€ μ•ŠλŠ” λͺ¨λΈ
  • 일반적으둜 초 λ‹¨μœ„μ˜ μ΄ν•˜μ˜ λΉ λ₯Έ μ†λ„λ‘œ 응닡
  • 1μ‹œκ°„ λ™μ•ˆ 수천λͺ…이 μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•΄λ„ μ‹€μ œ μ„œλ²„μ—μ„œ λ™μ‹œμ— μ²˜λ¦¬ν•˜λŠ” μš”μ²­μ€ μˆ˜μ‹­κ°œ μ΄ν•˜λ‘œ 맀우 μž‘λ‹€.
    (예) μ›Ή λΈŒλΌμš°μ €μ—μ„œ 계속 μ—°μ†ν•΄μ„œ 검색 λ²„νŠΌμ„ λˆ„λ₯΄μ§€λŠ” μ•ŠλŠ”λ‹€.
  • μ„œλ²„ μžμ›μ„ 맀우 효율적으둜 μ‚¬μš©ν•  수 있음

단점

  1. TCP/IP 연결을 μƒˆλ‘œ λ§Ίμ–΄μ•Ό ν•œλ‹€. 즉, 3way handshake μ‹œκ°„ μΆ”κ°€
  2. μ›Ή λΈŒλΌμš°μ €λ‘œ μ‚¬μ΄νŠΈλ₯Ό μš”μ²­ν•˜λ©΄ HTML 뿐만 μ•„λ‹ˆλΌ μžλ°”μŠ€ν¬λ¦½νŠΈ, css, μΆ”κ°€ 이미지 λ“±λ“± μˆ˜λ§Žμ€ μžμ›μ΄ ν•¨κ»˜ λ‹€μš΄λ‘œλ“œλœλ‹€.
  3. μ§€κΈˆμ€ HTTP 지속 μ—°κ²°λ‘œ 문제 ν•΄κ²°
  4. HTTP/2, HTTP/3μ—μ„œ 더 λ§Žμ€ μ΅œμ ν™”κ°€ ν•„μš”

⭐ HTTP λ©”μ‹œμ§€ (제일 μ€‘μš”) ⭐

μ‹œμž‘λΌμΈ, 헀더, 곡백(이 뢀뢄은 무쑰건 μžˆμ–΄μ•Όν•œλ‹€.), λ©”μ‹œμ§€λ°”λ”” μ΄λ ‡κ²Œ κ΅¬μ„±λ˜μ–΄μžˆλ‹€.

HTTP μš”μ²­ λ©”μ‹œμ§€μ™€ HTTP 응닡 λ©”μ‹œμ§€λ‹€.

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

GET 검색 / path μ£Όμ†Œ / HTTP 버전 (μ‹œμž‘λΆ€λΆ„)
λ°”λ””μ—λŠ” μš”μ²­ν•  게 μ—†μœΌλ©΄ 곡백으둜 λ„£κ³  μš”μ²­ν•˜λ©΄ λœλ‹€.

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

html에 데이터가 λ“€μ–΄μ˜¨λ‹€.

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

start-line = μš”μ²­ 라인 request-line / 응닡 라인 status-line
μ‹œμž‘ 라인은 μš”μ²­ λ©”μ‹œμ§€μ™€ μƒνƒœλΌμΈμ΄ μžˆμŠ΅λ‹ˆλ‹€.
μš”μ²­λΌμΈ(request-line)μ—λŠ” λ©”μ„œλ“œμ™€ μš”μ²­ νƒ€κ²Ÿ, 그리고 HTTP 버전이 λ“€μ–΄κ°€μ•Όν•œλ‹€.
request-line = method SP(곡백) request-target SP(곡백) HTTP-version CRLF

β­μš”μ²­ λ©”μ‹œμ§€- HTTP λ©”μ„œλ“œ ⭐ μ§„μ§œ μ€‘μš”

  • μ’…λ₯˜ : GET(λ¦¬μ†ŒμŠ€ 쑰회), POST(μš”μ²­ λ‚΄μ—­ 처리), PUT, DELETE(μ‚­μ œ 뢀탁)
  • μ„œλ²„κ°€ μˆ˜ν–‰ν•΄μ•Ό ν•  λ™μž‘ 지정 (GET: λ¦¬μ†ŒμŠ€μ‘°νšŒ / POST: μš”μ²­ λ‚΄μ—­ 처리)

μš”μ²­ λ©”μ‹œμ§€ - μš”μ²­ λŒ€μƒ (/search?q=hello&hl=ko)

예) GET //search?q=hello&hl=ko HTTP/1.1
HOST: www.google.com
μš”μ²­ λ©”μ‹œμ§€ - HTTP Version

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

status-line = HTTP-version SP(곡백) status-code SP(곡백) reason-phrase CRLF

⭐응닡 λ©”μ‹œμ§€ μƒνƒœμ½”λ“œβ­ (μ—„μ²­ μ€‘μš”)

  • μš”μ²­ 성곡, μ‹€νŒ¨λ₯Ό λ‚˜νƒ€λ‚Έλ‹€

  • 200 : 성곡

  • 400 : ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ 였λ₯˜

  • 500 : μ„œλ²„ λ‚΄λΆ€ 였λ₯˜

OK : μ‚¬λžŒμ΄ 이해할 수 μžˆλŠ” 짧은 μƒνƒœ μ½”λ“œ μ„€λͺ… κΈ€
곡식 μŠ€νŽ™ : HTTP-message = start-line*(header-field CRLF)CRLF[message-body]
μ—¬κΈ°μ„œ CRLFλŠ” enter ν‘œμ‹œλ‹€.

HTTP 헀더

  • header-field = field-name ":" OWS field-value OWS (OWS:띄어쓰기 ν—ˆμš©! 띄어써도 되고 μ•ˆ 띄어도 λœλ‹€.)
  • field-name은 λŒ€μ†Œλ¬Έμž ꡬ문 μ—†μŒ
    ex)Host:www.google.com

HTTP ν—€λ”μ˜ μš©λ„

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

  • ν‘œμ€€ 헀더가 λ„ˆλ¬΄ λ§Žλ‹€

  • ν•„μš”μ‹œ μž„μ˜μ˜ 헀더 μΆ”κ°€ κ°€λŠ₯
    helloworld: hihi

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

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

πŸ™‚ λ‹¨μˆœν•¨ ν™•μž₯ κ°€λŠ₯

  • HTTPλŠ” λ‹¨μˆœν•˜λ‹€. μŠ€νŽ™λ„ μ½μ–΄λ³Όλ§Œ ν•˜λ‹€.
    μ‹œμž‘μ€„
    머리
    λ°”λ””

μ΄λ ‡κ²Œ κ΅¬λΆ„λœλ‹€.

  • HTTP λ©”μ‹œμ§€λ„ 맀우 λ‹¨μˆœν•˜λ‹€.

  • 크게 μ„±κ³΅ν•˜λŠ” ν‘œμ€€ κΈ°μˆ μ€ λ‹¨μˆœν•˜μ§€λ§Œ ν™•μž₯ κ°€λŠ₯ν•œ 기술

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant