이시안 개발 블로그

HTTP 기본 본문

📡Network

HTTP 기본

ICAN 2021. 12. 9. 18:00

모든 것이 HTTP

HTTP 메시지에 모든 것을 전송할 수 있다.

  • HTML, TEXT
  • IMAGE, 음성, 영상, 파일
  • JSON, XML (API)
  • 거의 모든 형태의 데이터 전송 가능
  • 서버 간 데이터를 주고 받을 때도 대부분 HTTP 사용

HTTP 역사

  • HTTP/0.9 (1991년) : GET 메서드만 지원, HTTP 헤더 X
  • HTTP/1.0 (1996년) : 메서드, 헤더 추가
  • HTTP/1.1 (1997년) : 가장 많이 사용되는 버전
    • RFC2068 (1997) -> RFC2616 (1999) -> RFC7230~7235 (2014)
  • HTTP/2 (2015년) : 성능 개선
  • HTTP/3 (진행 중) : TCP 대신 UDP 사용, 성능 개선

기반 프로토콜

  • TCP : HTTP/1.1, HTTP/2
  • UDP : HTTP/3
  • 현재 HTTP/1.1을 주로 사용하지만 2, 3도 점점 증가하는 추세

HTTP 특징

  • 클라이언트 서버 구조
  • 무상태 프로토콜 (스테이스리스), 비연결성
  • HTTP 메시지
  • 단순함, 확장 가능

1. 클라이언트 서버 구조

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

클라이언트와 서버가 개념적으로 분리되어 있는 것이 중요하다.
서버에는 데이터, 비즈니스 로직 등을 몰아놓고 클라이언트에는 UI/UX 등에 집중하게 한다.
클라이언트와 서버를 위처럼 분리하면 각각 독립적으로 진화할 수 있다.

2. 무상태 프로토콜 (Stateless)

  • 서버가 클라이언트의 상태를 보존 X
  • 장점 : 서버 확장성 높음 (스케일 아웃)
  • 단점 : 클라이언트가 추가 데이터 전송

Stateful, Stateless의 차이

  1. Stateful

상태를 유지하는 Stateful은 특정 클라이언트의 요청을 특정 서버가 전담하는 식으로 대응된다.
클라이언트의 상태를 서버가 기억하고 있다가 활용하게 하는 데 로그인 유지, 자주 검색한 단어 등에 사용된다.

하지만 해당 클라이언트의 상태를 유지하고 있던 서버에 장애가 발생하게 된다면 클라이언트는 다른 서버에서 처음부터 다시 시작해야 한다는 단점이 있다.

  1. Stateless

무상태의 경우 클라이언트가 요청할 때부터 필요한 데이터를 전부 전송하는 방식이다.
서버는 상태를 보관하지 않고 요청된 데이터 필요한 정보가 다 있어 이에 대한 응답만 하면 되므로 중간에 서버가 장애나도 다른 서버를 호출해서 처리할 수 있다.

서버를 늘리는 것을 수평 확장이라고 하는 데 무상태는 수평 확장에 유리하다.
이벤트를 한다던지 갑자기 유저가 몰리는 경우에 서버만 늘려서 처리하기 용이하다.

  1. 정리
  • 모든 것을 무상태로 설계할 수는 없는 경우도 있다.
  • 무상태 - 로그인이 필요 없는 단순 서비스 소개 화면
  • 상태 유지 - 로그인
    • 로그인한 유저의 경우 로그인한 상태를 서버에 유지
    • 브라우저 쿠키, 서버 세션 등을 사용함
  • 상태 유지와 달리 무상태는 한 번에 많은 데이터를 전송해야 함

웹 애플리케이션을 설계할 때는 로그인과 같이 상태 유지가 필요한 경우에만 최소한으로 Stateful을 사용하고 최대한 Stateless하게 설계하는 것이 중요하다.

3. 비연결성 (Connectionless)

특징

  • HTTP는 기본이 연결을 유지하지 않는 모델
  • 일반적으로 초 단위 이하의 빠른 속도로 응답
  • 1시간 동안 수천명이 서비스를 사용해도 동시에 처리하는 요청은 수십개 이하로 매우 작음
    • 웹 브라우저에서 연속해서 검색 버튼을 누르지는 않음
  • 서버 자원을 매우 효율적으로 사용할 수 있음

