전성빈의 사리사욕

[HTTP는 무엇일까] HTTP란? 본문

백엔드 로드맵따라가기/인터넷

[HTTP는 무엇일까] HTTP란?

Been2 2020. 7. 30. 23:57
728x90

HTTP(HyperText Transfer Protocol)란?

 

HTTP는 WWW(World Wide Web)에서 HTML문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜이다.

HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이다.

 

클라이언트(보통 브라우저 크롬, IE 등)에서 전송되는 메시지를 요청(Request)라 부르며

이에 응답하는 서버측 메시지를 응답(Response)라 부른다.

 

HTTP는 TCP/IP 계층의 순서로 네트워크에 접근하게 되는데, 이 중 4계층(Application Layer)에 속해있으며, 이론상 신뢰가능한 전송 프로토콜이면 무엇이든 사용할 수 있지만, TCP 혹은 암호화된 TCP연결인 TLS를 통해 전송됩니다.

 

 

HTTP 기반 시스템의 구성요소

 

HTTP는 클라이언트-서버 프로토콜입니다. 요청은 사용자 에이전트에 의해 전송됩니다. 사용자 에이전트는 대부분의 경우 브라우저 이지만, 프록시나 크롤링을 위한 robot일 경우도 있습니다.

 

각각의 개별적인 요청들은 서버로 보내지며, 서버는 요청을 처리하고 Response라고 불리는 응답을 제공합니다.

이러한 과정에는 여러 개체들이 있는데 게이트웨이 또는 캐시 역할을 하는 프록시등이 있습니다 

 

proxy의 존재

 

 

실제로는 클라이언트와 프록시, 서버 외에도 더 많은 컴퓨터들을 필요로 하는데 모뎀이나 라우터가 있습니다.

웹의 계층적인 설계 덕분에 이들은 숨겨지며 HTTP의 내용과는 거의 관련이 없습니다.

 

 

서로 다른 계층은 신경쓰지 않는다

 

 

클라이언트 : 사용자 에이전트

 

사용자 에이전트는 사용자를 대신하여 동작하는 모든 도구입니다. 주로 웹 브라우저이며 개발자들의 프로그램등도 있을 수 있습니다.

 

브라우저는 웹 페이지를 표시하기위해 HTML문서에 대한 요청을 보내고 구문 분석을 한뒤 필요한 스크립트, 이미지, 비디오, CSS등을 추가로 요청하여 가져옵니다. 그런 뒤 리소스들을 분석하고 혼합하여 완전한 문서인 웹 페이지를 표시합니다.

 

 

웹 서버

 

클라이언트에 반대편에서 요청에 대해 응답을 하는 컴퓨터가 서버 입니다. 서버는 논리적으로는 단일 기계이지만 아닐 수 있습니다. 요청이 많아지면 트래픽을 분산 해야하거나(로드 혹은 로드 밸런싱) 다른 서버(캐시, DB 등)로 부터 정보를 얻어 문서를 생성하기 때문에 여러 대의 컴퓨터가 필요할 수 있기 때문입니다.

 

 

프록시(대행)

 

프록시는 클라이언트와 서버 사이에서 통신을 도와주는 도구들 중 TCP/IP계층에서 Application계층에 해당하는 것들입니다. 이들은 캐싱, 필터링, 인증, 로깅등을 하며 HTTP 메시지를 전달하는데 이는 눈에 보이거나(ex. 자녀보호 기능으로 인한 차단, 로그인으로 인한 접근 불허) 보이지 않습니다(ex. 많은 사람의 요청을 여러대의 컴퓨터가 응답, 캐싱, 이력 정보 저장).

 

 

HTTP의 기초적인 측면

 

HTTP의 확장 가능성

 

HTTP 헤더는 HTTP를 확장하기 쉽게 만들어줍니다. 클라이언트와 서버가 새로운 내용에대해 합의하면 언제든지 새로운 기능을 추가할 수 있습니다.

 

 

HTTP의 상태

 

HTTP는 상태를 저장하지 않습니다(Stateless). 같은 사이트에 접속한 후 연속으로 요청하더라도 서로 연결고리가 존재하지 않고 서버는 이전 요청에 대해 알지 못합니다. 이러한 특징은 장바구니와 같은 기능을 필요로 할 때 문제가 생깁니다.

 

이러한 문제는 HTTP의 쿠키를 통해 세션을 만들어 해결할 수 있습니다.

헤더 확장성을 통해 쿠키라는 내용을 추가해주어 상태를 기억할 수 있습니다.

 

HTTP와 연결

 

HTTP는 TCP/IP계층에 따라 Application계층에 존재하므로 전송 계층에 의해 제어되는 연결은 HTTP의 영역 밖입니다.

단지 신뢰할 수 있거나, 메시지에 손실을 최소하 하는 연결을 요구할 뿐입니다. 인터넷에서 가장 일반적인 두개의 전송 프로토콜 중 TCP는 신뢰할 수 있느나 UDP는 신뢰할 수 없습니다. 따라서 TCP를 사용하기 때문에 TCP 표준에 의존합니다.

 

클라이언트는 HTTP Request를 보내기전에 TCP 연결을 요구 합니다. 따라서 HTTP/1.0의 기본동작은 각 요청에 대해TCP연결을 여는것입니다. 하지만 이는 여러번에 요청마다 TCP연결을 요구하니 효율적이지 못합니다.

 

이러한 문제를 해결하기 위해 HTTP/1.1 부터는 파이프라이닝 개념과 지속적인 연결의 개념을 도입했습니다.

HTTP/2.0부터는 더욱 지속가능하고 효율적인 연결을 위해 단일 연결 상에서 다중 메시지 전송기능을 도입했습니다.

 

 

HTTP 흐름

 

Client가 서버와 통신하려 할 때, 최종 서버든 중간 프록시든 상관없이 다음과 같은 과정을 수행합니다.

 

  1. TCP연결을 엽니다 : TCP 연결은 Request를 보내거나 Response를 받는 용도로 사용합니다.

     클라이언트는 새 연결을 만들거나 기존의 연결을 사용하거나 서버에 대한 여러 TCP 연결을 열 수 있습니다.

 

  2. HTTP메시지 전송 : 서버에 요청하는 정보를 담은 HTTP Request를 보냅니다. HTTP/2.0 이전의 버전들은 사람이 볼 수 있습니다. 2.0 이상의 버전에서는 이러한 정보들을 캡슐화를 통해 직접 읽는게 불가능 하지만 원칙은 동일합니다.

 

  3. 서버에 의해 전송된 응답을 읽어들입니다.(Request)

 

  4. TCP 연결을 닫거나 다른 요청들을 보내기 위해 재사용합니다.

 

 

결론

 

HTTP는 사용이 쉬운 확장 가능한 프로토콜입니다. 헤더를 쉽게 추가할 수 있는 Client-Server 구조는 HTTP가 웹의 확장된 수용력과 함께 발전할 수 있게 합니다.

HTTP/2가 성능 향상을 위해 HTTP 메시지를 프레임 내로 임베드하여 복잡해졌지만 Application관점으로 볼 때 메시지의 구조는 이전 버전들과 동일합니다. 여전이 흐름은 단순하며 간단한 메시지 모니터를 이용한 조사와 디버그를 가능하게 해줍니다.

 

 

 

출처 : https://developer.mozilla.org/ko/docs/Web/HTTP

 

찾아 볼만한 키워드 : [TCP/IP, OSI 7계층, 게이트웨이, 캐시, 프록시]

728x90