웹개발을 위한 HTTP 기초 지식

[HTTP] 3. HTTP 기본

codewalker 2021. 4. 6. 21:54

[1] HTTP (Hyper Text Transfer Protocol)

  • HTML 과 같은 텍스트를 전달하는 용도로 시작했으나 지금은 HTTP 메세지에 모든 것을 전송한다.
    • HTML, Text
    • IMAGE, 음성, 영상, 파일
    • JSON, XML (API)
    • 서버 간 데이터를 주고 받을 때도 대부분 HTTP 사용

 

  • 역사
    • HTTP/0.9 (1991): GET 메서드만 지원, HTTP 헤더 없음
    • HTTP/1.0 (1996): 메서드, 헤더 추가
    • HTTP/1.1 (1997): 가장 많이 사용함, RFC2068(1997) → RFC2016(1999) → RFC7230~7235(2014)
    • HTTP/2 (2015): 성능 개선
    • HTTP/3 (진행중): TCP 대신 UDP 사용, 성능 개선

 

  • 기반 프로토콜
    • TCP: HTTP/1.1, HTTP/2
    • UDP: HTTP/3

 

[2] 클라이언트 서버 구조

  • Request, Response 구조
  • 클라이언트는 서버에 요청을 보내고 응답을 대기함
  • 서버는 요청에 대한 결과를 만들어서 응답함

 

 

[3] Stateful, Stateless

- 상태 유지 프로토콜 Stateful 특징

  • 서버가 클라이언트의 상태를 보존한다.
  • 항상 같은 서버가 유지되어야 한다.
  • 중간에 서버에 장애가 나면 클라이언트는 다른 서버에 처음부터 다시 요청을 보내야한다.

 

Stateful 비유 (고객: 클라이언트, 점원: 서버)

 

- 무상태 프로토콜 Stateless 특징

  • 서버가 클라이언트의 상태를 보존하지 않는다.
  • 서버 확장성이 높다. (스케일 아웃 - 수평 확장에 유리)
  • 중간에 서버가 장애가 나도 다른 서버에서 클라이언트의 요청을 처리할 수 있다.
  • 클라이언트가 데이터를 추가로 전송해야 한다.
  • Stateful 은 최소한만 사용하고 Stateless 를 위주로 설계하는 것이 좋다.
  • 로그인을 유지해야 하는 경우처럼 Stateful 을 사용해야 하는 경우가 있다.

 

Stateless 비유 (고객: 클라이언트, 점원: 서버)

 

 

[4] 비연결성 (Connectionless)

 

  • 클라이언트에서 원하는 요청만 수행하고 연결을 끊어버리는 모델
  • 요청이 오는 모든 클라이언트와 서버의 연결을 유지하고 있어야 한다면 서버의 자원이 필요 이상으로 소모될 수 있다. 하지만 비연결성 모델에서는 클라이언트와 서버의 연결이 유지되지 않기 때문에 서버는 최소한의 자원만 사용하면 된다.
  • 연결이 끊어진 클라이언트에서 새로운 요청이 오면 다시 TCP/IP 연결을 맺는 3 way handshake 시간이 추가되기 때문에 응답시간이 길어진다.
  • 이 문제는 HTTP 지속 연결(Persistent Connections)로 해결한다.

 

왼쪽은 HTTP 초기 비연결 방식으로 매 요청마다 연결, 종료시간이 걸리는 문제가 있었고, 오른쪽의 Persistent Connections 방식으로 그 문제를 해결했다.

 

 

[5] HTTP 메세지

 

- HTTP 요청 메세지

  • 시작 라인
    • Method SP request-target SP HTTP-version CRLF
    • SP는 공백, CRLF는 엔터를 의미함

 

  • 헤더
    • field-name":" OWS field-value OWS
    • OWS는 띄어쓰기 허용한다는 의미, field-name은 대소문자 구분 없음

 

- HTTP 응답 메세지

  • 시작 라인
    • HTTP-version SP status-code SP reason-phrase CRLF

 

  • 헤더
    • field-name":" OWS field-value OWS
    • 헤더는 HTTP 전송에 필요한 모든 부가정보를 담고 있음
    • 메세지 바디 내용, 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보 등
    • 필요시 임의의 헤더 추가 가능

 

  • 메세지 바디
    • 실제 전송할 데이터
    • HTML, IMAGE, 영상, JSON 등 byte로 표현할 수 있는 모든 데이터 전송 가능

 

 

 

 

[출처] "(인프런) 모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한" 강의를 듣고 내용을 정리함.