[네트워크]HTTP란 무엇일까?

김형주·2021년 8월 20일
0

Backend Study

목록 보기
2/19
post-custom-banner

HTTP란 무엇일까?


HyperText Transfer Protocol의 약자로 OSI 7계층 중 어플리케이션 레이어에서 사용되는 일종의 통신 규약이다. (나중에 OSI 7계층 모델에 대해서 따로 글을 작성해야겠다.)

웹 브라우저와 웹 서버간의 통신을 위해 설계됐지만, 다른 목적으로도 사용할 수 있다. HTTP는 클라이언트의 요청을 생성하기 위한 연결 이후에 응답을 받을 때까지 대기하는 전통적인 클라이언트-서버 모델에서 사용된다.

HTTP는 대표적으로 무상태 프로토콜(stateless Protocol) 이다.

이 말인 즉 슨 서버가 두 요청간에 어떠한 데이터(상태)도 유지하지 않음을 의미한다. 이 얘기는 클라이언트는 서버상태와 상관없이 요청을 던지고, 서버는 클라이언트 상태와 상관없이 응답을 던진다는 것을 의미한다. 전송 레이어로 UDP와 TCP/IP 레이어 위에 올려진다.

HTTP 개요

HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 일종의 통신 규약이다. HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 간 프로토콜이기도 하다. 클라이언트-서버 프로토콜이란 (보통 웹브라우저인) 클라이언트 측에 의해 요청이 init되는 프로토콜이다. 하나의 완전한 문서는 텍스트, 레이아웃 설명, 이미지, 비디오, 스크립트 등 불러온 하위 문서들로 재구성 된다.

기본적으로 HTTP는 클라이언트가 먼저 말을 거는 클라이언트-서버 모델에서 둘 간의 대화방식이라고 이해한다. 어떻게 요청을 할지, 어떻게 응답할지에 대한 방식을 규약으로 정해두고 사용한다고 이해하면 된다.

보통 클라이언트와 서버들은 HTTP를 통해 개별적인 메시지 교환에 의해 통신한다. 보통 브라우저 위에 올려진 클라이언트에 의해 전송되는 메시지가 요청(request)가 되고, 그에 대해 서버에서 응답으로 전송되는 메시지를 응답(response)라고 한다.

HTTP 기반 체계의 구성요소

HTTP는 세번째 말하듯 클라이언트-서버 프로토콜이다. 요청은 하나의 사용자 에이전트(혹은 프록시)에 의해서 전송된다. 보통 이 에이전시는 브라우저지만, 다른 것도 될 수 있다. 각각의 개별 요청들은 서버로 보내지고, 서버는 요청을 일련의 방식으로 처리하고 응답한다. 이 요청과 응답사이에는 여러 개체들이 있는데 게이트웨이 혹은 캐시 역할을 하는 프록시 등이 있다.

실제로 브라우저와 서버 사이에는 좀 더 많은 컴퓨터들이 존재한다. 전에 인터넷을 공부하며 배웠던 라우터라던지 모뎀 등이 있다. 웹이 여러 계층으로 설계되어있기 때문에 이 중간단계들은 네트워크 계층과 전송계층에 올라와있다. HTTP는 애플리케이션 계층의 최상위에 있다.

클라이언트(Client, 사용자 에이전트)

사용자 에이전트는 사용자를 대신해서 동작하는 모든 도구를 말한다. 사용자가 사용하는 클라이언트, 클라이언트가 올라간 브라우저 역시 같다. 브라우저는 항상Always 요청을 보낸다. 절대 서버가 될 수 없다.

웹페이지를 표시하기 위해, 브라우저는 페이지의 HTML문서를 가져오기 위한 요청을 서버에 전송한 뒤, 받아온 파일의 구문을 분석해서 스크립트나 내부에 잇는 다양한 리소스(이미지, 비디오, 텍스트)를 잘표시하기 위한 CSS(스타일)에 대한 요청들을 가져오고, 이런 리소스들을 합친다. 브라우저는 이러한 파일 내부의 스크립트를 사용해서 더 많은 리소스를 끌어올 수 있고, 브라우저는 새로운 내용을 다시 또 갱신하는 식으로 클라이언트가 굴러간다.

웹 서버(Web server)

클라이언트의 요청에 대해서 문서를 제공하는 곳이 서버다. 서버는 사실상 논리적으로는 단일 개체다. 여러 대가 있을 수 있지만 논리적으로는 1개라는 말이다. 이는 로드 밸런싱으로 그때 그때 다른 컴퓨터를 통해 리소스를 가져온다든지 하는 식으로 물리적으로는 여러 개일 수 있지만, 논리적으로는 1개만 존재한다고 친다.

서버는 반드시 1개일 필요는 없지만, 여러 개의 서버를 동일한 컴퓨터에서 호스팅할 수도 있다. HTTP/1.1과 Host 헤더를 사용해서 IP를 공유하게 할 수도 있다.

프록시(Proxy)

웹 브라우저와 서버 사이에서는 수많은 컴퓨터와 기계들이 HTTP를 받고 이어 전달한다. 여러 계층으로 이루어져 있는 웹에서 이런 기계들은 전송,네트워크나 물리 계층에서 동작하며 성능에 큰 영향을 주지만, HTTP 관점에서는 보이지 않는다. 이러한 중간 전달매체 중에서 애플리케이션 계층에서 동작하는 애들을 프록시라고 부른다. 프록시는 눈에 보이지 않지만 다양한 기능을 수행한다.

  • 캐싱(캐시는 공개 또는 비공개가 된다.)
  • 필터링(바이러스 백신 스캔, 유해 컨텐츠 차단)
  • 로드 밸런싱(여러 서버들이 서로 다른 요청을 처리하도록 허용)
  • 인증(다양한 리소스에 대한 접근 제어)
  • 로깅(이력 정보 저장)

