HTTP 구조란 무엇인가 — TCP 문자열 전송부터 HTML·CSS·JS까지 3단계로 이해하는 법

웹 서비스는 결국 “텍스트를 주고받는 약속” 위에 세워져 있다. 브라우저가 화면을 그리고, 버튼을 누르면 반응하고, 동영상이 재생되는 모든 것이 TCP 문자열 전송이라는 하나의 제약 조건에서 출발한다. HTTP 구조를 이해하면 웹이 왜 이런 방식으로 설계됐는지, HTML·CSS·JavaScript가 각각 무슨 역할을 하는지 한 번에 잡힌다.

이 글에서는 TCP가 왜 문자열만 주고받을 수 있는지부터 시작해, HTTP 구조가 어떤 형태로 요청과 응답을 처리하는지, 그리고 브라우저가 그 텍스트를 받아 화면으로 그려내는 원리까지 3단계로 정리한다.

TCP는 왜 문자열만 주고받는가

TCP(Transmission Control Protocol)는 1991년에 설계된 통신 규약이다. 설계 당시의 목표는 단순했다. 네트워크 위에서 데이터를 신뢰성 있게 전달하는 것. 그 수단으로 선택한 방식이 바로 문자열이었다.

TCP 자체는 사운드도, 이미지도, 영상도 직접 전달하지 못한다. 오직 텍스트 기반의 데이터만 주고받을 수 있다. 그런데 오늘날 Netflix는 TCP로 동작한다. 이상하게 들리지만, 사실이다.

비결은 간단하다. Netflix 서버는 영상 파일을 직접 보내는 게 아니라, 브라우저에게 “이 영상을 재생해달라는 요청서”를 텍스트로 보낸다. 브라우저는 그 텍스트 요청서를 읽고 직접 화면을 그린다. 즉, TCP는 그림을 보내는 게 아니라 그림을 그려달라는 지시서를 텍스트로 전달하는 방식으로 작동한다.

TCP가 30년이 지난 지금도 버려지지 않는 이유는 단 하나다. 이미 전 세계 모든 서비스가 이 위에 세워져 있기 때문이다. 제약은 있지만, 그 제약 안에서 가능한 모든 방법이 이미 구현돼 있다.

HTTP 구조란 무엇인가 — 요청서를 텍스트로 보내는 이유

HTTP(HyperText Transfer Protocol)는 TCP 위에서 작동하는 통신 규칙이다. HTTP 구조는 크게 두 가지로 나뉜다. 요청(Request)응답(Response).

브라우저가 서버에 어떤 페이지를 달라고 할 때, 그 요청은 텍스트로 작성된 요청서 형태로 전송된다. 서버는 그 텍스트 요청서를 읽고 응답 텍스트를 돌려준다. 브라우저는 응답 텍스트를 해석해 화면을 그린다.

HTTP 구조에서 요청과 응답은 각각 두 부분으로 구성된다.

구분구성 요소역할
요청(Request)헤더(Header)요청 방식, 인증 정보, 브라우저 환경 등 참고사항
요청(Request)바디(Body)서버에 전달할 실제 데이터 (POST 방식일 때)
응답(Response)헤더(Header)응답 데이터 형식, 상태 코드, 캐시 정책 등 참고사항
응답(Response)바디(Body)브라우저가 화면으로 그릴 실제 내용 (HTML 등)

핵심은 이 모든 데이터가 TCP 문자열 전송 방식으로 오간다는 것이다. 서버는 이미지를 직접 보내지 않는다. 이미지를 어디서 가져와 어떻게 표시하라는 지시가 담긴 텍스트를 보낼 뿐이다.

HTTP 헤더가 하는 일 — 브라우저에게 보내는 참고사항

HTTP 구조에서 헤더는 바디를 어떻게 해석해야 하는지 브라우저에게 알려주는 참고사항이다.

예를 들어 서버가 HTML 문서를 응답으로 보낼 때, 헤더에 Content-Type: text/html이라고 명시한다. 브라우저는 이 헤더를 먼저 읽고 “아, 바디에 있는 텍스트는 HTML로 해석해서 화면을 그려야겠다”고 판단한다.

반대로 헤더에 Content-Type: text/plain이라고 적혀 있으면 브라우저는 같은 텍스트를 HTML로 그리지 않고 그냥 평문으로 보여준다.

Content-Type 값브라우저 동작
text/htmlHTML로 해석 → 화면 렌더링
text/plain평문 텍스트로 그대로 표시
application/jsonJSON 데이터로 해석
image/jpeg이미지로 표시

헤더에는 인증 정보도 담긴다. 사용자가 로그인한 상태라면, 브라우저는 요청 헤더에 인증 토큰을 실어서 서버에 보낸다. 서버는 그 토큰을 보고 이 사람이 누구인지 확인한다. 단, 헤더는 클라이언트 쪽에서 수정이 가능하기 때문에 서버는 헤더 정보를 그대로 신뢰하지 않고 별도로 검증한다.

