최종 업데이트 07:21
소개 검색
SEOUL AI PRESS

AI와 기술을, 사실부터

강좌 강좌

브라우저와 서버는 어떻게 대화할까: HTTP 입문

MDN Web Docs

웹 페이지를 열 때 화면 뒤에서 무슨 일이 일어나는지 궁금했다면 이 강좌가 그 답이다. 브라우저와 서버가 주고받는 요청과 응답의 구조를 단계별로 따라가며 스스로 설명할 수 있게 된다.

한 문장으로 이해하기

HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 규약)는 클라이언트가 먼저 요청을 보내고 서버가 그에 맞는 응답을 돌려주는 규약이다. 이 규약으로 HTML(HyperText Markup Language, 웹 문서를 만드는 하이퍼텍스트 마크업 언어) 문서 같은 웹 자원을 주고받는다.

이 강좌의 학습 목표는 세 가지다. 첫째, HTTP가 클라이언트-서버 구조로 동작한다는 것을 이해한다. 둘째, 요청과 응답 메시지의 구성 요소를 설명할 수 있다. 셋째, HTTP가 무상태(stateless) 방식임을 이해하고 쿠키로 세션(session, 여러 요청이 같은 상태를 공유하도록 묶은 흐름)을 만들 수 있음을 설명할 수 있다. 사전 지식은 ‘브라우저에 주소를 입력하면 페이지가 열린다’는 경험이면 충분하다.

왜 필요한가

웹은 문서, 이미지, 동영상 같은 자원을 주고받는 공간이다. 이 교환이 이루어지려면 누가 자원을 요청하고 누가 그것을 돌려주는지, 메시지를 어떤 형식으로 쓸지가 정해져 있어야 한다. HTTP가 바로 그 규칙이다.

HTTP에서 클라이언트가 보내는 메시지를 요청(request), 서버가 그에 답해 보내는 메시지를 응답(response)이라고 부른다. HTTP는 웹 데이터 교환의 기반이며, 문서뿐 아니라 이미지와 동영상을 가져오거나 HTML 폼 결과 같은 콘텐츠를 서버에 보내는 데에도 쓰인다.

어떻게 이루어지는가

HTTP 통신에는 세 가지 역할이 있다.

클라이언트(user-agent, 사용자 에이전트) 는 사용자를 대신해 동작하는 도구로, 요청을 시작하는 주체다. 대부분 웹 브라우저가 이 역할을 맡는다. HTTP에서는 항상 클라이언트가 먼저 요청을 보낸다.

서버 는 클라이언트의 요청을 처리하고 응답을 돌려준다.

프록시(proxy) 는 클라이언트와 서버 사이에서 요청과 응답을 중계하는 중간 장치다. 프록시는 캐싱(caching, 자주 쓰는 자원을 미리 저장해 두는 기법), 필터링, 부하 분산, 인증, 로깅 같은 기능을 수행할 수 있다.

두 가지 특성을 기억하자. 첫째, HTTP는 무상태(stateless) 다. 연속된 두 요청이 서로 연결되지 않고 각각 독립적으로 처리된다. 둘째, 쿠키(cookie) 를 이용하면 여러 요청이 같은 상태를 공유하는 세션을 만들 수 있다. 또 HTTP는 신뢰할 수 있는 전송을 필요로 한다. 신뢰할 수 있는 전송이란 메시지를 잃지 않거나, 손실이 나면 최소한 오류를 알려주는 전송을 말한다. 그래서 HTTP는 일반적으로 TCP(Transmission Control Protocol, 전송 제어 프로토콜) 연결이나 TLS(Transport Layer Security, 암호화된 통신을 제공하는 전송 계층 보안)로 암호화된 TCP 연결 위에서 동작한다.

하나의 예시로 따라가기

