μ•Œμ•„λ³Ό λ‚΄μš©

  1. HTTP νŠΉμ„±
  2. HTTP λ©”μ‹œμ§€ ꡬ쑰
  3. HTTP λ©”μ„œλ“œ
  4. HTTP μƒνƒœ μ½”λ“œ

HTTP의 νŠΉμ„±

  • HTTP (Hypertext Transfer Protocol) : μ‘μš© κ³„μΈ΅μ—μ„œ 정보λ₯Ό μ£Όκ³ λ°›λŠ” 데 μ‚¬μš©λ˜λŠ” ν”„λ‘œν† μ½œ

볡슡 : μ§€κΈˆκΉŒμ§€ 배운 계측별 ν”„λ‘œν† μ½œ

  1. 물리 계측, 데이터 링크 계측 β†’ 이더넷
  2. λ„€νŠΈμ›Œν¬ 계측 β†’ IP (인터넷 ν”„λ‘œν† μ½œ)
  3. 전솑 계측 β†’ TCP, UDP
  4. μ‘μš© 계측 β†’ HTTP
νŠΉμ„± 1 : μš”μ²­ - 응닡 기반 ν”„λ‘œν† μ½œ
  • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„κ°€ μ„œλ‘œ HTTP μš”μ²­ λ©”μ‹œμ§€μ™€ HTTP 응닡 λ©”μ‹œμ§€λ₯Ό μ£Όκ³ λ°›λŠ” ꡬ쑰둜 λ™μž‘
    • ν΄λΌμ΄μ–ΈνŠΈ : HTTP μš”μ²­ λ©”μ‹œμ§€λ‘œ μ„œλ²„μ˜ μžμ› μš”μ²­
    • μ„œλ²„ : HTTP 응닡 λ©”μ‹œμ§€λ‘œ μš”μ²­λ°›μ€ μžμ›μ— λŒ€ν•΄ 응닡
  • HTTP μš”μ²­ λ©”μ‹œμ§€μ™€ HTTP 응닡 λ©”μ‹œμ§€λŠ” ν˜•νƒœκ°€ 닀름
νŠΉμ„± 2 : λ―Έλ””μ–΄ 독립적 ν”„λ‘œν† μ½œ
  • HTTPλŠ” μžμ›μ˜ νŠΉμ„±μ„ μ œμ–΄ν•˜μ§€ μ•Šκ³  μžμ›κ³Ό μƒν˜Έ μž‘μš© ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λ§Œ μ •μ˜
    • HTML, JPEG, PNG, JSON, XML, PDF λ“± λͺ¨λ‘ κ°€λŠ₯
  • λ―Έλ””μ–΄ νƒ€μž… (MIME1 νƒ€μž…) : HTTPμ—μ„œ μ£Όκ³ λ°›λŠ” μžμ›μ˜ μ’…λ₯˜
    • ν˜•νƒœ : νƒ€μž…/μ„œλΈŒνƒ€μž…;λ§€κ°œλ³€μˆ˜=κ°’
      • νƒ€μž… : 데이터 μœ ν˜•
      • μ„œλΈŒνƒ€μž… : μ£Όμ–΄μ§„ νƒ€μž…μ— λŒ€ν•œ μ„ΈλΆ€ μœ ν˜•
      • λ§€κ°œλ³€μˆ˜ : 뢀가적 μ„€λͺ… μœ„ν•΄ μ„ νƒμ μœΌλ‘œ μΆ”κ°€
        • type/html;charset=UTF-8 : HTML λ¬Έμ„œμ΄κ³  μ‚¬μš©λœ λ¬ΈμžλŠ” UTF-8둜 인코딩
    • 맀우 λ‹€μ–‘ν•˜λ©° ν•„μš”μ— 따라 μƒˆλ‘­κ²Œ 등둝 κ°€λŠ₯
    • λŒ€ν‘œμ μΈ νƒ€μž… - μ„œλΈŒνƒ€μž…
      • text - plain, html, css, javascript
      • image β€” png, jpeg, webp, gif
      • video - mp4, ogg, webm
      • audio - midi, wav
      • application - octet-stream, pdf, xml, json, x-www-form-urlencoded
      • multipart - form-data, encrypted
