HTTP(Hyper Text Transfer Protocol)란 클라이언트와 서버가 서로 데이터를 주고받기 위해 사용되는 통신 규약이다. 웹 문서 간에 링크를 통해 연결할 수 있는 프로토콜이며, 문서뿐 아니라 HTML이나 TEXT, 이미지, 음성, 영상, 파일, JSON, XML(API) 등 여러 종류의 데이터들을 폭 넓게 전송할 수 있다.
따라서 서버 간에 데이터를 주고받을 때 대부분 HTTP라는 프로토콜을 사용해 통신한다고 봐도 무방하다. 예를 들어 인터넷 주소를 지정할 때 http://www.naver.com와 같이 시작하는 것은 www.naver.com이라는 인터넷 주소가 가진 데이터 정보 등의 교환을 HTTP의 통신 규약대로 처리하라는 것을 의미한다고 볼 수 있다.
cf) 인터넷 기반 서비스에는 HTTP 외에도 Email, FTP, DNS, NEWS 등이 있다.
HTTP의 역사
HTTP는 1991년 HTTP/0.9가 등장한 이래로 현재 가장 많이 사용되는 1997년의 HTTP/1.1, 2015년의 HTTP/2.0, 2019년에 등장한 HTTP/3.0으로 발전해 왔다. 이중 우리가 아는 대부분의 HTTP 기능은 1.1에 구현된 것이며 2.0과 3.0에서는 성능 개선에 초점이 맞춰져 있다.
- HTTP/1.1: 현재 가장 많이 사용되며 대부분의 기능이 추가됨. TCP 사용.
- HTTP/2.0: 성능 개선. TCP 사용.
- HTTP/3.0: 현재 진행형. TCP 대신 UDP를 이용한 QUIC 프로토콜 사용.
개발자도구에서 HTTP 버전 확인하기
브라우저 개발자도구의 네트워크 탭에서는 페이지 요청에 대한 프로토콜을 확인할 수 있다. 아래는 구글에서 아무 단어나 검색했을 때의 네트워크 탭 상태로 요청 프로토콜 h3은 HTTP/3.0의, h2는 HTTP/2.0의 약어이다.
HTTP의 통신 구조
HTTP 통신은 클라이언트(Front-end)와 서버(Back-end)로 구성되어 있다. 클라이언트가 요청(Request)을 하면 서버가 응답(Response)하는 것이다. 예를 들어 클라이언트는 HTTP 메시지를 만들어 보내고 서버에서 그 요청에 대한 응답이 올 때까지 기다린다. 그리고 서버는 요청에 대한 결과를 만들어 응답하는 것.
그렇다면 HTTP 통신을 하는 데 있어 왜 이렇게 클라이언트와 서버를 분리해야만 하는 걸까?
이유는 각자의 역할에 집중할 수 있기 때문이다. 이들을 분리함으로써 클라이언트에서는 복잡한 비즈니스 로직이나 데이터를 다룰 필요가 없고 UI를 그리는 데 집중할 수 있다. 반면 서버에서는 비즈니스 로직이나 데이터를 다루는 데에만 집중하면 되는 것이다. 즉, 클라이언트와 서버를 독립적으로 구분한다는 것은 역할을 나눠 각자의 분야에만 집중하며 클라이언트와 서버 양쪽이 각각 독립적으로 고도화할 수 있다는 것이다.
HTTP의 특징
1) 무상태성(Stateless)
HTTP는 상태를 유지하지 않는 Stateless 프로토콜이다. 따라서 서버는 각각의 요청을 별개의 것으로 처리하며 이전 요청의 정보를 저장하지 않는다. 이는 서버의 부하를 줄이고 클라이언트와 서버 간의 통신을 단순화하여 처리 속도를 향상시킨다.
2) 비연결성(Connectionless)
HTTP는 Connectionless 프로토콜이므로 요청과 응답이 한 번 이루어지면 연결을 끊는다. 이전 요청과 응답의 정보를 유지하지 않기 때문에 서버 부하를 줄일 수 있지만 새로운 연결을 맺는 데 드는 시간이 추가로 발생할 수 있다.
3) 클라이언트 서버 구조
HTTP는 Request/Response 구조로 통신한다. 클라이언트는 서버에 요청(Request)을 보내고 서버는 클라이언트에 응답(Response)을 보낸다. 이러한 요청과 응답은 HTTP 메시지라는 형식으로 주고받는다.
4) HTTP is simple
HTTP는 간단하고 사람이 읽기 쉽게 만들어졌다. 심지어 HTTP/2.0에서 다소 복잡해졌지만 여전히 HTTP 메시지를 프레임별로 캡슐화하여 간결함을 유지하고 있음. HTTP 메시지는 사람이 읽고 이해할 수 있으며 테스트하기 쉽고 초심자가 쉽게 배울 수 있다.
5) HTTP is extensible
HTTP/1.0에서 소개된 HTTP header 덕분에 HTTP는 확장성이 좋고 테스트하기 좋은 환경을 갖추고 있다. 클라이언트와 서버가 HTTP header 양식에 서로 간단한 합의만 한다면 새로운 기능이 쉽게 추가될 수 있다.
HTTP 기반 시스템의 구성요소
HTTP는 클라이언트-서버 프로토콜이다. 요청(Request)은 사용자 에이전트(또는 프록시)에 의해 전송되는데 여기서의 사용자 에이전트는 일반적으로 브라우저이다. 각각의 개별적인 요청은 서버로 전송되며 서버는 전달 받은 요청을 처리하고 응답(Response)을 제공한다. 그리고 이러한 요청과 응답 사이에는 다양한 작업을 수행하는 게이트웨이, 캐시 역할을 하는 프록시 등 여러 개체들이 존재한다.
실제 브라우저와 서버 사이에는 더 많은 구성요소(하드웨어, 라우터, 모뎀 등)가 존재하지만 웹의 계층적인 설계 덕분에 이들은 네트워크와 전송 계층 내로 숨겨진다. HTTP는 그중 애플리케이션 계층의 최상층에 위치하여 동작한다.
클라이언트: user-agent
user-agent는 사용자를 대신해 동작하는 모든 도구로, 이 역할은 주로 브라우저가 수행한다. 브라우저는 항상 요청을 보내는 개체이다.
웹 페이지를 표시하기 위해 브라우저는 먼저 HTML 문서를 가져오기 위한 요청을 전송한 뒤 그 파일을 파싱하여 스크립트와 CSS, 이미지 등 페이지에 필요한 하위 자원들을 가져오는 요청을 추가로 보낸다. 이후 이러한 자원들을 혼합하고 잘 배치하여 하나의 완전한 문서인 웹 페이지를 보여주는 것이다. 브라우저에 실행된 스크립트는 이후 좀 더 많은 리소스들을 가져올 수도 있고 그에 따라 브라우저는 웹 페이지를 갱신한다. 브라우저는 HTTP 요청 내에서 이러한 지시사항들을 변환하고 HTTP 응답을 해석하여 사용자에게 명확한 응답을 표시한다.
웹 서버(Web Server)
클라이언트의 입장에서 통신 채널의 반대편에는 클라이언트의 요청에 대한 문서 혹은 리소스를 제공하는 웹 서버가 존재한다. 서버는 사용자에게서 요청이 온 문서를 브라우저에 보여주는 역할을 한다. 서버는 하나의 컴퓨터인 것처럼 보이지만 여러 서버의 집합일 수도 있고 cache, DB server, e-commerce server 등과 같이 서로 다른 컴퓨터들과 부하를 나누는 집합체의 일부일 수도 있다.
즉 서버는 하나의 컴퓨터일 필요가 없고 여러 개의 서버 소프트웨어 인스턴스가 동일한 컴퓨터에서 호스팅될 수 있다. HTTP/1.1과 Host 헤더를 사용하면 여러 서버 프로그램이 하나의 IP 주소를 공유할 수 있다.
프록시(Proxies)
웹 브라우저와 서버 사이에는 수많은 컴퓨터와 기계들이 HTTP 메시지를 주고받는다. 여러 계층으로 이루어진 웹 스택 구조에서 컴퓨터와 기계들은 전송, 네트워크, 물리 계층에서 동작하며 성능에 큰 영향을 주지만 HTTP 계층에서는 이들이 어떻게 동작하는지 눈에 보이지 않는다. 이러한 컴퓨터나 기계들 중 애플리케이션 계층에서 동작하는 것들을 일반적으로 프 록시라고 부른다. 이러한 프록시는 아래와 같은 많은 기능들을 수행한다.
- 캐싱: 브라우저 캐시와 같이 공개되거나 숨겨질 수 있는 캐시
- 필터링: 바이러스 검사 또는 자녀 보호 필터링
- 부하 부산: 여러 개의 서버가 각각 다른 요청을 처리하도록 함
- 인증: 서로 다른 자원들에 대한 접근 제어
- 로깅: 로그 정보 기록
'WEB' 카테고리의 다른 글
[WEB] HTTP의 Connectionless (1) | 2024.10.14 |
---|---|
[WEB] HTTP의 Stateful과 Stateless (0) | 2024.10.11 |
[WEB] 웹 접근성(Web Accessibility) (0) | 2024.10.07 |
[WEB] 웹 표준(Web Standards) (1) | 2024.10.04 |
[WEB] 브라우저 렌더링 과정 바로 알기 (0) | 2024.08.02 |