0. 서론

웹 서버 프로그래밍을 공부할 일이 있어 관련 지식을 살펴보던 중 세션이나 쿠키, HTTP Protocol등 평소 관심있게 살펴보지 않았던 주제들을 필요로 하게 되어 이를 정리하고자 한다.

1. TL;DR

  • 웹 상에서 페이지를 비롯한 모든 리소스는 HTTP기반 통신을 통해 송/수신된다.
  • 프로토콜(Protocol)이란 상호간에 정한 일종의 규약이다.
  • TCP/IP Layer는 4계층으로 구분할 수 있으며, 어플리케이션(Application), 전송(Transport), 네트워크(Network), 링크(Link, Data Link) 계층으로 구분된다.
  • URL은 해당 리소스의 위치를 나타내며, URL에 리소스 간의 식별자가 포함된 것을 URI라 한다.

2. 웹과 HTTP

사람들마다 웹 브라우저의 시작 페이지는 다르겠지만, 웹 브라우저를 실행하면 익숙한 웹 페이지들이 사용자를 반긴다. 구글일 수도 있고 네이버일 수도 있으며, 즐겨하는 게임 접속 사이트나 대형 커뮤니티 사이트일 수도 있다.


이러한 웹 페이지들은 모두 일종의 리소스인데, 이 리소스는 사이트에 접속하는 컴퓨터에서 사이트를 관리하는 서버에 리소스를 요청한 후 전달받아 브라우저 상에서 렌더링하게 된다.

이 때 이 리소스를 요청하거나 전송하는 방법이 필요한데, 이 방법이 바로 HTTP(HyperText Transfer Protocol)이다.


HTTP는 WWW를 창시한 팀 버너스리 경에 의해 고안되었는데, WWW 개념을 고안하며 문서 기술 언어로 HTML을, 전송 프로토콜로 HTTP를, 문서의 주소 지정 방법으로 URL을 제안한 것이 시초이다.

HTTP의 버전은 현재 3.0까지 제안되어 있지만(2022년 6월 6일 IETF RFC 9114로 표준화) 대부분의 경우 1.1 또는 2.0버전을 이용하며, 매우 보수적인 업그레이드 정책을 고수하고 있다.

3. 프로토콜과 TCP/IP Layer

앞서 HTTP의 원말이 HyperText Transfer Protocol이라 밝혔는데, 이는 한국어로 ‘하이퍼텍스트 전송 프로토콜’ 이라 번역된다.

하이퍼텍스트는 문서 안에 다른 문서와의 관계가 포함된 문서를 지칭한다. 그렇다면 프로토콜은 무엇일까?

프로토콜(Protocol)은 ‘상호간에 정한 일종의 규약’으로, 그 뜻에서 알 수 있듯 컴퓨터 네트워크 뿐만 아니라 매우 넓은 분야에서 두루 사용되는 용어이다. 양 측이 공동의 규칙을 정했다면 그 규칙을 프로토콜이라 부르는 것이다.

클라이언트와 서버가 리소스를 송수신할 때 지켜야 할 규칙 = 프로토콜

CPU가 GPU에게 렌더링할 정보를 전달할 때의 규칙 = 프로토콜

횡단보도가 파란 불일 때 운전자와 보행자가 수행해야 할 규칙 = 프로토콜

한국과 미국이 선박을 통해 제조 상품을 전달할 때의 규칙 = 프로토콜

따라서 HTTP는 ‘하이퍼텍스트 파일을 전송하는 규칙’이라 말할 수 있다.


HTTP를 더 명확히 이해하기 위해선 추가적으로 알아야 할 지식들이 있는데, 바로 TCP/IP 계층이다.

컴퓨터 네트워크 상에서 데이터를 전달하는 과정은 매우 복잡한데, 이 복잡한 과정을 한 번에 모두 수행하는 것이 아니라 작업의 종류에 따라 역할을 구분해 각각의 물리적/논리적 작업자에게 요청함으로써 일종의 분업 체계를 이루도록 한다. 이 때 분업 체계는 파이프라인(Pipeline)의 형태로 돌아가기 때문에 상위(혹은 선) 작업자가 작업물을 전달해 주지 않으면 작업이 이루어 질 수 없다. 이러한 까닭에 ‘계층(Layer)’이라는 용어를 통해 그 형태를 묘사하게 되었다.


순수한 네트워크 계층은 OSI 7계층으로서 7개의 레이어로 쪼개 묘사하지만, HTTP 기반 네트워크 통신의 관점에서는 이를 조금 더 단순화할 수 있기에 TCP/IP 4계층으로 단순화된 계층 구조로 네트워크 통신 과정을 바라보게 된다.