νŠΉμ„± 3 : Stateless ν”„λ‘œν† μ½œ
  • Stateless : μ„œλ²„κ°€ HTTP μš”μ²­μ„ 보낸 ν΄λΌμ΄μ–ΈνŠΈμ™€ κ΄€λ ¨λœ μƒνƒœ κΈ°μ–΅ν•˜μ§€ μ•ŠμŒ β†’ 독립적인 μš”μ²­μœΌλ‘œ κ°„μ£Ό
  • μ™œ stateless?
    • λ§Žμ€ ν΄λΌμ΄μ–ΈνŠΈμ™€ λ™μ‹œ μƒν˜Έ μž‘μš©ν•˜λŠ”λ° μƒνƒœ κΈ°μ–΅ν•˜λ©΄ λΆ€λ‹΄
    • μ—¬λŸ¬ μ„œλ²„λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμ„ 경우 μ„œλ²„ κ°„ μƒνƒœ 정보 κ³΅μœ λŠ” 볡작
    • ν•„μš”ν•œ 경우 μ–Έμ œλ“  μ„œλ²„ μΆ”κ°€ κ°€λŠ₯ν•΄μ„œ ν™•μž₯μ„± λ†’μŒ
    • 문제 생긴 μ„œλ²„ μ‰½κ²Œ ꡐ체 κ°€λŠ₯ν•΄μ„œ 견고성 λ†’μŒ
  • μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ” νŠΉμ„±μ„ λ³΄μ™„ν•˜κΈ° μœ„ν•œ λͺ‡ κ°€μ§€ 방법 있음
νŠΉμ„± 4 : 지속 μ—°κ²° ν”„λ‘œν† μ½œ
  • κ³Όκ±° HTML (HTML 1.0 μ΄ν•˜)λŠ” λΉ„μ—°κ²°ν˜• ν”„λ‘œν† μ½œ
    • 3-way handshake둜 TCP μ—°κ²° 수립 β†’ μš”μ²­, 응닡 β†’ μ—°κ²° μ’…λ£Œ
    • 좔가적인 μš”μ²­, μ‘λ‹΅ν•˜λ €λ©΄ TCP μž¬μ—°κ²°
  • 졜근 HTML (HTML 1.1 이상) : 지속 μ—°κ²° ν”„λ‘œν† μ½œ (keep-alive)
    • ν•˜λ‚˜μ˜ TCP μ—°κ²°μƒμ—μ„œ μ—¬λŸ¬ μš”μ²­, 응닡 주고받을 수 있음

HTTP λ©”μ‹œμ§€ ꡬ쑰

  • HTML 1.1 κΈ°μ€€
μ‹œμž‘ 라인 : HTTP μš”μ²­ λ©”μ‹œμ§€μΈ 경우 μš”μ²­ 라인, HTTP 응닡 λ©”μ‹œμ§€μΈ 경우 μƒνƒœ 라인
  • μš”μ²­ 라인
    • λ©”μ„œλ“œ : ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ˜ μžμ›μ— λŒ€ν•΄ μˆ˜ν–‰ν•  μž‘μ—…μ˜ μ’…λ₯˜
      • GET, POST, PUT, DELETE
    • μš”μ²­ λŒ€μƒ : HTTP μš”μ²­μ„ 보낼 μ„œλ²„μ˜ μžμ›
      • 보톡 URL λͺ…μ‹œ
      • http://www.example.com/hello?q=world인 경우 /hello?q=worldκ°€ μš”μ²­ λŒ€μƒ
      • ν•˜μœ„ 경둜 없어도 μš”μ²­ λŒ€μƒμ€ /둜 ν‘œκΈ°
    • HTTP 버전 : HTTP/<버전>의 ν˜•νƒœ
  • μƒνƒœ 라인
    • μƒνƒœ μ½”λ“œ : μš”μ²­μ— λŒ€ν•œ κ²°κ³Όλ₯Ό νŒλ‹¨ν•˜λŠ” μ„Έ 자리 μ •μˆ˜
    • 이유 ꡬ문 : μƒνƒœ μ½”λ“œμ— λŒ€ν•œ λ¬Έμžμ—΄ ν˜•νƒœμ˜ μ„€λͺ…
    • μ˜ˆμ‹œ
      • HTTP/1.1 200 OK
      • HTTP/1.1 404 Not Found