한계와 극복

  • TCP/IP 연결을 새로 맺어야 함 - 3 way handshake 시간 추가
  • 웹 브라우저로 사이트를 요청하면 HTML 외에도 JS, css, 추가 이미지 등 수 많은 자원이 함께 다운로드
  • 지금은 HTTP 지속 연결 (Persistenct Connections)로 문제 해결
  • HTTP/2, HTTP/3에서 더 많은 최적화

각 클라이언트가 서버에 요청을 하면 연결이 되는 데 연결을 유지하는 모델은 응답을 처리해도 계속 연결 상태이다.
서버는 연결을 계속 유지하게 되니 클라이언트가 놀고 있어도 계속해서 자원을 소모하게 되는 단점이 있다.

연결을 유지하지 않는 모델은 요청 시에 연결이 되고 응답을 하면 즉시 연결을 종료한다.
서버는 응답할 때만 연결을 하다보니 최소한의 자원으로 운용할 수 있다.

HTTP 초기 방식과 지속 연결

HTTP 초기에는 TCP/IP로 클라이언트와 서버가 연결되고 필요한 데이터를 요청-응답하고 종료하는 방식이었다.
위 과정이 HTML, JS, css, 이미지 등등 필요한 자원이 있을 때 마다 계속 연결-종료를 반복하게 되니 모든 데이터를 가져와 렌더링하는 데에 오랜 시간이 걸릴 수 밖에 없었다.

HTTP 지속 연결은 똑같이 TCP/IP로 연결하는 것까진 동일하지만 요청-응답 후 연결을 유지하여 모든 데이터를 받을 때까지 연결을 종료하지 않는다.

HTTP 메시지

// 공식 스펙

HTTP-message = start-line
                        *( header-field CRLF )
                        CRLF
                        [ message-body ]

시작 라인

요청 메시지

GET /search?q=hello&hi=ko HTTP/1.1
Host: www.google.com
  • request-line = method SP(공백) request-target SP HTTP-version CRLF(엔터)
  1. HTTP 메서드
  • 종류 : GET, POST, PUT, DELETE ...
  • 서버가 수행해야 할 동작 지정
    • GET : 리소스 조회
    • POST : 요청 내역 처리
  1. 요청 대상
  • absolute-path[?query] (절대경로[?쿼리])
  • 절대경로 = "/"로 시작하는 경로
  1. HTTP 버전

응답 메시지

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
<html>
 <body>...</body>
</html>
  • status-line = HTTP-version SP status-code SP reason-phrase CRLF
  1. HTTP 버전
  2. HTTP 상태 코드 : 요청 성공, 실패를 나타냄
    • 200 : 성공
    • 400 : 클라이언트 요청 오류
    • 500 : 서버 내부 오류
  3. 이유 문구 : 사람이 이해할 수 있는 짧은 상태 코드 설명

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은 대소문자 구문 없음
  • HTTP 전송에 필요한 모든 부가정보
    • 메시지 바디의 내용, 크기, 압축, 인증, 요청 클라이언트 정보 등 ...
  • 표준 헤더가 너무 많음
  • 필요 시 임의의 헤더 추가 가능
    • helloworld: hihi

HTTP 메시지 바디

<html>
 <body>...</body>
</html>
  • 실제 전송할 데이터
  • HTML 문서, 이미지, 영상 JSON 등 byte로 표현할 수 있는 모든 데이터 전송 가능

단순함 확장 가능

  • HTTP는 단순하다
  • 메시지도 매우 단순
  • 크게 성공하는 표준 기술은 단순하지만 확장 가능한 기술

출처: 모든 개발자를 위한 HTTP 웹 기본 지식

'📡Network' 카테고리의 다른 글

HTTP 캐시와 조건부 동작  (0) 2021.12.14
HTTP 헤더  (0) 2021.12.12
HTTP 메서드와 활용  (0) 2021.12.10
URI와 웹 브라우저 요청 흐름  (0) 2021.12.07
인터넷 네트워크  (2) 2021.12.04
Comments