현재 인터넷에서 데이터를 주고 받을 때 주로 HTTP 프로토콜을 이용하여 통신하고 있다.
이 글에서는 HTTP 개론에 대한 얘기를 하고자 한다.
1. 클라이언트-서버 구조

- Request/Response 구조로 되어있다.
- 클라이언트는 서버에 요청을 보내고 응답을 대기
- 서버가 요청에 대한 결과를 만들어 응답
2. Stateful/Stateless
1)Stateless
- 클라이언트의 상태를 보존하지 않음
예)
고객: 이 노트북 얼마인가요?
점원: 100만원 입니다.
고객: 2개 구매하겠습니다
점원: ? 무엇을 2개 구매하시겠어요?
고객: 신용카드로 구매하겠습니다.
점원: ? 무슨 제품을 몇 개 신용카드로 구매하시겠어요?
- 중간에 점원(서버)이 바뀌어도 정상적인 요청처리 가능(서버 확장성 증가)
- 무한한 서버 증설 가능
2)Stateful
- 클라이언트의 상태를 보존
예)
고객: 이 노트북 얼마인가요?
점원: 100만원 입니다. (노트북 상태 유지)
고객: 2개 구매하겠습니다
점원: 200만원입니다. 신용카드, 현금 중에 어떤 걸로 구매하시겠어요? (노트북, 2개 상태 유지)
고객: 신용카드로 구매하겠습니다.
점원: 200만원 결재완료되었습니다. (노트북, 2개, 신용카드 상태 유지)
- 중간에 점원(서버)이 바뀌면 바뀐 점원이 상태를 기억하고 있지 않으므로 상태정보를 전달할 필요가 있음(확장성 제한)
- 서버를 증설할 때 복잡함(상태정보를 다른 서버에게 전달해야하므로)
Stateless로 설계하는 것이 유연한 설계를 할 수 있다.
단, 로그인과 같이 서버가 상태를 기억하는 경우에는 Stateful로 설계해야 하는 경우도 있다.
3. 비 연결성
- HTTP는 기본적으로 클라이언트-서버 간 연결을 유지하지 않는다.
- 요청에 대한 응답이 끝나면 연결을 끊게 되어 있다(효율적인 서버자원 사용가능)
- 단, 매번 요청/응답을 할 때마다 TCP/IP 연결을 새로 맺어야 함(3 way handshake 소요시간 추가)
- 요청할 때마다 HTML뿐만 아니라 Javascript, CSS, 이미지 등의 수 많은 자원이 함께 다운로드 됨
- 지금은 HTTP 지속연결(Persistant Connections)로 문제해결 - 모든 요청이 끝날 때까지 연결 유지
비 연결성으로 설계해야 대규모 트래픽에도 버틸 수 있는 서버를 설계할 수 있다.
예) 특정 시간대에 폭발적으로 발생하는 대용량 트래픽(선착순 이벤트, 명절 KTX 예약, 수강신청)
4. HTTP 메세지
클라이언트-서버 간 데이터를 주고 받을 때 HTTP 메세지를 이용하여 주고 받고 있다.
HTTP 메세지는 요청메세지와 응답메세지가 있고 아래와 같은 구조로 되어 있다.

- 시작라인
1) 요청메세지
- start-line(시작라인)은 request-line으로 구성되어 있다.
- request-line은 아래와 같은 규칙으로 구성되어있다
- method SP(공백) request-target SP HTTP-version CRLF(엔터)
- method: HTTP 메서드(GET, POST 등)
- GET: 리소스 조회 - "내가 필요한 리소스를 줘"
- POST: 요청 내역 처리 - "요청처리에 필요한 리소스를 줄테니 처리해줘"
- request-target: HTTP 요청을 받을 대상(예) /search?q=hello&hl=ko)
- request-target은 아래와 같은 규칙으로 구성됨
- absolute-path[?query](절대경로[?쿼리])
- 절대경로: "/"로 시작하는 경로
- HTTP version: 사용할 HTTP 프로토콜 버전(예) /search?q=hello&hl=ko HTTP/1.1)
- method: HTTP 메서드(GET, POST 등)
- method SP(공백) request-target SP HTTP-version CRLF(엔터)
1) 응답메세지
- 응답메세지의 경우, start-line(시작라인)은 status-line으로 구성되어있다.
- start-line은 아래와 같이 구성되어있다
- HTTP version SP(공백) status-code SP reason-phrase CRLF(엔터)
- HTTP version: 사용할 HTTP 프로토콜 버전(예) /search?q=hello&hl=ko HTTP/1.1)
- status-code: 요청 성공/실패를 나타냄
- 200: 요청 성공
- 400: 클라이언트 요청 오류
- 500: 서버 내부 오류
- reason-phrase: 상태 코드에 대한 설명(예) OK)
- HTTP version SP(공백) status-code SP reason-phrase CRLF(엔터)
- HTTP 헤더
- HTTP 헤더는 아래와 같은 규칙으로 구성되어 있다.
- header-field = field-name ":" OWS field-value OWS
- (OWS:띄어쓰기 허용)
- field-name은 대소문자 구분 없음HTTP 전송에 필요한 모든 부가정보를 전송하기 위해 사용

- 부가정보 예) 메세지 바디의 크기, 클라이언트 정보 등
- 필요 시 임의의 헤더 추가 가능 (예) helloworld: hihi)
- HTTP 메시지 바디

- 실제 전송할 데이터를 담을 때 사용
- HTTP 문서, 이미지, 영상, JSON 등 Byte로 표현할 수 있는 모든 데이터 전송 가능
'CS 기본지식 > HTTP' 카테고리의 다른 글
HTTP Status Code (0) | 2022.07.27 |
---|---|
HTTP Method 활용 (0) | 2022.07.26 |
HTTP Method(REST API) (0) | 2022.07.25 |
URI (0) | 2022.07.16 |
인터넷은 어떻게 동작할까? (0) | 2022.07.14 |
댓글