ν•„λ“œ 라인 : 0개 μ΄μƒμ˜ HTTP 헀더 λͺ…μ‹œ
  • HTTP 헀더 : 톡신에 ν•„μš”ν•œ λΆ€κ°€ 정보
  • 콜둠(:)을 κΈ°μ€€μœΌλ‘œ 헀더 이름과 ν•˜λ‚˜ μ΄μƒμ˜ 헀더 κ°’μœΌλ‘œ ꡬ성
λ©”μ‹œμ§€ λ³Έλ¬Έ : HTTP μš”μ²­ ν˜Ήμ€ 응닡 λ©”μ‹œμ§€μ—μ„œ 본문이 ν•„μš”ν•œ 경우 λͺ…μ‹œ
  • μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 수 있고 λ‹€μ–‘ν•œ μ½˜ν…μΈ  νƒ€μž…μ΄ μ‚¬μš©λ  수 있음

HTTP λ©”μ„œλ“œ

GET : μžμ›μ„ μŠ΅λ“ν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œ
  • μ›Ή λΈŒλΌμš°μ €λ₯Ό 톡해 μ‘°νšŒν•˜λŠ” λŒ€λΆ€λΆ„μ˜ μžμ›μ€ GET μš”μ²­μ— λŒ€ν•œ 응닡
  • μš”μ²­ λ©”μ‹œμ§€
    GET /index.html?name1=value1&name2=value2 HTTP/1.1
    Host: www.example.com
    Accept: *
    
    • μš”μ²­ λŒ€μƒ : 쿼리 λ¬Έμžμ—΄ 많이 μ‚¬μš©
    • Host 헀더 : μš”μ²­μ„ 보낼 호슀트 λͺ…μ‹œ
  • 응닡 λ©”μ‹œμ§€
    HTTP/1.1 200 OK
    Content-Type: text/html
    Content-Length: 1234
    
    <!DOCTYPE html>
    <html>
    <head>
    	<title>Example Page</title>
    </head>
    <body>
    	<h1>Hello,  World!</h1>
    </body>
    </html>
    
HEAD : GETκ³Ό λ™μΌν•˜λ‚˜, ν—€λ”λ§Œμ„ λ°›λŠ” λ©”μ„œλ“œ
  • 응닡 λ©”μ‹œμ§€μ— λ³Έλ¬Έ 포함 μ•ˆλ˜λŠ” 것이 GET과의 차이
POST : μ„œλ²„λ‘œ ν•˜μ—¬κΈˆ νŠΉμ • μž‘μ—…μ„ μ²˜λ¦¬ν•˜κ²Œλ” ν•˜λŠ” λ©”μ„œλ“œ
  • λ²”μš©μ„± 맀우 λ„“μŒ

    • λ§Žμ€ 경우 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μƒˆλ‘œμš΄ μžμ›μ„ μƒμ„±ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©
  • μš”μ²­ λ©”μ‹œμ§€ (κ²Œμ‹œκΈ€ μž‘μ„±)

    POST /posting HTTP/1.1
    Host: example.com
    ...
    
    {
    	"Id": 1,
    	"Title": "제λͺ©",
    	"Contents": "λ‚΄μš©"
    }
    
  • 응닡 λ©”μ‹œμ§€

    HTTP/1.1 201 Created
    Content-Type: application/json
    Content-Length: 100
    Date: Mon, 14 Oct 2024 16:35:00 PST
    Location: /posting/1
    
    {
    	"Id": 1,
    	"Title": "제λͺ©",
    	"Contents": "λ‚΄μš©"
    }
    
    • Location ν—€λ”λ‘œ μƒˆλ‘œ μƒμ„±λœ μžμ›μ˜ μœ„μΉ˜ 전달
