HTTP 메시지 구조에 대해서 알아봅니다. HTTP는 시작 라인, 헤더, 공백 라인, 바디로 이루어져 있고 각 기능과 역할에 대해서 살펴보겠습니다.
[ Contents ]
1. HTTP 메시지 구조
서버와 클라이언트는 HTTP 메시지를 통해 통신합니다. 클라이언트는 서버에 요청 메시지를 보내고, 서버는 클라이언트에게 응답 메시지를 보냅니다.
요청이냐 응답이냐에 따라서 내용은 달라질 수 있지만, HTTP 메시지의 구조는 동일합니다. HTTP 메시지는 Start-line, Header, Message Body로 구성되어 있으며 헤더와 바디 사이에는 이를 구분해주는 공백 라인(CRLF)이 한 줄 있습니다.
2. HTTP 요청 메시지
Get /search?q=HTTP HTTP/1.1 (start-line)
Host: star7sss.tistory.com (Header)
Start-line은 HTTP메시지를 두괄식으로 요약한 내용을 담습니다. 해당 메시지의 종류(요청/응답), 메서드 종류, 경로[쿼리], 상태코드, HTTP버전 등이 간략하게 써져 있습니다.
Header는 의외로 상당히 긴 편입니다.
key: value 형식으로 되어 있으며 버전, 인코딩, 언어, 쿠키, 호스트 정보 등 다양한 정보가 나열되어 있습니다. 표준 헤더도 종류가 상당히 많으며, 특정 클라이언트-서버 간에 합의해서 사용하는 커스텀 헤더도 사용 가능합니다.
위는 Chrome의 개발자도구로 본 요청 헤더입니다. Key-value 형식으로 나름 깔끔하게 정리해서 보여줍니다.
여기서 유난히 길고 눈에 띄는 Cookie라는 헤더가 있습니다. 쿠키는 클라이언트의 상태 정보를 담은 캐시입니다. HTTP는 클라이언트의 상태를 서버가 따로 저장하지 않으며, 서버와 단발성 통신을 하기 때문에 클라이언트의 상태를 모릅니다.
그래서 자세히 적은 요청 헤더와 쿠키를 전달하여 정확한 응답을 이끌어냅니다. 이는 HTTP의 무상태성, 비연결성 특성과 관련이 있으므로 아래 링크를 참고해주시기 바랍니다.
2023.07.06 - [CS] - [네트워크] HTTP의 특징: 무상태성(Stateless), 비연결성(Connectionless)
3. HTTP 응답 메시지
HTTP/1.1 200 (Start Line)
Content-type: text/html;charset=UTF-8
content-encoding: gzip (Header)
<html>
<body>...</body>
</html> (Message body)
일반적으로 질문보다는 답변이 훨씬 길죠.
마찬가지로 요청 메시지보다는 응답 메시지가 훨씬 깁니다. Start Line과 Header뿐만 아니라 장문의 Message body가 추가됩니다. (요청 메시지도 body가 있을 순 있습니다.)
응답헤더에서는 cache-control이 중요합니다. 클라이언트의 브라우저에서는 서버로부터 받은 데이터를 캐싱합니다. 어떤 페이지든 보통 프레임 페이지나 css, js 라이브러리는 동일하므로, 해당 정보를 캐싱해두고 나머지 정보만 서버에 요청하면 효율적으로 통신할 수 있습니다.
하지만 캐싱한 정보가 변경될 수도 있고.. 보안상 캐싱하면 안되는 정보도 있겠죠. 그래서 서버에서는 Cache-Control 헤더로 브라우저의 캐시를 통제합니다.
no-store: 캐시 저장 안함
no-cache: 매 캐시 유효성 확인 필수
must-revalidate: 만료된 캐시만 유효성 확인
public/private: public은 중계서버(CDN) 사용가능, private는 브라우저 캐시만 가능
max-age: 캐시 유효기간 설정
여기서 주의할 속성은 'no-cache'입니다. no-cache는 캐시를 저장하지 않는다는 뜻이 아니라, 저장은 하되 매번 캐시가 유효한지 서버로부터 확인을 받아야한다는 뜻입니다.
대부분의 cache-control에 no-cache 설정이 쓰이며, 캐시 불일치로 오류가 생기는 일을 막아주기 때문에 많이 쓰입니다.
(흔히 QnA에서 오류 시 캐시 삭제하라는 이유가 여기에 있습니다.)
body에는 HTML, CSS, JS, 이미지 등등 실제로 필요한 데이터가 들어 있습니다.
응답메시지의 헤더는 이 데이터들을 잘 이해하기위한 부가 설명이라고 보시면 됩니다. (타입, 인코딩 방식 등)
'CS > 데이터통신 & 네트워크' 카테고리의 다른 글
[네트워크] HTTP 메서드의 속성: 안전, 멱등, 캐시가능 (0) | 2023.07.10 |
---|---|
[네트워크] HTTP 메서드: GET, POST, PUT, PATCH, DELETE (0) | 2023.07.10 |
[네트워크] HTTP의 특징: 무상태성(Stateless), 비연결성(Connectionless) (0) | 2023.07.06 |
[네트워크] URI, URL, 그리고 URN의 정의와 차이점 (0) | 2023.07.04 |
[네트워크] TCP와 UDP의 필요성과 특징 (w. IP프로토콜의 한계) (0) | 2023.07.04 |
댓글