HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜이다.
HTTP 개요
HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 하다.
클라이언트-서버 프로토콜이란 (보통 웹 브라우저인) 수신자 측에 의해 요청이 초기화되는 프로토콜을 의미한다.
즉, 웹 통신에서는 정보를 받고 싶은 쪽이 먼저 요청을 보내야, 서버가 응답한다는 이야기이다.
* 컴퓨터 과학이나 네트워크에서 initiate는 흔히 "어떤 행위를 먼저 시작한다"는 기술 용어이다.
하나의 완전한 문서는 텍스트, 레이아웃 설명, 이미지, 비디오, 스크립트 등 불러온(fetched) 하위 문서들로 재구성 된다.
클라이언트와 서버들은 개별적인 메시지 교환에 의해 통신한다. 보통 브라우저인 클라이언트에 의해 전송되는 메시지를 요청(requests)이라고 부르며, 그에 대해 서버에서 응답으로 전송되는 메시지를 응답(responses)이라고 부른다.
HTTP 확장성
HTTP는 확장 가능한 프로토콜이다. 이론상으로는 신뢰 가능한 전송 프로토콜이라면 무엇이든 사용할 수 있으나 실제로는 거의 항상 TCP 혹은 암호화된 TCP 연결인 TLS를 통해 전송된다.
HTTP의 확장성 덕분에, 오늘날 Hypertext 문서 뿐만 아니라 이미지와 비디오 혹은 HTML 품 결과와 같은 내용을 서버로 포스트(POST)하기 위해서도 사용된다.
HTTP는 또한 필요할 때마다 웹 페이지를 갱신하기 위해 문서의 일부를 가져온데 사용될 수도 있다. (전체를 다 로딩하지 않고 일부만 로딩하는 방식 - AJAX, fetch API 등)
HTTP 기반 시스템의 구성 요소
요청은 하나의 개체, 사용자 에이전트(또는 그것을 대신하는 프록시)에 의해 전송된다.
대부분의 경우, 사용자 에이전트(User-Agent)는 브라우저 이지만, 무엇이든 될 수 있다. (ex. 검진 엔진 인덱스를 채워 넣고 유지하기 위해 웹을 돌아다니는 로봇 - 구글봇)
► Client: User-Agent
User-Agent 형태
User-Agent: [소프트웨어 이름 및 버전] [운영체제 정보] [엔진 정보] ...
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/123.0.0.0 Safari/537.36
에이전트는 사용자를 대신하여 동작하는 모든 도구이다. 이 역할은 주로 브라우저에 의해 수행된다. (엔지니어들과 자신들의 애플리케이션을 디버그하는 웹 개발자들이 사용하는 프로그램은 예외)
► Web Server
통신 채널의 반대편에는 클라이언트에 의한 요청에 대한 문서를 제공하는 서버가 존재한다.
서버는 사실 상 논리적으로 단일 기계이다. 이는 로드(로드 밸런싱) 혹은 그때 그때 다른 컴퓨터들의 정보를 얻고 완전하게 혹은 부분적으로 문서를 생성하는 소프트웨어의 복잡한 부분을 공유하는 서버들의 집합일 수도 있기 때문이다.
서버는 반드시 단일 머신일 필요는 없지만, 여러 개의 서버를 통일한 머신 위에서 호스팅 할 수는 있다. (ex. 로드 밸싱, 클러스터링)
간단히 말하면, 트래픽을 분산하기 위하여 클라이언트 요청에 응답하는 서버가 여러 대의 컴퓨터로 구성될 수 있다는 이야기이다. (사용자에게는 논리적으로 하나의 서버처럼 보인다.)
로드 밸런서
클라이언트 | ||
사용중 | ↓ 대기중 | ↘︎ 대기중 |
서버 | 서버 | 서버 |
각각의 개별적인 요청들은 서버로 보내지며 서버는 요청을 처리하고 response라고 불리는 응답을 제공한다. 이 요청 사이에는 다양한 작업을 수행하는 게이트웨이 또는 캐시 역할을 하는 프록시 등이 있다.
Client | → | Proxy | → | Proxy | → | Server |
Client | ← | Proxy | ← | Proxy | ← | Server |
게이트웨이
서로 다른 네트워크 환경이나 프로토콜을 연결해주는 번역기
캐시
자주 쓰는 데이터를 임시로 저장해서 빠르게 응답하기 위한 저장소
► 프록시
사용자 대신 요청을 대신 보내주는 중재자.
요청을 감추거나 필터링하거나 캐시하거나 기록할 수 있다.
전송, 네트워크 혹은 물리 계층에서 동작하며, 성능에 상당히 큰 영향을 주지만 HTTP 계층에서는 이들이 어떻게 동작하는지 눈에 보이지 않는다. 이러한 컴퓨터/머신 중에서는 애플리케이션 계층에서 동작하는 것들을 일반적으로 프록시라고 부른다.
특징
- 캐싱 (캐시는 공개 또는 비공개가 될 수 있다)
- 필터링 (바이러스 백신 스캔, 유해 컨텐츠 차단 기능)
- 로드 밸런싱 (여러 서버들이 서로 다른 요청을 처리하도록 허용)
- 인증 (다양한 리소스에 대한 접근 제어)
- 로깅 (이력 정보를 저장)
종류
- 포워드 프록시 : 사용자가 외부 서버에서 요청을 보낼 때, 사용자 앞에 있는 중재자
- 리버스 프록시 : 외부 요청을 내부 서버로 전달할 때 서버 앞에 있는 중재자
프록시가 여러 개인 이유
- 보안, 캐시, 속도, 분산 처리 등 다양한 목적
HTTP의 기초적인 측면
HTTP는 간단하다
- 프레임별로 캡슐화하여 간결함 유지
HTTP는 확장 가능하다
- HTTP를 확장하고 실험하기 쉽게 만들었다.
- 클라이언트와 서버가 새로운 헤더의 시맨틱에 대해 간단한 합의만 한다면, 언제든지 새로운 기능을 추가할 수 있다.
HTTP는 상태는 없지만 세션은 있다.
- HTTP는 상태를 저장하지 않는다. (Stateless)
- 동일한 연결 상에서 연속으로 전달된 두 개의 요청 사이에는 연결고리가 없다.
- 이는 일관된 방식으로 사용자가 페이지와 상호작용하기 원할 때 문제가 된다.
- 해당 문제는 HTTP 쿠키로 해결된다. 헤더 확장성을 사용하여 동일한 컨텍스트 또는 동일한 상태를 고유하기 위해 각각의 요청들에 세션을 만들도록 HTTP 쿠키가 추가된다.
HTTP와 연결
- HTTP는 전송 계층 위에 존재하는 애플리케이션 계층 프로토콜
- HTTP 자체는 연결을 직접 만들거나 관리하지 않는다
- 대신 신뢰성 있는 연결(ex. TCP)을 요구하는 구조이다.
- TCP는 신뢰성이 보장되고 연결 지향적이지만, UDP는 신뢰성이 없고 비연결을 지향한다
- 따라서 요청/응답의 정확성, 순서, 손실방지가 중요한 HTTP는 TCP 기반이다.
버전에 따른 연결 방식 변화
- HTTP/1.0
- 요청 1개당 1개의 TCP 연결
- 재사용 안함
- HTTP/1.1
- 지속 연결 사용
- 한 번 연결되면 여러 요청/응답 주고 받기 가능
- HTTP/2
- 단일 TCP 연결 위에 요청을 다중 전송
- 하나의 연결로 동시에 여러 요청을 병렬 처리 가능
- HTTP/3
- TCP대신 UDP 기반의 QUIC 프로토콜 사용
- TCP 단점 해소 (지연, 헤드-오브라인 블로킹 등)
- 연결 손실 시도해도 유지가 더 빠름
HTTP로 제어할 수 있는 것
- 캐시
- origin 제약사항을 완화하기
- 인증
- 프록시와 터널링
- 세션
HTTP 흐름
1. TCP 연결 (새로 연결을 열거나, 기존 연결을 재사용하거나)
2. HTTP 메시지를 전송
3. 서버에 의해 전송된 응답 읽어드리기
4. 연결을 닫거나 다른 요청을 위해 재사용
HTTP 메시지
요청
- HTTP 보통 클라이언트가 수행하고자 하는 동작을 정의한 GET, POST 같은 동사나 OPTIONS 나 HEAD와 같은 명사이다.
- 가져오려는 리소스의 경로 (ex. 프로토콜 http://, 도메인 developer.mozilla.org, 또는 TCP 포트(80)인 요소들을 제거한 리소스 URL)
- HTTP 프로토콜의 버전
- 서버에 대한 추가 정보를 전달하는 선택적 헤더들
- POST와 같은 몇 가지 메서드를 위한, 전송된 리소스를 포함하는 응답의 본문과 유사한 본문
응답
- HTTP 프로토콜 버전 HTTP/1.1
- 요청 성공 여부와, 그 이유를 나타내는 상태 코드(Status code) 200
- 아무런 영향력이 없는, 상태 코드의 짧은 설명을 나타내는 상태 메시지(Status message) OK
- 요청 헤더와 비슷한, HTTP 헤더들
- 선택 사항으로 가져온 리소스가 포함되는 본문
참고 문서
https://developer.mozilla.org/ko/docs/Web/HTTP/Guides/Overview
HTTP 개요 - HTTP | MDN
HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜입니다. HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 합니다. 클라이언트-서버
developer.mozilla.org
'개발 지식 > 기본지식' 카테고리의 다른 글
호스팅이란 (0) | 2025.05.02 |
---|---|
도메인 이름이란? (0) | 2025.05.02 |
DNS와 그 작동 원리 (0) | 2025.04.30 |
브라우저는 어떻게 동작하는가 (3) | 2025.04.30 |
인터넷은 어떻게 동작하는가 (2) | 2025.04.24 |