PUT : μžμ›μ„ λŒ€μ²΄ν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œ
  • μš”μ²­ μžμ›μ΄ μ—†λ‹€λ©΄ μƒˆλ‘­κ²Œ 생성, μžˆλ‹€λ©΄ λŒ€μ²΄
PATCH : μžμ›μ— λŒ€ν•œ 뢀뢄적 μˆ˜μ •μ„ μœ„ν•œ λ©”μ„œλ“œ
  • PUTκ³Ό 달리 뢀뢄적 μˆ˜μ •
DELETE : μžμ›μ„ μ‚­μ œν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œ
  • μš”μ²­ λ©”μ‹œμ§€
    DELETE /texts/a.txt HTTP/1.1
    Host: example.com
    

API λ¬Έμ„œ

μ–΄λ–€ URL둜 μ–΄λ–€ μš”μ²­μ„ λ°›μ•˜μ„ λ•Œ μ„œλ²„λŠ” μ–΄λ–»κ²Œ 응닡할지 μ •λ¦¬ν•œ λ¬Έμ„œ

  • 같은 URL에 λŒ€ν•œ μš”μ²­μ΄λΌλ„ μ‚¬μš©λœ λ©”μ„œλ“œκ°€ λ‹€λ₯΄λ©΄ 각기 λ‹€λ₯Έ μš”μ²­
  • λ”°λΌμ„œ 이것을 μ„€κ³„ν•˜λŠ” 것은 개발자의 λͺ«

HTTP μƒνƒœ μ½”λ“œ : μš”μ²­μ— λŒ€ν•œ κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ„Έ 자리 μ •μˆ˜

200λ²ˆλŒ€: 성곡 μƒνƒœ μ½”λ“œ
  • 200 (OK) : μš”μ²­μ΄ μ„±κ³΅ν–ˆμŒ
  • 201 (Created) : μš”μ²­μ΄ μ„±κ³΅ν–ˆμœΌλ©°, μƒˆλ‘œμš΄ μžμ›μ΄ μƒμ„±λ˜μ—ˆμŒ
  • 202 (Accepted) : μš”μ²­μ„ 잘 λ°›μ•˜μœΌλ‚˜, 아직 μš”μ²­ν•œ μž‘μ—…μ„ 끝내지 μ•Šμ•˜μŒ
    • λŒ€μš©λŸ‰ 파일 μ—…λ‘œλ“œ μž‘μ—…, 배치 μž‘μ—… λ“±
  • 204 (No Content) : μš”μ²­μ΄ μ„±κ³΅ν–ˆμ§€λ§Œ, λ©”μ‹œμ§€ 본문으둜 ν‘œμ‹œν•  데이터가 μ—†μŒ
    • DELETE μš”μ²­ λ“±
