📌 이 포스팅에서는 HTTP의 특징인 Stateless, Connectionless와 HTTP 메시지의 구조에 대해 정리하였습니다.
🔥 About HTTP
🔥 HTTP 특징
🔥 HTTP 메시지 구조
✔️ HTTP는 네트워크 상에서 웹 문서와 웹 문서를 서로 주고받을 수 있는 통신규약이다. 이러한 소통의 핵심은 요청과 응답이며, 말이 아닌 메세지의 형식으로 이뤄진다.
✔️ HTTP는 HyperText Transfer Protocol로 문서 간의 링크를 통해서 연결할 수 있는 HTML을 전송하기 위한 기술로 시작되었다가 현재는 HTML, TEXT, IMAGE, 영상, 음성 파일, JSON, XML(API) 등 거의 모든 형태의 데이터를 HTTP 메시지를 통해 전송하고 통신할 수 있다.
✔️ 서버와 서버 간에도 TCP를 직접 연결하기 보다 대부분 HTTP를 주로 사용하고, 현재 1997년에 등장한 HTTP 1.1버전을 가장 많이 사용하고, HTTP2와 HTTP3로 점점 확대되고 있다. 현재까지도 HTTP 1.1을 주로 사용하는 이유는 대부분 기능이 1.1버전에 이미 구축되어 있고, HTTP2와 HTTP3는 성능 개선 및 UDP 확대 정도의 변화만 이뤄졌기 때문이다.
✔️ HTTP 프로토콜의 특징 중 하나는 무상태(stateless) 프로토콜을 지향한다는 점이다. 무상태란 의미는 서버가 클라이언트의 상태를 보존하지 않는다는 개념이다.
✔️ 즉, 클라이언트와 서버가 통신을 주고 받을 때, 상태유지(stateful)의 구조를 갖고있다면 클라이언트는 방금 전까지 통신했던 서버와 계속 통신을 해야 요청이 처리될 수 있다. 서버가 클라이언트의 상태를 연속적으로 기억하고 있기 때문이다.
✔️ 이에 상태유지(stateful) 구조에서는 클라이언트가 통신해오던 서버에 장애가 생기면 다른 서버가 상태를 유지하며 대응할 수 없고, 클라이언트는 다른 서버와 처음부터 응답을 주고 받으면서 처리를 진행해야 한다.
✔️ 이에 반해, 무상태(stateless) 구조에서는 클라이언트에서 요청 메시지에 모든 정보를 담고있기 때문에 서버는 클라이언트의 상태를 유지할 필요가 없고, 요청에 따라 처리 후 응답을하면 된다. 이에 클라이언트는 항상 같은 서버와 통신을 해야할 이유가 없다.
✔️ 뿐만아니라 무상태(stateless) 프로토콜에서는 급작스럽게 트래픽이 증가하더라도 서버를 늘려(스케일 아웃) 모든 트래픽에 대응할 수 있어 서버의 확장성을 높일 수 있다는 장점이있다. 단, 클라이언트에서 서버에게 요청을 할 때, 늘 모든 정보를 전달해주어야 한다는 단점도 존재한다.
✔️ 또한 단순한 소개 페이지면 무상태로 가능하지만, 로그인이 필요한 경우에는 사용자의 로그인 인증 정보를 서버의 세션을 통해 유지하고 있어야하기 때문에 무상태로 구현하기 불가능 경우가 존재한다.
✔️ 이에 무상태(stateless)를 지향하고 상태유지(stateful)는 최소한만 사용하는 것을 지향한다.
✔️ HTTP는 클라이언트와 서버의 통신을 지속적으로 유지하는 않는 비연결성(connectionless)이 기본 이다. 클라이언트에서 서버에서 요청이 들어오고 응답을 할 때, 이후에도 계속 연결을 유지한다면 서버에서의 자원이 부담 가기 때문이다.
✔️ 즉, HTTP는 클라이언트와 서버의 연결을 유지하지 않음으로써 서버의 자원을 효율적으로 관리하고, 초 단위의 이하의 매우 빠른 속도로 클라이언트와 서버 간의 통신이 이뤄진다.
✔️ 하지만 매번 요청이 올 때마다 TCP/IP의 연결을 새로 맺기(3 way handshake) 때문에 HTML뿐 아니라 Javascript, CSS 등 수 많은 자원이 매번 함께 다운로드 된다.
✔️ 이에 현재는 지속 연결(Persistent Connections)로 문제를 해결하고 있는데, 지속 연결(Persistent Connections)이란 요청이오고 응답이이뤄질 때, 바로 연결을 끊지않고 일정 기간 동안 연결을 유지하는 방식이다. HTTP2, HTTP3에서 지속적인 최적화를 위해 노력하고 있다.
✔️ HTTP 메시지 구조는 크게,, "start-line"을 시작으로 "header", "empty line", "message body"로 나뉜다. 요청메시지(request)와 응답메시지(response)는 전체적인 구조를 유사하지만 요청과 응답에 따라 메세지 구조 내 세부 사항은 차이가 존재한다.
✔️ 이 중 header는 HTTP 메시지 전송에 필요한 모든 부가 정보(인증, 브라우저 정보, 압축, 캐기 관리 정보, 메시지 크기, 애플리케이션 정도 등...)를 기입하는 공간으로 HTTP Body를 해석할 수 있는 정보를 갖고 있다.
✔️ 요청메시지에서 start-line은 맨 처음 HTTP 매서드, path와 query, HTTP의 버전(HTTP/1.1) 순으로 명시한다.
✔️ 이후 header 여역에는 host를 적고, 아래 공백 라인(empty line)으로 작성된다. 마지막으로 요청에 필요한 데이터가 존재한다면 body에 명시합니다.
✔️ 응답메시지의 start-line은 맨 처음 HTTP 버전이 나오고, HTTP 상태코드가 나타난다. 성공이면 200번대, 클라이언트에서 잘못된 요청일 경우 400번대, 서버 내부의 오류일 때는 500번대 코드가 담긴다. 상태코드 뒤에는 OK 등 상태 코드에 대한 짧은 내용이 명시된다.
✔️ header 영역은 서버의 content-type, content-Length 등 모든 메타 정보가 기입되고, html이나 json 등 전송할 데이터는 body 영역에 담겨 전달된다.