이론공부/네트워크통신

HTTP는 무엇인가?

멍토 2020. 8. 9.

출처 : https://ko.wikipedia.org/wiki/HTTP

 

HTTP - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. HTTP(HyperText Transfer Protocol, 문화어: 초본문전송규약, 하이퍼본문전송규약)는 W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 ��

ko.wikipedia.org

https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP

 

HTTP 기본

HTTP는 상당히 확장 가능한 프로토콜입니다. 자원과 URI의 개념, 메시지의 단순한 구조, 통신 흐름을 위한 클라이언트-서버 구조와 같은 몇 가지 기본 개념에 의존합니다. 이러한 기본 개념을 토대

developer.mozilla.org

 


 

1. HTTP는 HyperText Transfer Protocol의 약자로 W3(World Wide Web)상에서 정보를주고 받을 수 있는 프로토콜이다.



2. HTTP는 클라이언트와 서버 사이에 이루어지는 요청(request)/응답(response) 프로토콜이다.

클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지나 그림정보를 요청하면,

서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다.




3. HTTP는 HTML문서와 같은 리로스들을 가져올 수 있도록 해주는 프로토콜이다.

HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 하다.

클라이언트-서버 프로토콜이란 (보통 웹 브라우저인)수신자 측에 의해 요청이 초기화 되는 프로토콜을 의미한다.

하나의 완전한 문서는 텍스트, 레이아웃 설명, 이미지, 비디오, 스크립트 등 불러온 (fetched) 하위 문서들로 재구성된다.


4. HTTP는 1990년대 초에 설계되었으며 거듭하여 진화해온 확장 가능한 프로토콜이다.

HTTP는 애플리케이션 계층(OSI 7계층)의 프로토콜로, 신뢰 가능한 전송 프로토콜이라면

이론상으로는 무엇이든 사용할 수 있으나 TCP 혹은 암호화된 TCP연결인 TLS를 통해 전송된다.

HTTP의 확장성 덕분에, 오늘날 하이퍼텍스트 문서 뿐만 아니라 이미지와 비디오,

HTML폼 결과 같은 내용을 서버로 POST하기 위해서도 사용된다.

HTTP는 또한 필요할때마다 웹 페이지를 갱신하기 위해 문서의 일부를 가져오는데 사용될 수도 있다.(AJAX)

 


HTTP 기반 시스템의 구성요소

요청은 하나의 개체, 사용자 에이전트(혹은 프록시)에 의해 전송된다.

대부분의 경우 사용자 에이전트는 브라우저지만 무엇이든 될 수 있다.(ex : 검색엔진 봇)


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

이 요청과 응답 사이에는 여러 개체들이 있는데,

다양한 작업을 수행하는 게이트웨이 또는 캐시 역할을 하는 프록시 등이 있다.

실제로 브라우저와 요청을 처리하는 서버 사이에는 좀 더 많은 컴퓨터(라우터, 모뎀)들이 존재한다.

웹의 계층적인 설계(OSI 7계층)덕분에 이들은 네트워크와 전송계층내로 숨겨진다.

 


HTTP의 기초적인 측면

HTTP는 간단하다.


HTTP는 사람이 읽을 수 있으며 간단하게 고안되어있다.

HTTP/2가 다소 복잡해졌지만 여전히 메시지를 프레임별로 캡슐화하여 간결함을 유지했다.

HTTP는 확장이 가능하다.


HTTP/1.0에서 소개된, HTTP 헤더는 HTTP를 확장하고 실험하기 쉽게 만들어 주었다.

클라이언트와 서버가 새로운 헤더의 시맨틱에 대해 간단한 합의만 한다면, 언제든지 새로운 기능을 추가 할 수 있습니다.
HTTP는 상태가 없는대신 세션이 있다.


HTTP는 상태를 저장하지 않는다.(Stateless)

동일한 열경 상에서 연속하여 전달된 두 개의 요청 사이에는 연결고리가 없다.

이러한 특성은 일관된 방식으로 사용자가 페이지와 상호작용하길 원할때 문제가 생긴다

그래서 HTTP쿠키는 상태가 있는 세션을 만들도록 해준다.

헤더 확장성을 사용하여, 동일한 컨텍스트 또는 동일한 상태를 공유하기 위해 각각의 요청들에 세션을 만들도록

HTTP 쿠키가 추가된다.
HTTP와 연결


