오봉이와 함께하는 개발 블로그

HTTP - 비 연결성, HTTP 메시지 본문

이론

HTTP - 비 연결성, HTTP 메시지

오봉봉이 2022. 8. 2. 01:16
728x90

비 연결성(Connectionless)

클라이언트와 서버의 연결을 유지하는 모델에서는 서로 통신중이 아니더라도 연결을 유지하고 있기 때문에 서버 자원을 지속적으로 소모하고 있다.
하지만, 연결을 유지하지 않는 모델에서는 Request&Response가 끝나면 연결을 끊기 때문에 최소한의 자원만을 사용할 수 있다.

HTTP는 기본적으로 연결을 유지하지 않는 모델이며 일반적으로 초 단위 이하의 빠른 속도로 응답한다.
1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수 십 개 이하로 매우 작기 때문에 비 연결 특성 덕분에 서버 자원을 매우 효율적으로 사용할 수 있다.

한계

  • TCP/IP 연결을 새로 맺어야 한다.
    • 3 way handshake에 지속적인 자원 소모
  • 웹 브라우저로 사이트를 요청하면 HTML뿐 아니라 자바스크립트, CSS, 추가 이미지 등 수 많은 자원이 함께 다운로드 된다.
    • 한 번의 연결로 하나의 자원만 다운로드 받게 된다면 성능상 매우 불리함.
  • 그래서 현재 HTTP는 지속 연결(Persistent Connections)로 문제를 해결함.
  • HTTP/2, HTTP/3에서 더 많은 최적화

초기

지속 연결(Persistent Connections)

스테이트리스(Stateless)를 기억하자

서버 개발자들이 가장 어려워하는 업무 중 하나는 정말 같은 시간에 딱 맞춰 발생하는 대용량 트래픽을 처리하는 방법을 개발하는 업무다.
최대한 스테이트리스한 방법으로 설계를 하면 대응할 수 있는 선택지가 생기게 되기 때문에 유의하자.

해결할 수 있는 방법 중 하나는 이벤트를 요청하기 전에 다른 페이지(예 : 로그인)를 통해서 이벤트 요청을 최대한 분산시킬 수 있게끔 하는 방법이 있다.

HTTP 메시지


시작 라인 - 요청 메시지

GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
  • start-line = request-line(요청 메시지) / status-line

    • request-line = method SP(공백) request-target SP(공백) HTTP-version CRLF(엔터)
  • HTTP 메소드 (method) (GET : 조회)

    • 종류
      • GET : 리소스 조회
      • POST : 요청 내역 처리
      • PUT
      • DELETE
  • 요청 대상 (request-target) (/search?q=hello&hl=ko)

    • absolute-path[?query] (절대경로[?쿼리])
    • 절대경로 = "/"로 시작하는 경로
    • 참고로 *, http://...?x=y 와 같이 다른 유형의 경로지정 방법도 있다.
  • HTTP version (HTTP-version)

    • HTTP/1.1
    • HTTP Version에 대한 정보.

시작 라인 - 응답 메시지

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
<html>
  <body>...</body>
</html>
  • start-line = request-line / status-line(응답 메시지)

    • status-line = HTTP-version SP(공백) status-code SP(공백) reason-phrase CRLF
  • HTTP 버전 (HTTP-version)

  • HTTP 상태 코드 (status-code) : 요청 성공, 실패를 나타낸다

    • 200 : 성공
    • 400 : 클라이언트 요청 오류
    • 500 : 서버 내부 오류
  • 이유 문구 (reason-phrase) : 사람이 이해할 수 있는 짧은 상태 코드 설명 글

HTTP 헤더

Host: www.google.com
---------------------------------------
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
  • header-field = field-name ":" OWS field-value OWS (OWS : 띄어쓰기 허용, 띄어쓰기 해도 되고 안 해도 된다.)
  • field-name은 대소문자 구분 없다.
  • field-value는 대소문자 구분 있다.

헤더 용도

  • HTTP 전송에 필요한 모든 부가정보가 들어있다.
    • 예 : 메시지 바디의 내용(HTML? or XML?), 메시지 바디의 크기, 압축(됐나, 안 됐나), 인증 정보, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보 등
    • 메시지 바디 빼고 필요한 메타 데이터가 모두 들어있다.
  • 표준 헤더가 너무 많ㄹ다.
  • 필요시 임의의 헤더 추가 가능

HTTP 메시지 바디

  • 실제 전송 하고 싶은 전송할 데이터
  • HTML 문서, 이미지 영상, JSON 등 byte로 표현할 수 있는 모든 데이터 전송 가능.

정리

HTTP는 단순하고, HTTP 메시지 또한 단순하다.
HTTP 메시지에 모든 것을 전송할 수 있다.

인프런 김영한 지식 공유자님의 강의 - 모든 개발자를 위한 HTTP 웹 기본 지식
728x90
Comments