오봉이와 함께하는 개발 블로그
HTTP - 비 연결성, HTTP 메시지 본문
비 연결성(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 웹 기본 지식
'이론' 카테고리의 다른 글
HTTP - PUT&PATCH&DELETE, HTTP 메소드의 속성 (0) | 2022.08.03 |
---|---|
HTTP - HTTP API, GET&POST (0) | 2022.08.02 |
HTTP - HTTP 범위, 클라이언트-서버 구조, Stateful&Stateless (0) | 2022.08.01 |
HTTP - URI, 웹 브라우저 요청 흐름 (0) | 2022.07.31 |
HTTP - TCP&UDP, PORT, DNS (0) | 2022.07.30 |