HTTP 특징
- 클라이언트 서버 구조
- 무상태 프로토콜(Stateless)
- 비연결성
- HTTP 메시지
1. 클라이언트 서버 구조
Request, Response 구조이다.
클라이언트는 서버에 요청을 보내고, 응답을 대기한다.
서버가 요청에 대한 결과를 만들어서 응답을 하게된다.
2. 무상태 프로토콜(Stateless)
서버가 클라이언트의 상태를 보존하지 않는다.
장점 : 서버의 확장성 높음(스케일 아웃)
단점 : 클라이언트가 추가 데이터 전송
상태 유지(Stateful)
중간에 다른 서버로 변경되면 안 되고 항상 같은 서버가 유지되어야 한다.
Stateful은 중간에 서버가 장애가 발생할 경우 서버를 변경할 수 없어 리스크가 크다.
무상태(Stateless)
중간의 다른 서버로 변경되어도 된다.
중간에 서버에 장애가 발생하면 서버를 변경하면 된다.
때문에 서버를 무한히 확장이 가능하다.
Stateless 한계
모든 것을 무상태로 설계가 가능하지만 불가능한 경우도 있다.
무상태 : 로그인이 필요 없는 단순한 서비스 소개 화면
상태 유지 : 로그인
일반적으로 브라우저 쿠키와 서버 세션 등을 통해 사용자가 로그인 했다는 상태를 유지한다.
3. 비 연결성
서버가 한 클라이언트에 연결하고 데이터를 전달한 뒤 연결을 끊고 다른 클라이언트와 연결하는 것을 볼 수 있다.
- HTTP는 기본적으로 연결을 유지하지 않는다.
- 일반적으로 초 단위 이하의 빠른 속도로 응답한다.
- 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 작다.
- 이러한 특징 덕분에 서버 자원을 매우 효율적으로 사용할 수 있다.
비 연결성의 한계
TCP/IP 연결을 새로 맺어야 하기 때문에 3 way-handshake 시간이 추가된다.
또한 웹 브라우저로 사이트를 요청할 경우 HTML, JavaScript, css, 이미지 등 수 많은 자원을 함께 다운로드한다.
지금은 HTTP 지속 연결로 문제를 해결했으며 HTTP/2,3에서 최적화를 하였다.
HTTP 초기에는 여러번 연결하고 종료를 하면서 시간을 낭비하는 것을 확인할 수 있다.
HTTP 지속 연결을 통해 한 방에 보내버리면서 이를 해결하였다.
4. HTTP 메시지
HTTP 메시지에 모든 것을 담아서 전송이 가능하다.
- HTML, TEXT
- IMAGE, 음성, 영상, 파일
- JSON, XML
- 거의 모든 형태의 데이터 전송
- 서버 간의 데이터를 주고 받을 때도 대부분 HTTP를 사용
HTTP 메시지 구조
HTTP 메시지의 기본적인 구조이다.
중간에 CRLF는 HTTP 메시지 값을 확인하기 위해서 꼭 필요하다.
요청 메시지 구조
시작 라인
GET = HTTP 메서드
search?q=hello&hI=ko = 요청 대상을 의미
HTTP/1.1 = HTTP 버전
헤더
HTTP 전송에 필요한 부가 정보가 들어간다.
(메시지 바디 내용, 크기, 압축, 인증, 요청 클라이언트 정보, 캐시 관리 정보 등)
응답 메시지 구조
시작 라인
HTTP/1.1 : HTTP 버전
200 OK : HTTP 상태 코드(200 : 성공, 400 : 클라이언트 요청 오류, 500 : 서버 내부 오류)
헤더
부가정보가 들어간다.
HTTP 메시지 바디
실제 전송할 데이터가 들어간다.
(HTML 문서, 이미지, 영상, JSON 등)