* 본 내용은 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 참조하고 있습니다.
HTTP란 HyperText Transfer Protocol의 약자로, 문서를 전송하는 프로토콜로 시작되었으나 지금은 HTTP 메시지에 모든 것을 담아 전송할 수 있게 되었습니다. HTML, TEXT, 이미지, 음성, 영상, 파일, JSON 등 거의 모든 형태의 데이터를 전송할 수 있습니다.
가장 많이 사용하며 중요한 버전은 1.1 버전이며, 2와 3 버전은 성능 개선에 초점을 맞추어 업그레이드 된 버전입니다. 1.1과 2버전은 TCP, 3버전은 UDP 기반으로 구현되어 있습니다.
HTTP는 클라이언트-서버 구조를 갖습니다. 클라이언트는 서버에 요청(Request)를 보내고, 응답(Response)를 대기합니다. 서버는 요청에 대한 결과를 만들어 응답(Response)하는 Request - Response 구조입니다.
이처럼 클라이언트와 서버를 분리함으로써 각자의 역할을 명확히하고 독립적으로 진화할 수 있다는 장점이 있습니다.
Stateless는 서버가 클라이언트의 상태를 보존하지 않는다는 의미입니다. 여기서 클라이언트의 상태를 보존한다는 것은 어떤 의미일까요?
고객 : 이 노트북 얼마인가요?
점원 : 100만원입니다. (노트북 상태 유지)
고객 : 2개 구매하겠습니다.
점원 : 200만원 입니다. 신용카드, 현금 중 어떤 걸로 구매하시겠어요? (노트북, 2개 상태 유지)
고객 : 신용카드로 구매하겠습니다.
점원 : 200만원 결제 완료되었습니다. (노트북, 2개, 신용카드 상태 유지)
위 상황은 점원이 고객의 상태를 유지한다고 볼 수 있습니다. 컨텍스트가 바뀌어도 이전 상태를 유지하는, Stateful한 상황인 것이지요.
여기서 점원이 중간에 바뀌었다고 가정해봅시다.
고객 : 이 노트북 얼마인가요?
점원A : 100만원입니다.
고객 : 2개 구매하겠습니다.
점원B : ? 무엇을 2개 구매하시겠어요?
고객 : 신용카드로 구매하겠습니다.
점원C : ? 무슨 제품을 몇 개를 신용카드로 구매하시겠어요?
Stateful한 상황에서는 점원이 중간에 바뀌면 대처할 수 없습니다. 이번엔 Stateless한 상황을 보겠습니다.
고객: 이 노트북 얼마인가요?
점원A: 100만원 입니다.
고객: 노트북 2개 구매하겠습니다.
점원B: 노트북 2개는 200만원 입니다. 신용카드, 현금중에 어떤 걸로 구매 하시겠어요?
고객: 노트북 2개를 신용카드로 구매하겠습니다.
점원C: 200만원 결제 완료되었습니다.
컨텍스트가 바뀌었을 때 이전 상태를 유지하지 않는 상황을 Stateless, 무상태라고 합니다. 무상태는 컨텍스트가 바뀌어도 가능하며, 새로운 점원을 투입해도 문제가 나타나지 않습니다. 고객을 클라이언트, 점원을 서버에 대입해보면 클라이언트의 요청을 처리하는 서버가 어떤 서버여도 상관이 없습니다. Stateless한 프로토콜에서는 응답 서버를 쉽게 변경할 수 있기 때문에 중간에 서버가 장애가 발생해도 다른 서버가 처리할 수 있으며, 스케일 아웃 등 서버 확장에 유리하다는 이점이 있습니다. 단점으로는 무상태성을 유지하기 위해 한번에 많은 양의 데이터를 주고 받아야한다는 것이 있습니다.
TCP/IP 연결이 클라이언트마다 계속 연결되어 있다면, 서버와 클라이언트가 요청을 주고받지 않을 때에도 자원을 소모한다는 단점이 있습니다. 연결을 유지하지 않는 경우 요청이 필요할 때에만 연결하기 때문에 최소한의 자원으로 효율적으로 서버를 유지할 수 있다는 장점이 있습니다. TCP/IP 연결을 새로 맺어야하기 때문에 3-way handshake 시간이 추가된다는 단점이 있습니다. 최근에는 HTTP 지속 연결로 이러한 문제를 해결할 수 있습니다.
HTTP 메시지는 다음과 같은 구조를 갖습니다.
start line
HTTP 메서드
+ path
+ HTTP 버전
으로 구성됩니다. HTTP 버전
+ 상태코드
+ 이유 문구
로 구성됩니다.HTTP 헤더
field-name : ~
형식으로 구성됩니다. Host : www.google.com
Content-Type : text/html;charset=UTF-8
, Content-Length:3423
과 같이 헤더가 구성되는 것을 확인할 수 있습니다.HTTP 바디