HTTP에 대해 알아보자.
HTTP (HyperText Transfer Protocol)
초기에는 HTML과 같은 하이퍼미디어 문서를 주로 전송했지만, 최근에는 Plain text, JSON, XML 등 다양한 형태의 정보도 전송하는 애플리케이션 레이어 프로토콜입니다.
초기에는 웹 브라우저와 웹 서버 간의 커뮤니케이션을 위해 디자인되었지만 최근에는 모바일 애플리케이션 및 IoT 등과의 커뮤니케이션과 같이 다른 목적으로도 사용되고 있습니다.
HTTP의 특징
Client-Server 구조
Client-Server 구조에서 각각의 Server와 Client는 독립되어 있습니다.
Client는 Server에 요청(Request)를 보내고 응답이 올 때까지 대기하고, Server는 Client에서 받은 요청에 대한 결과를 만들어 응답(Response)을 하는 Request-Response 구조라고 할 수 있습니다.
Server에서 비즈니스 로직과 데이터를 독립적으로 처리할 수 있도록 만든 구조로 Client와 Server는 독자적으로 발전할 수 있어 빠르게 발전해왔습니다.
무상태성 (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, 추가 이미지 등 수많은 자원이 다운로드 되는데 각각의 자원마다 연결과 종료를 반복하는 것은 비효율적입니다.
따라서, HTTP 지속 연결로 문제를 해결합니다.
- HTTP 지속 연결 (Persistent Connections)
- HTTP 지속 연결에서는 연결이 이루어지고 난 뒤 각각의 자원들을 요청하고 모든 자원에 대한 응답이 돌아온 후에 연결을 종료한다.
HTTP 요청 메세지 구조
HTTP 요청 메세지는 공백(blank line)을 제외하고 3가지 부분으로 구성되어있습니다.
- Start Line
- Headers
- Body
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
: 인증 토큰을 서버로 보낼 때 쓰이는 HeaderOrigin
: 서버로 Post 요청을 보낼 때 요청이 어느 주소에서 시작되었는지 나타내는 값 (요청을 보낸 주소와 받는 주소가 다르면 CORS 에러 발생)Cookie
: 쿠키 값이 key-value로 표현된다.
Body
HTTP Request가 전송하는 데이터를 담고 있는 부분입니다.
전송하는 데이터가 없다면 body 부분은 비어있습니다.
보통 POST 요청일 경우, HTML 폼 데이터가 포함되어 있습니다.
HTTP 응답 메세지 구조
HTTP 응답 메세지도 공백(blank line)을 제외하고 3가지 부분으로 나누어집니다.
- Status Line
- Headers
- Body
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가 비어있게 된다.