[Network] HTTP 프로토콜

nopecho·2022년 1월 16일
1

HTTP

통신 프로토콜(Protocol) : 컴퓨터나 원거리 통신 장비 사이에 메시지를 주고 받는 약식과 규칙의 체계, 통신 규약 및 약속

프로토콜은 비유 하자면 언어와 같다고 볼 수 있다.

한국인들은 한국어 라는 언어의 규칙에 따라 대화를 하고 미국인들은 영어 라는 언어의 규칙에 따라 대화를 하므로 한국인은 한국인 끼리 의사 소통이 가능하고 미국인은 미국인끼리 혹은 영어라는 언어를 사용하는 사람들과 의사 소통이 가능하다.

즉, 프로토콜은 컴퓨터와 같은 통신 장비끼리 주고 받는 언어 와 같다고 생각하면 된다.

만약 A라는 컴퓨터는 A프로토콜을 사용하고 B라는 컴퓨터는 B프로토콜을 사용한다면 A컴퓨터와 B컴퓨터는 통신을 할 수 없다. 하지만 B컴퓨터도 A프로토콜을 사용한다면 A컴퓨터와 B컴퓨터는 서로 통신 할 수있다.

웹 프로토콜은 클라이언트와 서버가 웹으로 통신하는 규약이다. 그 중 가장 많이 사용 되는 HTTP프로토콜을 알아보자

HTTP(Hyper Text Transfer Protocol)은 웹상에서 데이터를 주고 받을때 거의 모든 통신을 HTTP 프로토콜로 통신한다.


HTTP프로토콜 특징

클라이언트 - 서버 구조

HTTP프로토콜은 클라이언트와 서버 구조로 되어 있다.

  • Request, Response 구조로 이루어져 있다.
  • 클라이언트는 서버에 요청을 보내고 응답을 기다린다.
  • 서버가 클라이언트의 요청에 대한 결과를 만들어서 응답을 보낸다.

이러한 클라이언트 - 서버 구조는 많은 이점을 가진다.
클라이언트와 서버로 분리 되어 있기때문에 각자 독립적으로 성장이 가능하다.
클라이언트는 사용자에서 보여주는 UI, UX 에 집중 할 수있다.
서버는 UI에 신경 쓰지 않고 핵심적인 비지니스 로직 등을 가지고 있을 수 있다.

무상태 프로토콜이다. (Stateless)

  • 서버가 클라이언트의 상태를 보존하지 않는다.
  • 서버 확장성이 높다.
  • 클라이언트가 추가 데이터를 전송해야 한다.

HTTP는 상태를 가지고 있지 않는 프로토콜이다.
한번 요청을 보내고 응답을 받으면 서버와 연결을 끊는다. 하나의 클라이언트가 서버와 여러번의 요청과 응답을 받더라도 서버는 이전의 요청에 대한 정보를 가지고 있지 않다. (서버가 클라이언트의 정보를 가지고 있는 것이 Stateful)

비연결성 프로토콜

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

비연결성 프로토콜은 서버 입장에서는 서버의 자원(메모리 등)을 효율 적으로 사용할 수 있지만 클라이언트 입장에선 단점도 존재한다.

요청과 응답을 주고 받은뒤 연결을 끊기 때문에 다음에 또 서버와 통신을 하려면 TCP/IP (3 way handshake) 연결을 매번 새로 맺여야 하므로 연결 시간이 늘어난다.

또한 만약 웹 브라우저로 사이트를 요청하면 HTML문서 뿐만 아니라 CSS, JS파일, 이미지 파일 등 수많은 자원이 함께 다운로드 되는데 이러한 자원도 매번 새로 받아와야 한다. 하지만 이 단점은 HTTP 지속연결 이라는 기술을 이용해 완화 가능하다.


HTTP 메시지

일반적으로 HTTP 메시지 구조는 다음과 같은 구조를 가지고 있다.

start-line //시작라인
header //헤더
empty-line //공백라인 (무조건 공백라인 하나 있음)
message-body //바디

start-line 시작 라인

시작 라인의 경우 요청 메시지와 응답 메시지가 조금 다르다.

요청 메시지(Request)
요청 메시지의 start-line은 request-line 이다.

request-line = method SP request-target SP HTTP-version CRLF
SP = 공백, CRLF = 엔터

  • method : HTTP메서드 (GET, POST, PUT, DELETE 등)
  • request-target : 요청 대상
  • HTTP-version : HTTP 버전

예를 들어 GET /serach?q=hello HTTP/1.1 이라는 HTTP 요청 메시지의 시작라인을 해석 하자면 이렇다.

  • HTTP버전이 1.1 이고 HTTP메소드가 GET이고 요청 대상이 /search?q=hello 다.


    응답 메시지(Response)
    응답 메시지의 start-line은 status-line이다.

    status-line = HTTP-version SP status-code SP reason-phrase CRLF
    SP = 공백, CRLF = 엔터

  • HTTP-version : HTTP 버전

  • status-code : HTTP상태 코드로 요청 성공, 실패를 나타낸다.
    200 : 성공
    400 : 클라이언트 요청 오류
    * 500 : 서버 내부 오류

  • reason-phrase : 이유 문구로 사람이 이해할 수 있는 상태코드에 대한 설명

header 헤더

header = field-name":" OWS field-value OWS
OWS = 띄어쓰기 허용

헤더는 HTTP전송에 필요한 모든 부가정보가 들어가 있다.
예를 들어 메시지 바디의 종류, 바디의 크리, 압축 정보, 인증, 요청 클라이언트의 정보, 캐시 정보 등등..

헤더를 통해 HTTP메서드의 정보를 대략적으로 알 수 있다.

body 메시지 바디

HTTP 바디에는 실제로 전송할 데이터가 들어가 있다.
HTML, 이미지, 영상, JSON, XML 등 모든 데이터를 바디에 담아서 전송할 수 있다.

0개의 댓글