웹 개발에 있어서 HTTP 얘기는 빼놓을 수 없다. 백엔드, 프론트엔드 개발자 모두에게 중요한 개념이고, 따라서 이걸 좀 정리해볼까 한다.
먼저, HTTP가 무엇인지부터 짚고 넘어가야겠다.
HTTP란 'Hypertext Transfer Protocol'의 약자로, 쉽게 말해 Hypertext를 전송하기 위한 통신규약이다.
이때 Hypertext는 직역하면 '초월적인 텍스트'가 나오는 만큼, 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트를 의미한다.
말이 어려운데, 쉽게 말해 하이퍼링크를 생각하면 된다.
HTTP는 클라이언트와 서버 사이에 이루어지는 Request(요청)/Response(응답) 프로토콜이다. 클라이언트의 요청에 대해서만 응답이 존재하고, 응답까지 전송된 뒤에는 연결이 끊어진다. 이는 즉, 상태를 저장하지 않는다는 것을 의미한다. 요청들 사이에 연관성이 없고 독립적이라는 뜻이다.
따라서 상태를 저장해서 사용자와 일관된 상호작용 하기를 원한다면, 쿠키와 세션 등을 이용한다.
앞서 언급했듯이 HTTP는 요청과 응답을 처리하는 프로토콜이다. 그렇다면 요청과 응답은 어떻게 구성되어 있을까?
먼저 요청 부분, Request Message는 Blank line을 제외하고 총 3가지 부분으로 나누어진다.
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
(1) Request line
Request line은 method 필드, URL 필드, HTTP 필드의 총 3개의 필드를 갖는다.
(2) Header lines
Host: google.com
Accept: text/html
Accept-Encoding: gzip, deflate
Connection: keep-alive
...
해당 Request에 대한 추가 정보를 담고 있는 부분으로, Host, Accept, Accept-Encoding 등을 갖는다.
(3) Entity body
Request가 전송하는 데이터를 담고 있는 부분으로, 전송하는 데이터가 없다면 비어있다.
보통 post 요청일 경우, 데이터가 들어있다.
POST /test HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: google.com
User-Agent: HTTPie/0.9.3
{
"test_id": "tmp_1234567",
"order_id": "8237352"
}
응답 부분, Response Message도 Blank line을 제외하고 총 3가지 부분으로 나누어진다.
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)
(1) Status line
Status line은 버전 필드와 상태 코드, 해당 상태 메시지를 갖는다.
(2) Header lines
Request의 headers와 대부분 동일하지만, response에서만 사용되는 header 값들이 있다.
대표적인 header 값은 다음과 같다.
(3) Entity body
Request의 body와 일반적으로 동일하다.
데이터를 전송할 필요가 없을 경우에는 비어있다.