들어가며
- 이전 포스트에서 HTTP의 정의와 성질에 대해 알아보았다.
- 이번 포스트에서는 HTTP 메시지의 구조와 각 파트별에 대해 간략하게 알아본다.
HTTP 메시지
- 이전 포스트에서 HTTP의 특성 중 하나로 클라이언트 - 서버 구조가 있었다. 이는 클라이언트가 어떤 데이터에 대해 요청(Request)을 하면 서버가 그 요청을 받고 요청에 대한 동작을 수행한 뒤, 그 결과를 클라이언트에게 다시 응답(Response)하는 구조를 뜻한다.
- 이때, 클라이언트가 서버를 동작시키기 위해서는 요청을 보내야 하고 이때 요청의 내용은 메시지로 담을 수 있다. 반대로 서버에서 요청에 대한 결과를 클라이언트에게 응답으로 보낼 때에도 메시지로 담아 보낼 수 있다.
- HTTP 메시지는 이 클라이언트와 서버간 오가는 요청과 응답에 사용되는 요소로 HTTP를 사용하는 클라이언트 - 서버는 이 HTTP 메시지를 사용하여 통신한다.
HTTP 메시지의 구조
- 위의 그림이 HTTP 메시지의 구조를 나타내고 있다.
- HTTP 메시지는 크게 다음과 같은 요소들로 이루어져 있다.
- Start-Line (시작 라인)
- HTTP message header (메시지 헤더)
- CRLF (한줄 개행)
- HTTP message body (메시지 본문)
HTTP 메시지의 각 부분
- 위에서 보았던 HTTP 메시지의 각 부분에 대해 살펴보도록 한다.
Start - Line (시작 라인)
- 시작 라인은 HTTP 메시지가 요청(Request)과 관련된 메시지인지 또는 응답(Response)에 대한 메시지인지에 따라 달라진다.
- 먼저 요청(Request) 메시지일 경우에 시작 라인은 다음과 같은 형태로 작성된다.
- [HTTP method] SP(공백) [request-target] SP [HTTP-version] CRLF(개행)
- HTTP method는 서버가 수행해야 할 동작을 지정하는 메서드로 GET, POST, PUT, DELETE, PATCH로 총 5개가 존재한다. 이 부분에서 서버가 수행할 동작을 지정한다.
- [request-target]은 요청 대상을 의미하며 절대경로("/"로 시작하는 경로)를 의미한다. GET 방식의 경우에 절대경로 뒤에 ?로 시작하는 쿼리 스트링(query-string)이 들어간다.
- [HTTP-version]은 현재 이 HTTP의 버전을 나타내며 일반적으로 1.1버전이 들어간다.
- [HTTP method] SP(공백) [request-target] SP [HTTP-version] CRLF(개행)
- 응답(Response) 메시지일 경우에는 다음과 같은 시작 라인을 가진다.
- [HTTP-version] SP [Status-Code] SP [reason-phrase] CRLF
- HTTP-version은 위와 동일한 것으로 설명은 생략한다.
- Status-Code는 해당 요청이 성공했는지, 실패했는지를 나타내며 다음과 같은 번호대로 분류된다.
- 2xx - 해당 요청이 성공했음을 나타낸다.
- 4xx - 클라이언트에서 잘못된 요청을 서버로 보냈을 경우 반환되는 코드이다.
- 5xx - 서버에서 문제가 발생했을 때 반환되는 코드이다.
- reason-phrase는 해당 코드에 대해 사람이 이해할 수 있는 짧은 코드 설명 글로 예를 들어 200번의 경우 OK라고 표시되며 해당 코드의 뜻이 OK로 서버가 해당 요청을 성공적으로 접수했다는 설명을 나타낸다.
- [HTTP-version] SP [Status-Code] SP [reason-phrase] CRLF
HTTP 헤더
- 헤더 부분은 다음과 같은 구조를 가진다.
- header-field = [field-name] ":" OWS [field-value] OWS (OWS : 띄어쓰기 허용)
- 예를 들어 Host의 경우 Host: www.google.com도 가능하고, Host:www.google.com도 가능하다는 의미이다.
- header-field = [field-name] ":" OWS [field-value] OWS (OWS : 띄어쓰기 허용)
- HTTP 헤더는 HTTP 전송에 필요한 모든 부가정보를 담아두는 곳이다.
- 여기서 부가정보란 메시지 바디의 내용 타입, 메시지 바디의 크기, 인증, 요청 클라이언트 정보, 캐시 정보, 쿠키 정보 등등이 존재한다.
- HTTP 헤더는 표준 헤더가 매우 많이 존재하며 만약 필요시에 임의의 헤더도 추가가 가능하다.
CRLF(개행문)
- 헤더와 바디를 구분하기 위해 넣은 개행문이다.
HTTP 바디
- HTTP 메시지 바디는 실제로 전송할 데이터가 들어가는 부분이다.(Payload라고도 부른다.)
- 해당 부분에는 byte로 표현이 가능한 모든 데이터가 들어갈 수 있으며 보통 HTML, 이미지, 영상, Json, XML이 들어간다.
- 만약 API를 담당한다면 응답 메시지 바디에 JSON이 들어갈 것이고, 웹 어플리케이션이라면 요청에 따라 가공된 HTML이 들어갈 것이다.
정리
- HTTP 메시지는 매우 단순한 구조를 가지며 시작 라인, HTTP 헤더, 개행줄과 HTTP 바디로 나누어질 수 있다.
- 이러한 단순한 구조 덕분에 이해하기도 쉽고 그에 따른 확장도 매우 간편하다(헤더의 경우 우리가 임의로 확장을 시킬 수 있단 것을 생각하자)
- 다음 포스트에서는 요청에서 쓰이는 HTTP method에 대해 알아본다.
'CS > HTTP' 카테고리의 다른 글
HTTP - HTTP 메서드 (0) | 2023.05.17 |
---|---|
HTTP - HTTP API 설계와 HTTP메서드 (0) | 2023.05.15 |
HTTP - HTTP의 뜻과 특성 (0) | 2023.05.13 |
HTTP - URI의 개념 (0) | 2023.05.11 |
HTTP - 인터넷 통신 기초 (0) | 2023.05.09 |