300λ²ˆλŒ€: λ¦¬λ‹€μ΄λ ‰μ…˜2 μƒνƒœ μ½”λ“œ
  • λ™μž‘ 방식

    • 초기 μš”μ²­ : GET /old HTTP/1.1
    • 응닡 : HTTP/1.1 301 Moved Pemanently \n Location: /new
    • μž¬μš”μ²­ : GET /new HTTP/1.1
    • 응닡 : HTTP/1.1 200 OK
  • 영ꡬ적 λ¦¬λ‹€μ΄λ ‰μ…˜ : μžμ›μ΄ μ™„μ „νžˆ μƒˆλ‘œμš΄ 곳으둜 μ΄λ™ν•˜μ—¬ κ²½λ‘œκ°€ 영ꡬ적으둜 μž¬μ§€μ •

    • 301 (Moved Permanently) : 영ꡬ적 λ¦¬λ‹€μ΄λ ‰μ…˜; μž¬μš”μ²­ λ©”μ„œλ“œ 변경될 수 있음
      • μ²˜μŒμ—λŠ” GET, λ‘λ²ˆμ§Έ μž¬μš”μ²­μ€ POSTκ°€ 될 μˆ˜λ„ 있음
    • 308 (Permanent Redirect) : 영ꡬ적 λ¦¬λ‹€μ΄λ ‰μ…˜; μž¬μš”μ²­ λ©”μ„œλ“œ λ³€κ²½λ˜μ§€ μ•ŠμŒ
  • μΌμ‹œμ  λ¦¬λ‹€μ΄λ ‰μ…˜ : μžμ›μ˜ μœ„μΉ˜ μž„μ‹œλ‘œ λ³€κ²½ ν˜Ήμ€ μž„μ‹œλ‘œ μ‚¬μš©ν•  URL이 ν•„μš”ν•œ κ²½μš°μ— μ‚¬μš©

    • 302 (Found) : μΌμ‹œμ  λ¦¬λ‹€μ΄λ ‰μ…˜; μž¬μš”μ²­ λ©”μ„œλ“œ 변경될 수 있음
    • 303 (See Other) : μΌμ‹œμ  λ¦¬λ‹€μ΄λ ‰μ…˜; μž¬μš”μ²­ λ©”μ„œλ“œ GET으둜 λ³€κ²½
    • 307 (Temporary Redirect) : μΌμ‹œμ  λ¦¬λ‹€μ΄λ ‰μ…˜; μž¬μš”μ²­ λ©”μ„œλ“œ λ³€κ²½λ˜μ§€ μ•ŠμŒ
  • μš”μ²­μ„ λ‹€λ₯Έ URL둜 μ΄λ™μ‹œν‚¬ μˆ˜λ„ 있고 β€˜μΊμ‹œβ€™λ‘œ μ΄λ™μ‹œν‚¬ μˆ˜λ„ 있음

    • 304 (Not Modified) κ°€ μΊμ‹œ κ΄€λ ¨ μƒνƒœ μ½”λ“œ
    • μΊμ‹œ λΆ€λΆ„μ—μ„œ μ„€λͺ…
400λ²ˆλŒ€: ν΄λΌμ΄μ–ΈνŠΈ μ—λŸ¬ μƒνƒœ μ½”λ“œ
  • 400 (Bad Request) : ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ 잘λͺ»λ˜μ—ˆμŒ
  • 401 (Unauthorized) : μš”μ²­ν•œ μžμ›μ— λŒ€ν•œ μœ νš¨ν•œ 인증이 μ—†μŒ ^3109ad
    • μ„œλ²„λŠ” 응닡 λ©”μ‹œμ§€μ— WWW-Authenticate 헀더λ₯Ό 톡해 인증 방법을 μ•Œλ €μ€˜μ•Ό 함
  • 403 (Forbidden) : μš”μ²­μ΄ μ„œλ²„μ— μ˜ν•΄ 거뢀됨
    • μ ‘κ·Ό κΆŒν•œμ΄ 없을 경우
  • 404 (Not Found) : μš”μ²­λ°›μ€ μžμ›μ„ 찾을 수 μ—†μŒ
  • 405 (Method Not Allowed) : μš”μ²­ν•œ λ©”μ„œλ“œλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŒ
500λ²ˆλŒ€: μ„œλ²„ μ—λŸ¬ μƒνƒœ μ½”λ“œ
  • 500 (Internal Server Error) : μš”μ²­μ„ μ²˜λ¦¬ν•  수 μ—†μŒ
  • 502 (Bad Gateway) : 쀑간 μ„œλ²„μ˜ 톡신 였λ₯˜
    • 보톡 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ μ‚¬μ΄μ—λŠ” κ²Œμ΄νŠΈμ›¨μ΄λ₯Ό λΉ„λ‘―ν•œ μ—¬λŸ¬ 쀑간 μ„œλ²„ 쑴재
  • 503 (Service Unavailable) : ν˜„μž¬λŠ” μš”μ²­μ„ μ²˜λ¦¬ν•  수 μ—†μœΌλ‚˜ μΆ”ν›„ κ°€λŠ₯ν•  μˆ˜λ„ 있음 ^0a6cae
    • μ„œλ²„ κ³ΌλΆ€ν•˜ ν˜Ήμ€ μΌμ‹œμ μΈ 점검 μƒνƒœμΈ 경우 λ°œμƒ