TCP/IP 4계층은 아래 요소들로 이루어져 있다.

  • 어플리케이션 계층(Application Layer)
  • 전송 계층(Transport Layer)
  • 네트워크 계층(혹은 인터넷 계층)(Network/Internet Layer)
  • 링크 계층(혹은 데이터 링크 계층)(Link/Data Link Layer)

3.1. 어플리케이션 계층

어플리케이션 계층은 실제 유저가 이용하는 어플리케이션이 위치한 곳이며, 동시에 통신의 사양을 결정하는 계층이다.

어떠한 데이터를 어떠한 방법으로 전달할지를 결정하며, TCP/IP에는 이들을 돕기 위한 여러 공통 어플리케이션이 준비되어 있다. 대표적인 예가 바로 FTP, DNS이며, 이들과 함께 HTTP역시 어플리케이션 계층에 속해 있다.

3.2. 전송 계층

전송 계층은 어플리케이션 계층에 네트워크로 접속되어 있는 두 컴퓨터 사이의 연결을 제어하고 신뢰성 있는 통신을 구현한다.

또, 일반적으로 네트워크 환경에서는 한번에 보낼 수 있는 데이터의 크기가 제한되어 있기 때문에 전송하려는 데이터가 이러한 단위보다 클 경우 이를 전송 가능한 단위로 쪼개어 보내게 되는데, 이렇게 데이터를 쪼개는 역할(패킷화)을 담당하는 곳이기도 하다.

전송 계층에 속한 프로토콜로는 TCP(Transmission Control Protocol)UDP(User Data Protocol)가 존재한다.

3.3. 네트워크 계층(인터넷 계층)

네트워크 계층은 실제 네트워크 상에서 패킷이 어떻게 상대 컴퓨터에게 전달되어야 할지와 그 이동을 다루는 곳이다. 즉, 패킷의 경로를 제어하는 계층이다.

두 컴퓨터가 같은 랜 환경 안에 존재하지 않는 한 패킷은 한 번에 목표 컴퓨터로 이동할 수 없다. 따라서 컴퓨터와 라우터 등 여러 기기를 거쳐 도달해야 하는데, 이러한 네트워크 환경은 매우 복잡하게 얽혀 있어 한 기기에서 다른 기기로 이동하는 길이 매우 많다. 네트워크 계층은 이 길들 중 어느 길로 이동해야 할 지를 결정한다.

네트워크 계층에 속한 프로토콜로는 IP(Internet Protocol), ARP(Address Resolution Protocol) 프로토콜이 존재한다.

3.4. 링크 계층(데이터 링크 계층)

네트워크와 연결된 하드웨어를 위한 계층으로, 전달되는 데이터가 가장 마지막으로 거치며, 전달받은 데이터가 가장 먼저 마주하는 계층이다. 장치 드라이버와 같은 펌웨어나 네트워크 인터페이스 카드, 케이블 등의 물리적인 기기들이 이 계층에 속하며 이들이 수행하는 하드웨어적 역할은 모두 링크 계층의 역할이다.

물리적 주소로 MAC(Media Access Control) 주소를 이용하며, 이더넷(Ethernet) 프로토콜이 속해 있는 계층이다


지금까지 정리한 계층, 프로토콜을 정리하면 다음과 같다.

4. 실제 웹 상의 데이터 전송 과정

실제 웹 상에서 데이터가 전송되는 과정을 도식으로 표현하면 아래와 같다.

자세히 보아야 할 점이 바로 패킷 상태인데, 각 계층에서 데이터(패킷)을 처리하기 위해 자신의 프로토콜에 대응되는 필요 정보들을 상위 계층으로부터 전달받은 데이터의 앞에 붙이게 된다. 이를 헤더라 하는데, 이 헤더는 도착한 컴퓨터에서 자신과 동일한 계층이 패킷을 해석할 때 사용하게 된다.


이제 데이터의 이동 경로를 서버의 어플리케이션 계층부터 시작해 조망해 보자.

4.1. 어플리케이션 계층

먼저 어플리케이션 계층에서 서버가 클라이언트에게 어떠한 리소스를 HTTP 프로토콜을 통해 전달하기로 마음먹었다. 이 때 상대의 주소가 도메인 형태로 이루어져 있다면 DNS(Domain Name System)에게 요청해 해당 주소를 IP기반 주소로 변환한다.

이후 해당 주소에 HTTP 헤더를 붙인 후 전송 계층에 넘긴다.

4.2. 전송 계층

