HTTP(HyperText Transfer Protocol)
HTTP는 HyperText Transfer Protocol의 줄임말로, 직역하면 하이퍼텍스트 전달 프로토콜이다.
하이퍼텍스트(HyperText)는 인터넷 사용자가 필요한 정보의 자유로운 검색을 가능하도록 해주는 텍스트의 전개 방식이다.
HTTP는 이러한 하이퍼텍스트 방식의 정보를 교환하기 위한 하나의 규칙이다.
즉, HTML과 같은 문서를 전송하기 위해 사용되며 OSI 7 계층에서 응용 계층에 있는 프로토콜이다. HTTP는 웹 브라우저와 웹 서버의 소통을 위해 디자인되었으며, 전통적인 클라이언트-서버 아키텍처 모델에서 클라이언트가 HTTP 메시지 양식에 맞춰 요청을 보내면, 이에 서버는 HTTP 메시지 양식에 맞춰 응답을 한다. HTTP는 특정 상태를 유지하지 않는 무상태성(Stateless)이 특징이다.
HTTP 메세지(HTTP messages)
요청 메시지 - HTTP 메서드
시작 라인(Start Line)
- HTTP Method
해당 request가 의도한 action을 정의하는 부분.
HTTP Methods에는 GET, POST, PUT, DELETE, OPTIONS 등등이 있다.
주로 GET 과 POST과 쓰임. - Request target
해당 request가 전송되는 목표 uri.
예를 들어 /login. - HTTP Version
말 그대로 사용되는 HTTP 버젼. 버젼에는 1.0, 1.1, 2.0 등이 있다.
HTTP 헤더
- 해당 request에 대한 추가 정보(addtional information)를 담고 있는 부분.
예를 들어, request 메세지 body의 총 길이 (Content-Length) 등. - Key:Value 값으로 되어있다 (: 이 사용됨).
key:value
HOST: google.com => Key = HOST, Value = google.com - Headers도 크게 3부분으로 나뉘지만(general headers, request headers, entity headers) 너무 자세한 부분임으로, 3부분 으로 구성되어 있다는것만 알고 있어도 괜찮다.
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json
Content-Length: 257
Host: google.com
User-Agent: HTTPie/0.9.3
자주 사용되는 header 정보에는 다음이 있다:
- Host
요청이 전송되는 target의 host url: 예를 들어, google.com - User-Agent
요청을 보내는 클라이언트의 대한 정보: 예를 들어, 웹브라우저에 대한 정보. - Accept
해당 요청이 받을 수 있는 응답(response) 타입. - Connection
해당 요청이 끝난후에 클라이언트와 서버가 계속해서 네트워크 컨넥션을 유지 할것인지 아니면 끊을것인지에 대해 지시하는 부분. - Content-Type
해당 요청이 보내는 메세지 body의 타입. 예를 들어, JSON을 보내면 application/json. - Content-Length:
메세지 body의 길이.
HTTP 메시지 바디
- 해당 reqeust의 실제 메세지/내용.
- Body가 없는 request도 많다.
- 예를 들어, GET request들은 대부분 body가 없는 경우가 많음.
POST /payment-sync HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3
{
"imp_uid": "imp_1234567890",
"merchant_uid": "order_id_8237352",
"status": "paid"
}
응답 메세지(Responses)
HTTP 응답 메시지는 클라이언트에게 서버의 응답을 전달하는 메시지이다. Status Line(상태 라인), Headers, Body 로 이루어져있습니다. Response Message와 매우 유사한 구조입니다.
- 요청 라인,상태 라인: 요청 메시지의 요청 라인에는 요청 메서드(예: GET, POST)와 요청 대상 URL이 포함된다. 응답 메시지의 상태 라인에는 상태 코드와 상태 메시지가 포함.
- 헤더(Headers): 요청 메시지의 헤더에는 일반적으로 클라이언트와 요청과 관련된 정보가 포함된다. 반면, 응답 메시지의 헤더에는 일반적으로 서버와 응답과 관련된 정보가 포함된다. 예를 들어, 응답 메시지의 헤더에는 Content-Type, Content-Length, Server 등이 포함될 수 있다.
- 본문(Body): 요청 메시지의 본문은 클라이언트가 서버로 전송하는 데이터를 포함한다. 반면, 응답 메시지의 본문은 서버가 클라이언트로 전송하는 데이터를 포함한다. 요청 메시지에서 본문은 종종 POST 또는 PUT 요청과 함께 사용되며, 응답 메시지의 본문은 일반적으로 서버의 응답 데이터를 포함한다.
총정리
요청 메시지 구조
요청 라인(Request Line), 헤더 (Header), 바디(Body) 로 나눠져 있다.
요청 라인
- 메서드(Method) 요청 유형
- URL : 요청 대상 리소스
- HTTP 버전 : 사용 중인 HTTP 버전
GET /index.html HTTP/1.1
헤더(Header)
- 요청에 대한 부가 정보 ( 예: Host, User Agnet)
Host: www.example.com
User-Agent: Mozilla/5.0
본문(Body)
- 요청 데이터 (주로 POST, PUT 요청에서 사용)
응답 메세지 구조
상태 라인(Status Line), 헤더 (Header), 바디(Body) 로 나눠져 있다.
상태 라인(Status Line)
- HTTP 버전 : 사용 중인 HTTP 버전
- 상태 코드 (Status Code) : 요청 결과 (예: 200, 404,500)
- 상태 메세지(Satatus Message): 상태 코드 설명
TTP/1.1 200 OK
헤더(Header)
- 응답에 대한 부가 정보 (예: Content-Type, Content-Length)
Content-Type: text/html; charset=UTF-8
Content-Length: 138
본문(Body)
- 응답 데이터 (예: HTML, JSON)
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
Sciprt
HTTP메세지는 시작줄(상태), 헤더, 본문, 으로 구성 되어있다. 시작줄은 HTTP메소드, 요청주소, HTTP버전 으로 이루어져 있고, 헤더는 해당 request에 대한 추가 정보를 담고 있다. 전송하는 데이터가 있을 경우 본문에 데이터가 포함되어 있고,없을 경우 비어있는 상태이다.
HTTP 응답 메세지의 경우에는 시작점에 HTTP버전, 응답상태, 응답텍스트로 이루어져 있다. 나머지는 HTTP의 요청과 동일하게 이루어져 있다.
HTTP 요청 메세지는 Header 영역과 Body 영역으로 구분 되어있다. 이 둘은 Blank line을 두어서 구분되어 있다.
Header 영역은 Request Line 영역과 Request Header 영역으로 구분되는데, Request Line 영역에는 HTTP 메서드, 요청 데이터 정보, HTTP 버전을 표시하고 있고 Request Header 영역에는 host, user-agent, accept-encoding, if-modified-since 와 같은 정보가 들어가 있다.
서버쪽으로 전송해야되는 정보가 있다면 Boay에 담아 전송하면 된다.
참고자료
https://velog.io/@surim014/HTTP%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
https://velog.io/@ajm0718/HTTP%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80