Home HTTP
Post
X

HTTP

HTTP에 대해 알아보자.


HTTP (HyperText Transfer Protocol)

초기에는 HTML과 같은 하이퍼미디어 문서를 주로 전송했지만, 최근에는 Plain text, JSON, XML 등 다양한 형태의 정보도 전송하는 애플리케이션 레이어 프로토콜입니다.

초기에는 웹 브라우저와 웹 서버 간의 커뮤니케이션을 위해 디자인되었지만 최근에는 모바일 애플리케이션 및 IoT 등과의 커뮤니케이션과 같이 다른 목적으로도 사용되고 있습니다.


HTTP의 특징

  • Client-Server 구조

    client-server

    Client-Server 구조에서 각각의 Server와 Client는 독립되어 있습니다.

    Client는 Server에 요청(Request)를 보내고 응답이 올 때까지 대기하고, Server는 Client에서 받은 요청에 대한 결과를 만들어 응답(Response)을 하는 Request-Response 구조라고 할 수 있습니다.

    Server에서 비즈니스 로직과 데이터를 독립적으로 처리할 수 있도록 만든 구조로 Client와 Server는 독자적으로 발전할 수 있어 빠르게 발전해왔습니다.

  • 무상태성 (Stateless)

    http-stateless

    HTTP에서 서버가 클라이언트의 상태를 보존하지 않는 무상태 프로토콜이다.

  • 비연결성 (connectionless)

    HTTP 1.0 기준으로 HTTP는 연결을 유지하지 않는 모델입니다.

    Client에서 요청이 발생하면 TCP의 3-way handshake를 통해 연결하고, Server에서 결과를 처리하여 응답을 받으면 4-way handshake를 통해 연결을 해제합니다.

    즉, 요청을 한 후 응답을 받으면 바로 연결을 종료합니다.

    이는 불필요한 연결을 하지 않아 서버 유지 자원을 효율적으로 사용 가능하게 합니다.


무상태성의 한계

모든 것을 무상태로 설계할 수 없는 경우도 있습니다.

간단한 예로 로그인한 사용자의 경우 로그인했다는 상태를 서버에 유지해야합니다.

이 때는, Cookie, Session, Token 등을 사용합니다.


비연결성의 한계

TCP/IP 연결을 새로 맺으면 3 way handshake 시간이 추가됩니다.

또한, 웹사이트 요청 시 HTML, 자바스크립트, CSS, 추가 이미지 등 수많은 자원이 다운로드 되는데 각각의 자원마다 연결과 종료를 반복하는 것은 비효율적입니다.

connectionless-limitations

따라서, HTTP 지속 연결로 문제를 해결합니다.

HTTP 지속 연결 (Persistent Connections)
HTTP 지속 연결에서는 연결이 이루어지고 난 뒤 각각의 자원들을 요청하고 모든 자원에 대한 응답이 돌아온 후에 연결을 종료한다.

persistent-connection


HTTP 요청 메세지 구조

HTTP 요청 메세지는 공백(blank line)을 제외하고 3가지 부분으로 구성되어있습니다.

  • Start Line
  • Headers
  • Body

http-request-message


Start Line

HTTP 요청 메세지의 시작 라인으로 3가지 부분으로 구성되어있습니다.

  • HTTP Method

    요청의 의도를 담고 있는 GET, POST, PUT, DELETE 등이 있습니다.

    • GET : 존재하는 자원에 대한 요청
    • POST : 새로운 자원을 생성
    • PUT : 존재하는 자원에 대한 변경
    • DELETE : 존재하는 자원에 대한 삭제
  • Request Target

    HTTP Request가 전송되는 목표 주소입니다.

  • HTTP Version

    version에 따라 Request 메시지 구조나 데이터가 다를 수 있어서 version을 명시합니다.


Headers

해당 Request에 대한 추가 정보를 담고 있는 부분입니다.

General headers, Request headers, Entity headers 3가지 부분으로 나누어집니다.

  • 대표적인 헤더

    • Host : 요청하려는 서버 호스트 이름과 포트번호
    • User-agent : 클라이언트 애플리케이션 정보
    • Referer : 바로 직전에 머물렀던 웹 링크 주소
    • Accept : 클라이언트가 처리 가능한 미디어 타입 종류 나열
    • If-Modified-Since : 여기에 쓰여진 시간 이후로 변경된 리소스 취득
    • Authorization : 인증 토큰을 서버로 보낼 때 쓰이는 Header
    • Origin : 서버로 Post 요청을 보낼 때 요청이 어느 주소에서 시작되었는지 나타내는 값 (요청을 보낸 주소와 받는 주소가 다르면 CORS 에러 발생)
    • Cookie : 쿠키 값이 key-value로 표현된다.

Body

HTTP Request가 전송하는 데이터를 담고 있는 부분입니다.

전송하는 데이터가 없다면 body 부분은 비어있습니다.

보통 POST 요청일 경우, HTML 폼 데이터가 포함되어 있습니다.


HTTP 응답 메세지 구조

HTTP 응답 메세지도 공백(blank line)을 제외하고 3가지 부분으로 나누어집니다.

  • Status Line
  • Headers
  • Body

http-response-message


Status line

HTTP 응답 메세지의 상태 라인으로 3가지 부분으로 구성되어있습니다.

  • HTTP version : HTTP 버전 명시
  • Status Code : 응답 상태를 나타내는 코드
  • Status Text : 응답 상태를 간략하게 설명해주는 부분

Headers

HTTP 요청 메세지의 headers와 동일하다.

  • Response에서만 사용하는 헤더

    • Server : 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보 (요청에서의 User-Agent 대신 사용)
    • Date : 메세지가 발생한 날짜와 시간
    • Location : 페이지 리다이렉트 ((웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동)
    • Allow : 허용 가능한 HTTP 메서드
    • RetryAfter : 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간

Body

Response의 body와 일반적으로 동일하다.

데이터를 전송할 필요가 없을경우 body가 비어있게 된다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.