가상 예시: 사용자가 브라우저 주소창에 http://example.com/index.html을 입력하는 상황을 따라가 보자. 아래 메시지 내용은 출처의 예시를 일반화한 것으로, 실제 서버의 응답과 똑같지 않을 수 있다.

  1. 연결 열기: 브라우저가 서버와 TCP 연결을 연다.
  2. 요청 전송: 브라우저가 요청 메시지를 보낸다. 메서드 GET(자원을 가져오는 동작), 자원 경로 /index.html, 프로토콜 버전 HTTP/1.1, 그리고 Host: example.com 같은 헤더(header, 메시지에 덧붙이는 추가 정보)로 구성된다. 일부 메서드에서는 본문도 함께 보낸다.
  3. 응답 수신: 서버가 응답 메시지를 돌려준다. 프로토콜 버전, 상태 코드(status code, 요청 처리 결과를 나타내는 코드) 200과 상태 메시지 OK(요청 성공을 뜻함), 헤더, 그리고 HTML 문서가 담긴 본문으로 구성된다.
  4. 추가 자원 요청: 브라우저는 받은 HTML을 해석하면서 추가 자원이 필요하면 같은 과정을 반복해 요청한다. 스크립트, CSS(웹 문서의 표시 방식과 배치를 지정하는 스타일 정보), 이미지, 동영상이 그 예다.
  5. 연결 종료 또는 재사용: 연결을 닫거나 다음 요청을 위해 재사용한다.

이 가상 예시에서는 연결, 요청, 응답, 추가 자원 요청, 연결 종료 또는 재사용의 순서로 진행된다.

언제 쓰고 언제 쓰지 않는가

HTTP가 쓰이는 상황은 분명하다. 브라우저와 서버 사이에서 문서, 이미지, 동영상을 가져오고 HTML 폼 결과 같은 콘텐츠를 서버에 보낼 때 적합하다.

다음은 HTTP를 쓰기 위한 적용 조건이다.

  • 요청은 클라이언트가 시작한다: HTTP에서는 클라이언트가 먼저 요청해야 서버가 응답한다. 이 구조를 전제로 설계된 규약이다.
  • 전송 조건: HTTP는 신뢰할 수 있는 전송 위에서 동작해야 하며, 일반적으로 TCP 또는 TLS로 암호화된 TCP를 사용한다.

다음은 한계와 흔한 오해다.

  • 한계 — 무상태: 서버는 연속된 두 요청을 연결하지 않고 각각 독립적으로 처리한다.
  • 오해 — 무상태라서 세션을 만들 수 없다?: 그렇지 않다. 무상태라는 말은 세션을 만들 수 없다는 뜻이 아니다. 쿠키를 이용하면 여러 요청이 같은 상태를 공유하는 세션을 구성할 수 있다.

마지막으로, 이 강좌의 입력 출처만으로는 HTTP가 부적합한 구체적인 상황까지 판단할 수 없다. 다만 클라이언트가 먼저 요청해야 한다는 구조와 신뢰할 수 있는 전송이 필요하다는 조건이 맞지 않는 환경이라면, HTTP를 그대로 적용하기 어렵다는 점은 규약의 정의에서 알 수 있다.

핵심 정리와 확인문제

HTTP는 클라이언트(브라우저)가 요청을 보내고 서버가 응답하는 방식으로 웹 자원을 주고받는 규약이다. 요청 메시지는 메서드, 자원 경로, 프로토콜 버전, 헤더, 일부 메서드에서 쓰는 본문으로 구성된다. 응답 메시지는 프로토콜 버전, 상태 코드, 상태 메시지, 헤더, 선택적 본문으로 구성된다. HTTP는 무상태이지만 쿠키를 이용하면 상태가 있는 세션을 만들 수 있다.

확인문제

  1. HTTP 통신에서 요청을 먼저 시작하는 쪽은 클라이언트인가, 서버인가?
  2. HTTP가 ‘무상태(stateless)‘라는 말은 무슨 뜻이고, 상태가 있는 세션은 무엇으로 만들 수 있는가?
  3. HTTP 요청 메시지와 응답 메시지를 구성하는 요소를 각각 나열해 보자.

정답·해설

  1. 정답: 클라이언트(브라우저)다. 해설: HTTP에서는 항상 클라이언트가 먼저 요청을 보내고 서버가 응답한다.
  2. 정답: 연속된 두 요청이 서로 연결되지 않고 독립적으로 처리된다는 뜻이며, 세션은 HTTP 쿠키로 만들 수 있다. 해설: 무상태는 세션을 만들 수 없다는 뜻이 아니며, 쿠키를 이용하면 여러 요청이 같은 상태를 공유하는 세션을 구성할 수 있다.
  3. 정답: 요청 메시지는 메서드, 자원 경로, 프로토콜 버전, 선택적 헤더, 일부 메서드에서 사용하는 본문으로 구성된다. 응답 메시지는 프로토콜 버전, 상태 코드, 상태 메시지, 헤더, 선택적 본문으로 구성된다. 해설: 예를 들어 요청이 성공하면 응답에 상태 코드 200과 상태 메시지 OK가 함께 전달된다.

참고자료