결국 HTTP 구조에서 헤더는 “바디를 읽기 전에 먼저 확인해야 할 지시사항”이다. 현장으로 치면, 작업 지시서 앞장에 붙어있는 주의사항 페이지와 같다.

HTML·CSS·JavaScript — 웹 화면을 만드는 3가지 역할

서버가 보낸 응답 바디에는 대부분 HTML이 담겨 있다. 브라우저는 이 HTML을 읽고 화면을 구성한다. 그런데 웹 화면을 만드는 데는 HTML 하나만 쓰이지 않는다. HTML, CSS, JavaScript 세 가지가 각자 다른 역할을 담당한다.

구성 요소역할비유
HTML화면에 무엇이 있는가 (구조)건물의 기둥과 벽
CSS그것이 어떻게 보이는가 (스타일)인테리어와 도색
JavaScript사용자가 조작했을 때 무슨 일이 벌어지는가 (액션)자동문, 조명 스위치

HTML은 화면의 구성 요소를 정의한다. 버튼이 있다, 제목이 있다, 이미지가 있다 — 무엇이 화면에 존재하는지를 태그로 선언한다.

CSS는 그 구성 요소들이 어떻게 보일지를 결정한다. 글자 색을 빨간색으로, 버튼을 둥글게, 배경을 어둡게 — 디자인과 스타일 전반을 담당한다.

JavaScript는 사용자의 행동에 반응하는 로직을 담는다. 버튼을 클릭했을 때 텍스트가 바뀐다, 마우스를 올렸을 때 색이 변한다 — 화면의 모든 인터랙션은 JavaScript가 처리한다.

HTTP 구조 위에서 HTML CSS JavaScript 역할을 쌓은 삽화

네이버, 쿠팡, 유튜브 모두 이 세 가지로 만들어진다. 구조가 다르고 디자인이 달라 보여도, 뜯어보면 HTML로 구조를 잡고 CSS로 꾸미고 JavaScript로 동작을 붙인 것이다.

API 란 무엇인가에서 다뤘듯, 서버와 클라이언트가 주고받는 데이터의 형식과 규칙을 이해하면 HTTP 구조가 훨씬 입체적으로 보인다.

현장 장비를 다루던 사람이 웹 개발을 처음 배울 때 가장 헷갈리는 지점은 “왜 이렇게 많은 단계로 쪼개놓았을까”라는 질문이다. 현장에서는 신호 하나가 배선을 타고 곧바로 전달되면 그만이지만, 웹은 신뢰성과 확장성을 위해 매 단계를 텍스트 약속으로 잘게 쪼개놓았다. 그 이유를 알고 나면 복잡해 보이던 HTTP 구조가 오히려 단순한 규칙의 반복으로 보인다.

핵심 요약

  • TCP는 문자열만 주고받을 수 있다. 이미지나 영상이 아닌, 그것을 그려달라는 텍스트 지시서를 전달한다.
  • HTTP 구조는 요청과 응답으로 나뉘며, 각각 헤더(참고사항)와 바디(실제 내용)로 구성된다.
  • 헤더의 Content-Type이 브라우저에게 바디를 어떻게 해석할지 알려준다.
  • HTML은 구조, CSS는 스타일, JavaScript는 액션 — 모든 웹 화면은 이 3가지 역할 분담으로 작동한다.

함께 읽으면 좋은 글

웹 개발의 전체 구조가 잡혔다면, 다음 단계는 실제 서버를 만들어보는 것이다.

웹 표준과 프로토콜의 공식 레퍼런스는 MDN Web Docs에서 확인할 수 있다.

FAQ

TCP는 데이터를 신뢰성 있게 전달하는 하위 통신 규약이고, HTTP는 그 위에서 작동하는 웹 전용 통신 규칙이다. TCP가 도로라면, HTTP는 그 도로 위에서 운행하는 화물 운송 규칙이라고 볼 수 있다. HTTP 구조는 TCP가 제공하는 문자열 전송 능력을 활용해 요청과 응답의 형식을 정의한다.

헤더는 클라이언트 측에서 수정이 가능하다. 하지만 서버는 헤더 값을 그대로 신뢰하지 않고 별도 검증 로직을 거친다. 인증 토큰을 헤더에 담아 보내더라도 서버가 유효성을 검사하기 때문에, 단순히 헤더 값을 바꾼다고 권한이 생기지 않는다.

역할이 다르기 때문이다. 구조(HTML), 스타일(CSS), 액션(JavaScript)을 한 파일에 섞으면 수정할 때 서로 간섭이 생기고 유지보수가 어려워진다. 분리해두면 디자인만 바꾸고 싶을 때 CSS만 수정하면 되고, 기능을 추가할 때는 JavaScript만 건드리면 된다. 대형 서비스일수록 이 분리가 더 중요해진다.

관련 글 보기