HTTP

앞서 해당글은 인프런에 있는 '모든 개발자를 위한 HTTP 웹 기본 지식' 강의를 기반으로 추가 보충하여 공부하고 정리한 내용들로 해당 강의 자료를 일부 사용하였습니다. 강의를 듣고자 하시는 분은 아래 링크로 가셔서 들으시면 되겠습니다. 

 

모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의

실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., - 강의 소개 | 인프런

www.inflearn.com


HTTP

HTTP는 HyperText Transfer Protocol의 약자로, 인터넷에서 데이터를 주고받기 위한 프로토콜 중 하나입니다. HTTP는 다음과 같은 특징을 가집니다.

 

특징

  • Client-server 구조 HTTP는 Client-Server 구조를 가지며, 클라이언트와 서버 간의 통신으로 이루어집니다. 클라이언트는 서버에 요청을 보내고, 서버는 해당 요청에 대한 응답을 반환합니다.
  • 기본 포트 80 HTTP는 기본적으로 포트 80을 사용하며, 다른 포트를 사용할 경우에는 URL에 포트번호를 명시해야 합니다.
  • 무상태(Stateless) 프로토콜 HTTP는 연결 상태를 유지하지 않기 때문에, 서버는 이전 요청에 대한 정보를 유지하지 않습니다. 따라서, 모든 요청은 독립적으로 처리되며, 클라이언트의 상태 정보나 세션 정보 등은 클라이언트 측에서 유지됩니다.
  • HTTP는 간단한 구조를 가지며, 텍스트 기반의 요청과 응답 메시지를 사용합니다. 이러한 간단한 구조 때문에, HTTP는 웹의 기본 프로토콜로 사용됩니다.
  • 요청 메서드 HTTP는 다양한 요청 메서드를 지원하며, 대표적으로 GET, POST, PUT, DELETE 등이 있습니다. 클라이언트는 요청 메서드를 사용하여 서버에 요청을 보내며, 서버는 해당 요청 메서드에 따라 적절한 처리를 수행합니다.
  • 상태 코드 HTTP는 상태 코드를 사용하여 요청에 대한 결과를 반환합니다. 상태 코드는 3자리 숫자로 이루어져 있으며, 대표적으로 200 OK, 404 Not Found, 500 Internal Server Error 등이 있습니다.

Stateful, Stateless

Stateful과 Stateless는 컴퓨터 네트워크에서 많이 사용되는 용어로, 특히 웹 서버와 클라이언트 간의 상호작용에 많이 사용됩니다.

 

Stateful은 상태 유지를 의미하며, 클라이언트와 서버 간의 연결이 생성된 후 연결 상태를 유지합니다. 이는 세션에 대한 상태 정보를 서버 측에서 유지하고, 요청마다 이 정보를 사용하여 클라이언트의 요청에 응답합니다. 예를 들어, 로그인을 수행하는 경우, 사용자가 인증되고 세션이 시작되면 서버는 해당 세션의 ID를 유지하고, 사용자가 페이지를 이동하거나 요청을 보낼 때마다 해당 세션 ID를 사용하여 인증된 사용자인지 확인합니다.

 

Stateless는 반면 상태 비유지를 의미하며, 클라이언트와 서버 간의 연결이 생성된 후 상태 정보를 유지하지 않습니다. 이는 각 요청이 서로 독립적이고, 이전 요청과는 별개의 정보를 담고 있기 때문입니다. 예를 들어, 검색 엔진에서 검색을 수행하는 경우, 서버는 요청에 대한 응답만 제공하고 클라이언트의 이전 요청과는 상관없는 정보를 제공합니다.

제대로 응답하는 경우
기존 서버가 아닌 다른 서버와 통신하는 경우

따라서, Stateful은 연결이 유지되는 동안 상태 정보를 유지하며, 클라이언트와 서버 간의 통신이 상태 정보에 의존하는 경우 사용됩니다. 반면 Stateless는 각 요청이 별개의 정보를 담고 있으며, 서버와 클라이언트 간의 통신이 상태 정보에 의존하지 않는 경우 사용됩니다.


비 연결성

Stateless와 함께 사용되는 개념으로는 비 연결성입니다. HTTP의 비 연결성은 클라이언트와 서버 간의 연결이 유지되지 않는다는 의미입니다. 즉, 클라이언트가 서버에 요청을 보내면, 서버는 클라이언트에게 응답을 보내고, 이후에 연결을 끊습니다. 이후 클라이언트가 다시 요청을 보낼 때는 새로운 연결이 이루어집니다.

 

이러한 비 연결성은 서버의 자원을 효율적으로 사용할 수 있게 합니다. 만약 연결을 유지한다면, 서버는 계속해서 연결된 상태를 유지하고 있어야 하기 때문에 많은 리소스를 소모하게 됩니다. 하지만 연결이 끊어진다면, 서버는 해당 연결과 관련된 자원들을 모두 해제할 수 있게 됩니다.

연결성 서버
비연결성 서버

