본문 바로가기
CS 기본지식/HTTP

HTTP 개론

by YellowCow 2022. 7. 21.

현재 인터넷에서 데이터를 주고 받을 때 주로 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)

    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 헤더

  • 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

댓글