HTTP의 λ°œμ „

  1. HTTP/0.9
  • 초창기 버전
  • GET만 μ‚¬μš© κ°€λŠ₯, μš”μ²­ λ©”μ‹œμ§€ ν•œ μ€„λ‘œ ꡬ성
  • 헀더 미지원
  1. HTTP/1.0
  • HEAD, POST λ“± 지원
  • 헀더 지원
  • 지속 μ—°κ²° 미지원
  1. HTTP/1.1
  • 지속 μ—°κ²° 곡식 지원
  • νŒŒμ΄ν”„λΌμ΄λ‹ 지원 (νŠΉμ • μš”μ²­μ— λŒ€ν•œ 응닡 μˆ˜μ‹ λ˜κΈ° μ „ λ‹€μŒ μš”μ²­ 보낼 수 μžˆλŠ” κΈ°λŠ₯)
  • μ½˜ν…μΈ  ν˜‘μƒ κΈ°λŠ₯ λ“± λ‹€μ–‘ν•œ 편의 κΈ°λŠ₯ 및 헀더 μΆ”κ°€
  1. HTTP/2.0
  • 1.1 버전 보완 및 κ°œμ„ 
  • μ†‘μˆ˜μ‹  효율 κ°œμ„  : 헀더 μ••μΆ• 전솑, λ°”μ΄λ„ˆλ¦¬ 데이터 기반 λ©”μ‹œμ§€ μ†‘μˆ˜μ‹ 
  • μ„œλ²„ ν‘Έμ‹œ 제곡 (ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­μ•ˆν–ˆλ”λΌλ„ ν•„μš”ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜λŠ” μžμ› 미리 전솑)
  • λ©€ν‹°ν”Œλ ‰μ‹±3 λ„μž…μœΌλ‘œ HOL λΈ”λ‘œν‚Ή4 μ™„ν™”
  1. HTTP/3.0
  • κΈ°μ‘΄ HTTPλŠ” λͺ¨λ‘ TCP기반인 반면 3.0은 UDP 기반으둜 κ΅¬ν˜„λœ QUIC (Quick UDP Internet Connections) ν”„λ‘œν† μ½œ 기반으둜 λ™μž‘
  • 속도 μΈ‘λ©΄μ—μ„œ 큰 κ°œμ„ 

Footnotes

  1. Multipurpose Internet Mail Extensions Type ↩

  2. ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ μžμ›μ΄ λ‹€λ₯Έ 곳에 μžˆμ„ λ•Œ, ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λ‹€λ₯Έ 곳으둜 μ΄λ™μ‹œν‚€λŠ” 것 ↩

  3. μ—¬λŸ¬ μŠ€νŠΈλ¦Όμ„ μ΄μš©ν•΄ λ³‘λ ¬μ μœΌλ‘œ λ©”μ‹œμ§€ μ£Όκ³ λ°›λŠ” 기술 ↩

  4. Head-of-Line λΈ”λ‘œν‚Ή. 같은 큐에 λŒ€κΈ°ν•˜λ©° 순차적으둜 μ²˜λ¦¬λ˜λŠ” μ—¬λŸ¬ νŒ¨ν‚·μ΄ μžˆμ„ λ•Œ, 첫 번째 νŒ¨ν‚·μ˜ 처리 μ§€μ—°μœΌλ‘œ λ‚˜λ¨Έμ§€λ„ μ§€μ—°λ˜λŠ” 문제 ↩