HTTP
HTTP
HTTP의 정의와 특성
HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜이다.
HTTP는 4가지의 특성을 가지고 있다.
- 요청-응답 기반 프로토콜이다.
- 미디어 독립적 프로토콜이다.
- 상태를 유지하지 않는(stateless) 프로토콜이다.
- 지속 연결을 지원하는 프로토콜이다.
요청-응답 기반 프로토콜
HTTP는 클라이언트-서버 모델을 따르는 요청-응답(Request-Response) 방식의 프로토콜이다.
- 클라이언트(주로 웹 브라우저)는 서버에 요청(Request)을 보내고, 서버는 이에 대한 응답(Response)을 반환한다.
- 예를 들어, 사용자가 웹 브라우저에서 특정 웹사이틔의 URL을 입력하면, 브라우저는 해당 URL에 대한 HTTP 요청을 서버로 전송한다. 이후 서버는 요청을 처리한 후 , HTML,JSON,이미지 등의 데이터를 응답으로 보낸다.
- 요청과 응답은 헤더(Header)와 본문(Body)로 구성되며, 요청 방식(GET,POST,PUT,DELETE 등)에 따라 다른 동작을 수행한다.
미디어 독립적 프로토콜
HTTP는 미디어 타입에 상관없이 모든 데이터를 전송할 수 있는 프로토콜이다.
- 텍스트,이미지,동영상,JSON,XML 등 다양한 형식의 데이터를 전송할 수 있다,
- 전송되는 데이터의 유형은 HTTP 헤더의 Content-Type을 통해 명시된다.
- 슬래시를 기준으로
타입/서브타입형식으로 구성 - 미디어 타입에는 부가적인 설명을 위해 선택적으로 매개변수 포함 가능
(타입/서브타입; 매개변수=값의 형식으로 표현) - 미디어타입 종류 확인하기
1 2
// 서버가 JSON 데이터를 반환할 것임을 나타낸다. Content-Type : application/json
- 슬래시를 기준으로
- HTTP를 정의한 공식 문서(RFC 9110)
- The target of an HTTP request is called a “resource”. HTTP does not limit the nature of a resource; it merely defines an interface that might be used to interact with resources. Most resources are identified by a Uniform Resource Identifier(URI)
- HTTP가 요청하는 대상은 “자원”이다. HTTP는 자원의 특성을 제한하지 않으며, 자원과 상호작용하는 데 사용할 수 있는 인터페이스를 정의할 뿐이다. 대부분의 자원은 URI로 식별된다.
상태를 유지하지 않는(Stateless) 프로토콜
HTTP는 Stateless(무상태) 프로토콜로, 각 요청과 응답이 독립적으로 처리된다.
- 서버는 이전 요청에 대한 정보를 유지하지 않으며, 매 요청마다 새로운 연결이 이루어진다.
- 이로 인해 확장성과 성능이 향상되지만, 로그인 상태 유지와 같은 기능을 위해 세션(Session), 쿠키(Cookie), 토큰(Token) 등을 활용하는 방식이 필요하다.
- HTTP는 왜 상태를 유지하지 않는걸까?
- HTTP 서버는 일반적으로 많은 클라이언트와 동시에 상호 작용하기 때문에 모든 클라이언트의 상태 정보를 유지하는 것은 서버에게 큰 부담이다.
- 특정 클라이언트가 특정 서버에 종속되는 상황을 방지한다.
- HTTP가 상태를 유지하는 프로토콜이라면 클라이언트는 자신의 상태를 기억하는 특정 서버하고만 통신을 할 것이다.
지속 연결을 지원하는 프로토콜
초기 HTTP/1.0에서는 요청마다 새로운 TCP 연결을 생성하고 응답 후 바로 종료되었지만, HTTP/1.1부터는 지속 연결을 기본적으롤 지원한다.
- 하나의 TCP 연결을 여러 개의 HTTP 요청 및 응답에 재사용할 수 있어 성능이 향상된다.
- 이를 가능하게 하는 것이 Keep-Alive 헤더이다.
- 초기의 HTTP 버전(1.0 이하)에서는 TCP 연결 수립 후, 요청에 대한 응답을 받으면 연결을 종료하는 비지속 연결 프로토콜이였다.
하지만 최근 대중적으로 사용되는 HTTP 버전(1.1 이상)에서는 하나의 TCP 연결상에서 여러 개의 요청-응답을 주고받을 수 있다.
1 2
// 해당 설정이 활성화되면, 클라이언트와 서버는 동일한 연결을 유지하며 여러 개의 요청을 처리할 수 있다. Connection : keep-alive
HTTP 메시지란
HTTP 메세지는 클라이언트(브라우저)와 서버가 서로 데이터를 주고 받는 방법이다. 메세지에는 두가지 종류가 있다.
- 요청(Request) : 클라이언트가 서버에게 이거 해줘! 라고 요청하는 메시지
- 응답(Response) : 서버가 요청을 처리하고 클라이언트에게 보내주는 결과
HTTP 메세지 구조
HTTP 메세지는 크게 두 부분으로 나뉜다.
- 헤더(Header) : 요청 또는 응답에 대한 추가 정보(예: 요청 방식, 콘텐츠 타입 등)
- 본문(Body) : 실제 전송할 데이터 (예: HTML 문서,이미지,JSON 데이터 등) 그리고 메시지의 맨 앞에는 시작 줄이라는 중요한 정보가 포함되어 있다.
HTTP 요청으로 알아보기
시작 줄(Start Line)
요청의 핵심 정보를 담고 있다. 다음 3가지 요소로 구성된다.
- HTTP 메서드(Method)
- 서버에게 무엇을 할지 지식하는 역할
- 예) GET(데이터 가져오기), POST(새 데이터 추가), PUT(데이터 수정), DELETE(데이터 삭제)
- 요청 대상(Requset Target)
- 요청하는 리소스의 경로(URL)
- 예)
/index.html,/api/users
- HTTP 버전
- 요청이 어떤 HTTP 버전으로 전송되는지 표시
- 예)
HTTP/1.1,HTTP/2
📌 예시
1
GET /index.html HTTP/1.1
- 해당 요청은 index.html 페이지를 HTTP/1.1 버전으로 가져오라는 의미이다.
HTTP 헤더(Headers)
헤더는 요청에 대한 추가 정보를 포함하고 있다.
형식 : 헤더이름:값
💡 주요 헤더 예시
Host: 요청하는 서버의 주소1
Host: www.imkh817.github.io
User-Agent: 요청을 보낸 클라이언트 정보(브라우저, OS 등)1
User-Agent: Mozila/5.0
Accept: 클라이언트가 받을 수 있는 데이터 타입1
Accept: text/html, applicaition/json
본문(Body)
요청 본문은 선택사항이다. 보통 POST나 PUT 요청에서 데이터를 보낼 때 사용된다.
📌 예시 (POST 요청으로 JSON 데이터 전송)
1
2
3
4
5
6
7
8
POST /login HTTP/1.1
Host: www.imkh817.github.io
Content-Type: application/json
Content-Length: 34
{
"username" : "조건희",
"password" : "1234"
HTTP 응답으로 알아보기
시작줄 (Start Line)
응답에도 시작줄이 있다. 다음 3가지로 구성된다.
- HTTP 버전
- 예)
HTTP/1.1,HTTP/2
- 예)
- 상태 코드 (Status Code)
- 요청이 성공했는지, 실패했는지를 나타내는 숫자
- 예)
200 OK→ 성공!404 Not Found→ 요청한 페이지 없음500 Internal Server Error→ 서버 오류
- 상태 메시지 (Status Message)
- 상태 코드의 의미를 설명하는 문구
- 예)
OK,Not Found,Internal Server Error
📌 예시
1
HTTP/1.1 200 ok
HTTP 헤더(Headers)
응답 헤더에는 서버가 응답을 보낼 때 필요한 추가 정보가 담겨 있다.
💡 주요 응답 헤더 예시
Content-Type: 응답 데이터의 타입1
Content-Type: text/html
Contetn-Length: 응답 본문의 크기1
Content-Length: 512
본문(Body)
응답 본문에는 클라이언트가 요청한 실제 데이터가 들어있다. 예를 들어, HTML 페이지, JSON 데이터, 이미지 등이 올 수 있다.
1
2
3
4
5
6
7
8
9
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>
<h1>Welcome to my Git Bolg!</h1>
</body>
</html>