전송 계층은 전달받은 데이터의 크기를 조사해 한 패킷으로 구성될 수 있는 크기를 넘어선 경우 이를 잘게 쪼갠다. 이후 패킷에 TCP 헤더를 붙인 후 네트워크 계층으로 전달하는데, 전송 계층의 역할은 이것으로 끝이 아니다. 앞서 전송 계층은 신뢰성 있는 통신을 구현한다고 하였는데, 이를 위해 패킷들을 전달한 후 전달한 상대방에게 데이터를 정확히 수신했는지 그 여부를 묻게 된다.

여부를 묻는 과정에서 총 3번의 신호 송수신이 이루어지는데 이를 3-Way Handshaking이라 하고, 아래와 같이 표현된다.

즉, 데이터를 송신한 측이 수신한 측에게 정확히 데이터를 받았는지 묻고, 이에 대해 수신 측이 송신 측에게 답변을 한다. 답변을 받은 송신 측은 수신 측에게 답변을 잘 받았다는 답변을 보내고 끝낸다.

만약 이 과정에서 수신 측이 송신 측에게 답변(SYN/ACK)을 주지 않는다면 송신자는 데이터가 정상적으로 전달되지 않은 것으로 여기고 데이터를 재전송한다.

4.3. 네트워크 계층

네트워크 계층은 개개의 패킷을 상대방에게 전달하기 위해 상대방의 IP주소와 같은 정보를 포함한 IP 헤더를 패킷에 포함시키며, 종단 간(End-To-End) 패킷 전달을 수행한다. 또, 앞서 네트워크 상에서 데이터 전달 과정은 여러 기기를 거쳐 수행된다고 하였는데, 이 때 각 기기의 네트워크 계층이 목표 지점으로 데이터를 전달하기 위해 자신과 인접한 기기들 중에서 어떠한 기기로 데이터를 전달해야 할지를 결정하는 ‘라우팅(Routing)’을 수행한다. 이후 데이터의 최종 전달을 위해 링크 계층으로 데이터를 전달한다.

4.4. 링크 계층

앞서 네트워크 계층에서 IP주소를 이용해 데이터를 전달할 상대방을 찾는다고 작성하였는데, 실제로는 IP주소가 아닌 MAC주소를 이용한다. IP주소가 논리적 주소, 즉 가상 주소인 반면 MAC주소는 실제 하드웨어마다 고유하게 가지는 물리적 주소인데, 링크 계층의 ARP 프로토콜이 IP주소를 MAC주소로 변환시켜 다음으로 이동할 기기를 MAC주소를 통해 찾아내게 된다.

다음으로 이동할 기기를 찾았다면 실제 물리 인터페이스(케이블 등)를 통해 데이터를 전달하는데, 이 때 사용되는 프로토콜이 이더넷 프로토콜(Ethernet Protocol)이다. 따라서 데이터 전송 직전 이더넷 프로토콜 헤더를 데이터에 포함시킨 후 데이터를 전송한다. 이제 패킷은 송신자의 컴퓨터 밖으로 나아가 외부에서 전송이 시작된다.

5. URI와 URL

앞서 웹 기술은 주소 지정 방식으로 URL을 이용한다 하였다. URL(Uniform Resource Locator)은 그 이름처럼 어떠한 페이지의 주소이자 동시에 URI의 포함 개념인데, URI(Uniform Resource Identifier)는 어떠한 페이지의 주소 뿐만 아니라 그 페이지 안에 존재하는 리소스 개개를 식별하는 식별자의 개념을 포함한다.

즉, 다음과 같이 구분할 수 있을 것이다.

URL = https://hamsik2rang.github.io/2022/05/25/About-Quaternion.html

URI = https://hamsik2rang.github.io/assets/img/posts/2022-05-25/About-Quaternion/img03.png

URL이 가리키는 페이지에 존재하는 3번 이미지를 나타내는 표현이 바로 URI이다. 그러나 보통 URI와 URL을 통칭하여 URL로 부르는 경향이 있으므로, URL이 URI와 URL 모두의 의미를 내포한다고 생각해도 무방하다.

이제 URL의 포맷을 살펴볼 텐데, URL은 필요한 위치 정보 전체를 지정하는 절대 URL과 기준 URL이 존재할 때 기준 URL로부터의 상대적 위치를 지정하는 상대 URL이 존재한다.

이 중 절대 URL의 포맷은 다음과 같다.

    https://user:pass@www.example.kr:80/dir/index.htm?uid=1#ch1

    https://    user:pass@ www.example.kr  :80    /dir/index.htm?                uid=1                 #ch1

#| Scheme | Credential | Server Address | Port| Hierarchical File Path | Query string | Fragmant Identifier |