하지만 이러한 비 연결성은 상태를 유지하지 않기 때문에 클라이언트와 서버 간의 상태 정보를 유지하지 않습니다. 따라서 이전 요청과 현재 요청이 독립적으로 처리되어야 하며, 이를 위해서는 상태 정보를 클라이언트 측에서 유지하거나, 쿠키나 세션 등의 기술을 사용해야 합니다.

 

비 연결성의 한계점과 해결법

비 연결성은 자원을 효율적으로 사용한다는 것에 장점이 있지만 TCP 프로토콜의 3 way handshake를 매번 연결 시 마다 수행해야 하는다는 단점이 있습니다. 이러한 단점을 극복하는 방법으로는 Persistence Connection으로 해결을 할 수 있는데 Persistence Connection은 HTTP의 비 연결성(Connectionless)을 보완하기 위해 도입된 개념입니다. HTTP 지속 연결을 사용하면 한 번 연결을 맺고 여러 개의 요청과 응답을 주고받을 수 있습니다.

 

HTTP 지속 연결은 다음과 같은 특징을 가집니다.

 

  • Keep-Alive 헤더: HTTP 요청 헤더에서 "Connection: Keep-Alive"라는 값을 설정하여 지속 연결을 요청할 수 있습니다. 서버는 이 헤더를 확인하고, 해당 연결을 유지하도록 합니다.
  • Connection: close 헤더: HTTP 응답 헤더에서 "Connection: close" 라는 값을 설정하여 해당 요청에 대한 응답이 끝난 후에도 연결을 닫을 수 있습니다.
  • Pipelining: HTTP 지속 연결을 사용하면, 요청과 응답을 한 번에 여러 개 보낼 수 있습니다. 이를 Pipelining이라고 합니다. 서버는 요청이 오면, 바로 처리하지 않고 큐에 보관합니다. 그리고 응답을 보내기 전에 큐에 있는 모든 요청에 대한 처리를 마칩니다. 이렇게 함으로써 네트워크 지연 시간을 최소화할 수 있습니다.

 

HTTP 지속 연결을 사용하면, 매번 연결을 새로 맺지 않아도 되므로, 네트워크 부하가 줄어듭니다. 그러나 지속 연결을 계속 유지하는 경우, 연결 자원을 계속 점유하게 되어, 서버 리소스가 낭비될 수 있습니다. 따라서, HTTP 지속 연결을 사용할 때는, 적절한 시간 간격을 두고 연결을 종료해야 합니다.


HTTP 구조

HTTP 프로토콜에서 클라이언트와 서버 간 통신은 Request와 Response 구조로 이루어집니다. 클라이언트가 서버에게 요청(Request)하면 서버는 그 요청에 대해 응답(Response)합니다.

 

Request

Request 메세

먼저 Request 구조는 다음과 같습니다.

[HTTP METHOD] [URL] [HTTP VERSION]
[Headers]

[Body]

여기서 각각의 요소는 다음과 같습니다.

 

  • HTTP METHOD: 클라이언트가 서버에게 요청하는 방식입니다. 예를 들어 GET, POST, PUT, DELETE 등이 있습니다.
  • URL: 요청하는 자원의 위치입니다.
  • HTTP VERSION: 클라이언트가 사용하는 HTTP 프로토콜 버전입니다.
  • Headers: 요청에 대한 부가 정보가 들어갑니다. 예를 들어 클라이언트의 브라우저 정보, 캐시 제어, 인증 등이 있습니다.
  • Body: 요청 시 전송하는 데이터가 들어갑니다. 주로 POST 요청에서 사용됩니다.

 

Response

Response 메세지

다음은 Response 구조입니다.

[HTTP VERSION] [HTTP STATUS CODE] [HTTP STATUS MESSAGE]
[Headers]

[Body]

여기서 각각의 요소는 다음과 같습니다.

 

  • HTTP VERSION: 서버가 사용하는 HTTP 프로토콜 버전입니다.
  • HTTP STATUS CODE: 서버에서 클라이언트에게 응답하는 상태 코드입니다. 예를 들어 200 OK, 404 Not Found, 500 Internal Server Error 등이 있습니다.
  • HTTP STATUS MESSAGE: 상태 코드에 대한 설명입니다.
  • Headers: 응답에 대한 부가 정보가 들어갑니다. 예를 들어 서버의 응답 시간, 인증, 캐시 제어 등이 있습니다.
  • Body: 응답 데이터가 들어갑니다. 주로 HTML, JSON, XML 등의 형식으로 반환됩니다.

 

따라서 HTTP 프로토콜에서 클라이언트와 서버는 이러한 Request와 Response 구조를 통해 데이터를 주고받습니다.

 

'CS 지식 > 네트워크' 카테고리의 다른 글

Http 프로토콜 구조  (0) 2023.05.08
HTTP 2xx, 3xx, 4xx, 5xx 상태코드  (0) 2023.05.06
HTTP 메소드 및 메소드의 속성  (0) 2023.05.06
네트워크(TCP/UDP,IP,URI/URL)  (0) 2023.05.04
REST, REST API, RESTful  (3) 2023.01.25