HTTP 기초

1. HTTP은 간단하다

HTTP는 사람이 읽을 수 있으며 간단하게 고안되었다. 심지어 HTTP/2가 다소 더 복잡해졌지만 여전히 HTTP 메세지를 프레임별로 캡슐화하여 간결하다. HTTP 메시지들은 사람이 읽고 이해할 수 있어, 테스트하기 쉽고 초심자의 진입장벽을 낮췄다.

2. HTTP은 확장 가능하다

HTTP/1.0에서 소개된, HTTP 헤더는 HTTP를 확장하고 실험하기 쉽게 만들어주었다. 클라이언트와 서버가 새로운 헤더의 시맨틱에 대해 간단한 합의만 한다면, 언제든지 새로운 기능을 추가할 수 있다.

3. HTTP은 상태가 없지만, 세션은 있다

HTTP는 상태를 저장하지 않는다(Stateless). 동일한 연결 상에서 연속하여 전달된 두 개의 요청 사이에는 연결고리가 없다. 이는 e-커머스 쇼핑 바구니처럼, 일관된 방식으로 사용자가 페이지와 상호작용하길 원할 때 문제가 된다. 하지만, HTTP의 핵심은 상태가 없는 것이지만 HTTP 쿠키는 상태가 있는 세션을 만들도록 해준다.
헤더 확장성을 사용하여, 동일한 컨텍스트 또는 동일한 상태를 공유하기 위해 각각의 요청들에 세션을 만들도록 HTTP 쿠키가 추가된다.

4. HTTP와 연결

연결은 전송 계층에서 제어되므로 근본적으로 HTTP 영역 밖이다. HTTP는 연결될 수 있도록 하는 근본적인 전송 프로토콜을 요구하지 않는다. 다만 그저 신뢰할 수 있거나 메시지 손실이 없는(최소한의 오류는 표시) 연결을 요구할 뿐이다. 인터넷 상의 가장 일반적인 두 개의 전송 프로토콜 중에서 TCP는 신뢰할 수 있으며 UDP는 그렇지 않습니다. 그러므로 HTTP는 연결이 필수는 아니지만 연결 기반인 TCP 표준에 의존한다.

클라이언트와 서버가 HTTP를 요청/응답으로 교환하기 전에 여러 왕복이 필요한 프로세스인 TCP 연결을 설정해야 한다. HTTP/1.0의 기본 동작은 각 요청/응답에 대해 별도의 TCP 연결을 여는 것이다. 이 동작은 여러 요청을 연속해서 보내는 경우에는 단일 TCP 연결을 공유하는 것보다 효율적이지 못하다.

HTTP 연결 흐름

클라이언트가 서버랑 통신하고자할 때, 최종 서버를 목적지로 했던지 프록시가 됐던지간에 우선은 같은 단계를 수행한다.

1. TCP 연결을 연다.
TCP 연결은 요청을 보내거나(혹은 여러개의 요청) 응답을 받는데 사용한다.
클라이언트는 새 연결을 열거나, 기존 연결을 사용하거나 서버에 대한 TCP 연결을 연다.

2. HTTP 메시지를 전송한다.
HTTP 메시지(ex HTTP/1.1)는 인간이 읽을 수 있는 구조로 되어있다. HTTP/2의 경우 메시지가 프레임 속에 캡슐화되어있어 읽을 수 없지만, 원칙은 동일하다.

GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: kr

3. 서버에 의해 전송된 응답을 읽어들인다.

HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)

4. 연결을 닫거나 다른 요청을 위해 재사용한다.

HTTP 요청 예시

  • Method
    HTTP 메서드, Verb라고도 한다. 보통 클라이언트가 수행하고자 하는 동작을 정의한 GET(주세요), POST(드릴게요), PUT(고쳐요), DELETE(지워요), OPTIONS(PreFlight)등의 명사로 이루어져있다.
  • Path
    가져오려는 리소스의 경로
    TCP 포트와 도메인 주소를 제외한 나머지
    ex /userinfo,/userdata, /main/img

HTTP 응답 예시

  • HTTP/1.1
    프로토콜과 프로토콜의 버전기록
  • Status Code
    요청의 성공 여부, 그 이유를 알려주는 상태 코드
  • Status Message
    아무런 영향력이 없는, 응답에 더해져 온 메시지. 서버측에서 자의적으로 결정한다.
  • Headers
    요청 헤더와 비슷한 HTTP 헤더

마치며,

HTTP에 대한 전반적인 것을 훑어보는 시간을 가졌다. 이전에 알고있던 내용들이었지만, 좀 더 상세하게 살펴볼 수 있는 시간을 가졌다. 이후에 서적을 통해서 추가적인 내용을 알게되면 이 페이지를 통해서 정리해놔야겠다. 너무 당연한 이야기들이지만 나한테는 당연하지 않은 것 같다. 요즘 조던 피터슨 형님 덕분에 삶의 의욕을 얻고 있다.. 힘내야지..

References
MDN Documentation - HTTP is SIMPLE

profile
만물에 관심이 많은 잡학지식사전이자, 새로운 도전을 꿈꾸는 주니어 개발자 / 잡학지식에서 벗어나서 전문성을 가진 엔지니어로 거듭나자!
post-custom-banner

0개의 댓글