연결은 전송계층(OSI 7계층 4레이어)에서 제어되므로 근본적으로 HTTP영역 밖이다.

다만 그저 신뢰할 수 있거나 메시지 손실이 없는 연결을 요구한다.

그러므로 HTTP는 연결이 필수는 아니지만 연결 기반인 TCP 표준에 의존한다.


클라이언트와 서버가 HTTP를 요청/응답으로 교환하기 전에 여러 왕복이 필요한 프로세스인 TCP를 설정해야 한다.
(3way handshake)

HTTP/1.0의 기본동작은 각 요청/응답에 대해 별도의 TCP연결을 여는 것이다.

이러한 동작은 여러 요청을 연속해서 보내는 경우에 단일 TCP 연결을 공유하는 것보다 효율적이지 못하다.


이러한 결함을 개선하기 위해 HTTP/1.1은 파이프라이닝 개념과 지속적인 연결의 개념을 도입했다.

기본적인 TCP 연결은 Connection 헤더를 사용해 부분적으로 제어할 수 있다.


HTTP/2는 연결을 좀더 지속되고 효율적으로 유지하는데 도움이 되도록,

단일 연결상에서 메시지를 다중전송(multiplex)하여 한걸음 더 나아갔다.

 


HTTP로 제어할 수 있는 것

캐시


HTTP로 문서가 캐시되는 방식을 제어할 수 있다.

서버는 캐시 대상과 기간을 프록시와 클라이언트에 지시할 수 있고

클라이언트는 저장된 문서를 무시하라고 중간 캐시 프록시에게 지시할 수 있다.
origin제약사항 완화하기


스누핑과 다른 프라이버시 침해를 막기위해, 브라우저는 웹 사이트간의 엄격한 분리를 강제한다.

동일한 origin으로부터 온 페이지만 웹 페이지의 전체 정보에 접근할 수 있는것이다.

그런 제약사항은 서버에 부담되지만, HTTP 헤더를 통해 그것을 완화시킬 수 있다.

그런 덕분에 문서는 다른 도메인으로부터 전달된 정보를 패치워크(작은 천들을 큰 디자인으로 조립)할 수 있다.
(AJAX라고 판단됨)


인증


어떤 페이지들은 보호되어 특정 사용자만이 접근할 수도 있다.

기본 인증은 HTTP를 통해 WWW-Authenticate 또는 유사한 헤더를 사용해 제공되거나,

HTTP쿠키를 사용해 특정 세션을 설정하여 이루어질 수도 있다.
프록시와 터널링(좀더 보강이 필요함)


서버 혹은 클라이언트 들은 다른 개체들에게 실제 주소를 숨기기도 한다.

HTTP 요청은 네트워크 장벽을 가로지르기 위해 프록시를 통해 나가게 된다.

모든 프록시가 HTTP 프록시는 아니다.
(SOCKS(Socket Secure)프로토콜은 좀더 저수준에서 동작)

FTP(File Transfer Protocol)와 같은 다른 프로토콜도 이 프록시를 통해 처리될 수 있다.

세션

쿠키 사용은 상태를 서버와 연결하도록 해준다.

이것은 HTTP가 기본적으로 stateless임에도 세션을 만들어주는 이유이다.


HTTP 흐름

클라이언트가 서버와 통신하고자 할때, 최종서버가 돼었든 중간 프록시가 돼었든 아래과정을 수행한다.


1. TCP 연결을 연다.

TCP 연결은 요청을 보내거나(혹은 여러개) 응답을 받는데 사용된다.

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


2. HTTP 메시지를 전송한다.

HTTP/2에서는 이런 간단한 메시지가 프레임속으로 캡슐화되어 직접 읽는게 불가능하지만 원칙은 동일하다.


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


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

HTTP 파이프라이닝이 활성화되면, 첫번째 응답을 완전히 수신할 때까지 기다리지 않고 여러 요청을 보낼 수 있다.

HTTP 파이프라이닝은 오래된 소프트웨어와 최신 버전이 공존하고 있는 기존 네트워크상에서 구현하기 어렵다

따라서 프레임안에서 보다 활발한 다중 요청을 보내는 HTTP/2로 교체되고 있다.

 


 

클라이언트와 서버 사이의 소통은 데이터 스트림과 대조적으로 평문(ASCII) 메시지로 이루어진다.

클라이언트는 서버로부터 요청메시지를 전달하면 서버는 응답메시지를 보낸다.




댓글

💲 광고입니다.