HTTP(Hyper Text Transfer Protocol)는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜이다.
HTTP는 웹에서 이뤄지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 하다. 클라이언트-서버 프로토콜이란 수신자 측에 의해 요청이 초기화되는 프로토콜을 의미한다.
여기서 하이퍼 텍스트란 참조를 통해 독자가 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트다. 기존의 문서가 순차적이면서 서열형 구조라면, 하이퍼 텍스트는 링크에 따라 그 차례가 바뀌는 임의적이면서 나열형인 구조를 가진다. 즉, 하이퍼 텍스트는 다른 문서와 연결된 링크의 모음으로 구성된 문서이다. 대표적으로 HTML이 하이퍼텍스트를 표현하기 위한 마크업 언어로 사용된다. 그렇기에 HTTP는 HTML과 같은 문서를 전송하기 위해 사용되는 프로토콜인 것이다. 또한 이는 OSI 7 계층에서 응용 계층에 존재한다.
HTTP는 클라이언트가 요청(Request)하면 서버에서 해당 요청 사항에 맞는 결과를 사용자에게 응답(Response)하는 형태로 동작한다. 요청은 하나의 개체, 사용자 에이전트(또는 프록시)에 의해 전송된다. 대부분 사용자 에이전트는 브라우저이고, 무엇이든 될 수도 있다. 각각의 개별적인 요청들은 서버로 보내지며, 서버는 요청을 처리하고 Response를 제공한다.
여기서 클라이언트는 사용자 에이전트로, 사용자를 대신하여 동작하는 모든 도구라고 볼 수 있다. 일반적으로 브라우저이다. 브라우저는 항상 요청을 보내는 개체다. 즉, 서버가 될 수는 없다는 것이다.
웹 서버는 클라이언트의 요청에 대한 문서를 제공한다. 논리적으로는 단일한 기계이지만 로드 밸런싱 또는 캐시, DB 서버, e-커머스 서버 등 그때 그때 다른 컴퓨터들의 정보를 얻고 문서를 생성하는 소프트웨어의 복잡한 부분을 공유하는 서버들의 집합일 수 있다.
프록시는 일반적으로 웹 브라우저와 서버 사이에 애플리케이션 계층에서 동작하는 것들을 일컫는다. 이를 통해 웹 브라우저와 서버가 HTTP 메시지를 이어 받고 전달한다.
HTTP의 특징은 다음과 같다.
1. 간단하다.
HTTP는 사람이 읽을 수 있으며 간단하게 고안되었다. HTTP 메시지들은 사람이 읽고 이해할 수 있어서 테스트하기 쉽다는 특징이 있다.
2. 확장 가능하다.
HTTP헤더는 HTTP를 확장하고 실험하기 쉽게 만들어 주었다. 클라이언트와 서버가 새로운 헤더의 시맨틱(semantic)에 대해 간단한 합의만 한다면, 언제든 새로운 기능을 추가할 수 있다.
3. 무상태지만 세션은 있다.
HTTP는 상태를 저장하지 않는다. 즉, Stateless하다. 동일한 연결 상에서 연속된 두 개의 요청 사이에는 연결 고리가 없다. 이는 일관된 방식으로 사용자가 페이지와 상호작용하길 원할 때 문제가 된다. 하지만 HTTP 쿠키는 상태가 있는 세션을 만들도록 해준다. 헤더 확장성을 사용해서 동일한 상태를 공유하기 위해 각각의 요청에 세션을 만들도록 HTTP 쿠키가 추가될 수 있다.
4. 연결
HTTP/1.0의 기본 동작은 각 요청/응답에 대해 별도의 TCP 연결을 여는 것이다. 즉, 요청과 응답을 한 번 주고 받으면 바로 연결을 종료한다는 것이다. 이는 불필요한 연결을 최소화할 수 있어 서버 유지 차원에서는 효율적이지만 여러 요청을 연속해서 보내는 경우 효율적이지 못하다.
이러한 결함을 개선하기 위해 HTTP/1.1은 파이프라이닝 개념과 지속적인 연결 개념을 도입했다. 기본적인 TCP 연결은 Connection 헤더를 사용해 부분적으로 제어할 수 있는 것이다. 더 나아가 HTTP/2 에서는 연결을 좀 더 지속되고 효율적으로 유지하는데 도움이 되도록, 단일 연결 상에서 메시지를 다중 전송하여 더욱 발전했다.
이러한 HTTP 로 제어할 수 있는 것은 다음과 같다.
1. 캐시
HTTP로 문서가 캐시되는 방식을 제어할 수 있다. 서버는 캐시 대상과 기간을 프록시와 클라이언트에게 지시할 수 있고 클라이언트는 지정된 문서를 무시하라고 중간 캐시 프록시에게 지시할 수 있다.
2. Origin 제약 사항 완화
스누핑과 다른 프라이버시 침해를 막기 위해 브라우저는 웹 사이트 간의 엄격한 분리를 강제한다. 동일한 Origin으로부터 온 페이지만이 웹 페이지의 전체 정보에 접근할 수 있는 것이다. 그런 제약 사항은 서버에 부담이 되기 때문에 HTTP 헤더를 통해 그것을 완화시킬 수 있다.
3. 인증
어떤 페이지에 대해 특정 사용자만 접근하도록 할 수 있다. 기본 인증은 HTTP를통해 WWW-Authenticate 또는 유사한 헤더를 사용해 제공되거나, HTTP 쿠키를 사용해 특정 세션을 설정하여 이뤄질 수 있다.
4. 프록시와 터널링
서버 혹은 클라이언트 또는 둘 다 종종 인트라넷에 위치하며 다른 개체들에게 실제 주소를 숨기기도 한다. HTTP 요청은 네트워크 장벽을 가로지르기 위해 프록시를 통해 나가게 된다.
프록시는 요청이 프록시의 IP 주소에서 시작된 것처럼 보이게 할 수 있기 때문에 클라이언트 익명성을 제공할 수 있는 것이다.
터널링은 사설망 데이터와 프로토콜 정보를 캡슐화하여 공용 네트워크를 통해 전송한다. HTTP 터널링은 상위 수준 프로토콜(HTTP)을 사용하여 하위 수준 프로토콜(TCP)을 전송하는 것이다.
5. 세션
쿠키를 사용하는 것은 서버 상태를 요청과 연결하도록 해준다. 이로 인해 HTTP가 기본적으로 Stateless 프로토콜임에도 세션을 만들어 줄 수 있는 것이다.
하이퍼텍스트 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
HTTP 개요 - HTTP | MDN (mozilla.org)
'이론 > IT' 카테고리의 다른 글
암호화 개념 (1) | 2023.11.22 |
---|---|
HTTPS (0) | 2023.11.22 |
RESTful API (2) | 2023.11.22 |
REST (0) | 2023.11.21 |
클라우드 스토리지 솔루션 (1) | 2023.11.12 |