HTTP Overview
HTTPλ μ λ’°μ± μλ λ°μ΄ν° μ μ‘ νλ‘ν μ½(TCP)λ₯Ό μ¬μ©νκΈ° λλ¬Έμ μ μ‘ μ€ νκ΄΄λκ±°λ μ€λ³΅λκ±°λ μ곑λμ§ μλλ€. κ°λ°μλ μΈν°λ· κ²°ν¨μ΄λ μ½μ μ λν κ±±μ μμ΄ κΈ°λ₯ ꡬνμ μ§μ€ν μ μλ€.
μΉ ν΄λΌμ΄μΈνΈμ μλ²
μΉ μ½ν μΈ λ μΉ μλ²μ μ‘΄μ¬νλ€. μΉ ν΄λΌμ΄μΈνΈλ μλ²μκ² HTTP μμ²μ 보λ΄κ³ μλ²λ μμ²λ λ°μ΄ν°λ₯Ό HTTPμλ΅μΌλ‘ λλ €μ€λ€.
HTTPλ₯Ό μ΄μ©ν΄ μΉμλ²μ 리μμ€λ₯Ό μμ²νμ¬ λΈλΌμ°μ μ 보μ¬μ£Όλ κ³Όμ μ λ¨μννλ©΄ λ€μκ³Ό κ°μ μμλ‘ μ΄λ£¨μ΄μ§λ€.
- λΈλΌμ°μ κ° URLμμ νΈμ€νΈλͺ κ³Ό ν¬νΈλ²νΈ(μλ€λ©΄)λ₯Ό μΆμΆνλ€.
- DNSλ₯Ό ν΅ν΄ URLμ IPλ‘ λ³ννλ€.
- λΈλΌμ°μ μ μΉμλ² μ¬μ΄μ TCP 컀λ₯μ μ λ§Ίλλ€.
- λΈλΌμ°μ κ° μλ²μ HTTP μμ²μ 보λΈλ€.
- μλ²λ λΈλΌμ°μ μ HTTP μλ΅μ λλ €μ€λ€.
- TCP 컀λ₯μ μ΄ λ«νλ©΄, λΈλΌμ°μ κ° μλ²μμ λ°μμ¨ λ¦¬μμ€λ₯Ό 보μ¬μ€λ€.
λ©μμ§(Message)
HTTP νΈλμμ μ μμ²λͺ λ Ή(ν΄λΌμ΄μΈνΈμμ μλ²λ‘ 보λ΄λ)κ³Ό μλ΅ κ²°κ³Ό(μλ²κ° ν΄λΌμ΄μΈνΈμκ² λλ €μ£Όλ)λ‘ κ΅¬μ±λμ΄μλ€. μ΄ μνΈ μμ©μ HTTP λ©μμ§λΌκ³ λΆλ¦¬λ λ°μ΄ν° λ©μ΄λ¦¬λ₯Ό μ΄μ©ν΄ μ΄λ£¨μ΄μ§λ€. HTTP λ©μμ§λ λ¨μν μ€ λ¨μμ λ¬Έμμ΄μ΄λ€. λ°μ΄λ리 νμμ΄ μλ μΌλ° ν μ€νΈμ΄κΈ° λλ¬Έμ μ½κ³ μ°κΈ° μ½λ€. HTTP λ©μμ§λ λ€μ μΈ λΆλΆμΌλ‘ μ΄λ£¨μ΄ μ§λ€.
- μμμ€(start-line) : λ©μμ§μ 첫 μ€μ μμμ€λ‘ μμ²μ΄λΌλ©΄ 무μμ ν΄μΌ νλμ§ μλ΅μ΄λΌλ©΄ 무μ¨μΌμ΄ μΌμ΄λ¬λμ§ λνλΈλ€.
- ν€λ(headers) : μμμ€ λ€μμλ 0κ° μ΄μμ ν€λ νλκ° μ΄μ΄μ§λ€. κ° ν€λ νλλ μ¬μ΄ ꡬ문λΆμμ μν΄
:
λ‘ κ΅¬λΆλμ΄ μ΄λ¦κ³Ό κ°μΌλ‘ ꡬμ±λλ€. ν€λλ λΉ μ€λ‘ λλλ€. - λ³Έλ¬Έ(body) : λΉ μ€ λ€μμλ μ΄λ€ μ’ λ₯μ λ°μ΄ν°λ νμμ λ°λΌ λ€μ΄κ° μ μλ€. μμ²μ λ³Έλ¬Έμ μΉμλ²λ‘ λ°μ΄ν°λ₯Ό μ€μ΄ 보λ΄λ©°, μλ΅μ λ³Έλ¬Έμ ν΄λΌμ΄μΈνΈλ‘ λ°μ΄ν°λ₯Ό λ°ννλ€. μμμ€μ΄λ ν€λμ λ¬λ¦¬ λ³Έλ¬Έμ μ΄μ§λ°μ΄ν°λ₯Ό ν¬ν¨ν μ μλ€.
리μμ€μ λ―Έλμ΄νμ
λνμ μΈ μΉ λ¦¬μμ€λ ν μ€νΈ, HTML, μ΄λ―Έμ§λ± λͺ¨λ μ’ λ₯μ μ μ νμΌμ΄λ€. HTTPλ₯Ό ν΅ν΄ μ€κ³ κ°λ κ°μ²΄(리μμ€λ₯Ό ν¬ν¨νλ)μλ MIME νμ μ΄λΌλ λ°μ΄ν° ν¬λ§· λΌλ²¨μ λΆμΈλ€. μΉλΈλΌμ°μ λ μλ²λ‘λΆν° λ°μ μλ΅ κ²°κ³Όμμ MIMEνμ μ ν΅ν΄ λ€λ£° μ μλ λ°μ΄ν° ν¬λ§·μΈμ§ νμΈνλ€. λΈλΌμ°μ λ μλ°±κ°μ§μ νμ μ λ€λ£° μ μμΌλ©° νΉλ³ν ν¬λ§·μ νμΌμ λ€λ£¨κΈ° μν΄ μΈλΆ νλ¬κ·ΈμΈ μννΈμ¨μ΄λ₯Ό μ€ννλ€.
MIMEνμ
μ /
λ‘ κ΅¬λΆλ μ£Ό νμ
(primary object type)κ³Ό λΆ νμ
(specific subtype)μΌλ‘ μ΄λ£¨μ΄μ§ λ¬Έμμ΄ λΌλ²¨μ΄λ€. HTTP λ©μμ§μ ν€λμ Content-Typeμ κ°μΌλ‘ λͺ
μνλ€.
Content-Type: [MIME νμ
]
λνμ μΈ νμ μ λ€μκ³Ό κ°λ€.
text/html
: HTML λ¬Έμtext/plain
: plain ASCII ν μ€νΈ λ¬Έμapplication/json
: json νμΌapplication/x-www-form-urlencoded
: querystringμΌλ‘ μλ²μ μ μ‘νλ form λ°μ΄ν°multipart/form-data
: κ°κ°μ ννΈλ§λ€ Content-Type μ΄ μ‘΄μ¬νλ form λ°μ΄ν°image/jpeg
: jpeg μ΄λ―Έμ§
λ©μλ(Method)
HTTPλ HTTP λ©μλλΌκ³ λΆλ¦¬λ μ¬λ¬ μ’ λ₯μ μμ² λͺ λ Ήμ μ§μνλ€. λͺ¨λ HTTP μμ² λ©μμ§λ νκ°μ λ©μλλ₯Ό κ°λλ€. λ©μλλ μλ²μκ² μ΄λ€ λμμ΄ μ·¨ν΄μ ΈμΌ νλμ§ λ§ν΄μ€λ€.
-
GET : μΉμλ²μΈ‘μ 리μμ€ μμ²νλ€.
- μ‘°κ±΄λΆ μμ² : μΊμλ₯Ό κ°μ§κ³ μμ§ μμ κ²½μ°
200 OK
μνλ‘ μλ΅μ νμ νλ€. μΊμλ 리μμ€κ° μ‘΄μ¬νκ³ λ¦¬μμ€κ° λ³κ²½λμ§ μμλ€λ©΄304 Not Modified
μλ΅μ νμ νλ€. 리μμ€κ° λ³κ²½λμλ€λ©΄ μλ‘μ΄ λ¦¬μμ€μ ν¨κ»200 OK
μλ΅μ νμ νλ€.
- μ‘°κ±΄λΆ μμ² : μΊμλ₯Ό κ°μ§κ³ μμ§ μμ κ²½μ°
- POST : μλ²μΈ‘μ λ°μ΄ν°λ₯Ό HTTP Bodyμ λ΄μ μΉμλ²λ‘ μ λ¬νλ€.
- PUT : 리μμ€ μ 체λ₯Ό κ°±μ λ₯Ό μμ νλ€. λͺ¨λ νλ μμμ΄ νμνλ€. μΌλΆλ§ μ λ¬ν κ²½μ° μ΄κΈ°κ° νΉμ
null
λ‘ μ²λ¦¬λλ€. - PATCH : 리μμ€μ μΌλΆλΆμ κ°±μ νλ€. κ°±μ νλ €λ μΌλΆ νλ μμμ΄ νμνλ€.
- DELETE : 리μμ€λ₯Ό μμ νλ€.
μνμ½λ
λͺ¨λ HTTP μλ΅ λ©μμ§λ μν μ½λμ ν¨κ» λ°νλλ€. μνμ½λλ ν΄λΌμ΄μΈνΈμκ² μμ²μ΄ μ±κ³΅νλμ§ μλλ©΄ μΆκ° μ‘°μΉκ° νμνμ§ μλ €μ€λ€. μνμ½λλ μΈμ리 μ«μμ΄λ€. κ° μν μ½λμ ν μ€νΈλ‘λ μ¬μ (reason phrase)λ ν¨κ» 보λ΄μ§λλ°, μ΄ κ΅¬λ¬Έμ λ¨μ§ μ€λͺ λ§μ μν΄ ν¬ν¨λκ²μΌλΏ μ€μ μλ΅ μ²λ¦¬μλ μ«μλ‘ λ μ½λκ° μ¬μ©λλ€.
- 200 : μ±κ³΅
-
3xx : 리λ€μ΄λ μ
- 304 Not modified : λ‘컬 μΊμ μ 보λ₯Ό μ΄μ©ν¨
-
4xx : ν΄λΌμ΄μΈνΈμΈ‘ μλ¬
- 401 Unauthorized : κΆν μμ
- 404 Not Found : μμ²ν 리μμ€κ° λ°κ²¬λμ§ μμ
-
5xx : μλ²μΈ‘ μλ¬
- 500 Internal Server Error : μλ² λ΄λΆ μ€λ₯
- 502 Bad Gateway : μλͺ»λ κ²μ΄νΈμ¨μ΄(μ μν νλ‘μ μλ²μμ λ΄λΆ λ§μ μΉμλ²λ‘λΆν° μλͺ»λ μλ΅μ λ°μμλ)
- Service Unavailable : μλΉμ€ λΆκ°
κ°λ¨ν μ€μ΅
ν°λ―Έλμμ curl μ μ¬μ©νμ¬ μλ²μ μμ²μ 보λ΄λ©΄ μ μ‘λλ μμ² λ©μμ§μ μλ²μμ λμμ€λ μλ΅λ©μμ§λ₯Ό ν°λ―Έλμμ νμΈν μ μλ€. μ΄λ ν΄λΌμ΄μΈνΈλ ν°λ―Έλμ΄ λλ€.
$ curl -v localhost:3000
μλ²λ Node.jsλ₯Ό μ¬μ©ν΄ κ°λ¨νκ² κ΅¬νν΄λ³΄μλ€.
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {
'content-type': 'text/html'
});
res.write('<div>λ³Έλ¬Έ</div>');
res.end('<div>λ</div>',() => {
console.log('μ μ‘μλ£');
});
});
server.listen(3000);
μμ²(Request) λ©μμ§
μμμ€μμ GET μμ²μμ 보μ¬μ€λ€. κ·Έ λ€μ μ€λΆν° 3μ€μ ν€λκ° :
λ₯Ό κΈ°μ€μΌλ‘ κ°κ³Ό μ΄λ¦ μμΌλ‘ λͺ
μλμ΄μκ³ ν€λμ λμ λνλ΄λ λΉμ€μ΄ μλ€. λ³Έλ¬Έμ μ λ¬νμ§ μμλ€.
> GET / HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.54.0
> Accept: */*
>
μλ΅(response) λ©μμ§
μμμ€μλ HTTP λ²μ λ²νΈ(HTTP/1.1) μνμ½λμ μ¬μ (200 OK)κ° μ νμλ€. res.writeHead
λ‘ μνμ½λ 200μ λͺ
μνκΈ° λλ¬Έμ΄λ€. κ°μμ΄μ λ‘ ν€λ νλ μμμλ content-type: text/html
κ° μ νμλ€. ν€λμ λμ λ»νλ λΉμ€ μ΄ν λ³Έλ¬Έμ μλ²μμ μ μ‘ν λ°μ΄ν°κ° λ€μ΄μλ€.
< HTTP/1.1 200 OK
< content-type: text/html
< Date: Thu, 03 Oct 2019 09:48:11 GMT
< Connection: keep-alive
< Transfer-Encoding: chunked
<
<div>λ³Έλ¬Έ</div>
<div>λ</div>
μ°Έκ³
- HTTP μλ²½κ°μ΄λ
- https://developer.mozilla.org/en-US/docs/Web/HTTP