이 글은 책 ‘그림으로 배우는 HTTP & Network Basic’ 를 읽고 내용에 필자의 생각과 지식을 덧붙여 정리한 내용이다. 책 내용과 100% 일치하지 않을 수 있으며, 개인적인 견해나 경험이 들어갈 수 있다.
웹은 HTTP로 나타낸다.
브라우저 주소 입력란에 URL을 입력하면 웹 서버로부터 리소스를 얻어낼 수 있다. 이때 서버에 의뢰하는 측을 클라이언트라고 부른다. 이때, 클라이언트에서 서버까지의 일련의 흐름은 HTTP 프로토콜이라는 약속을 통해 이루어진다.
HTTP는 이렇게 태어났고 성장했다
웹은 지식 공유를 위해 고안되었다
CERN이라는 유럽 입자 물리학 연구소의 팀 버너스리 박사는 멀리 떨어져 있는 동료 연구자와 지식을 고융하기 위해 어떤 시스템을 고안했다. 하이퍼텍스트를 통해 상호간에 참조할 수 있는 WWW(World Wide Web)의 기본 개념이 되는 것 이었다.
이때 하이퍼텍스트란 한 문서에서 참조(하이퍼 링크)를 통해 독자가 다른 문서로 접근할 수 있는 방법을 의미한다.
WWW를 구성하는 기술로 문서 기술 언어 HTML(HyperText Markup Language), 문서 전송 프로토콜 HTTP(HyperText Transfer Protocol) 그리고 문서의 주소를 지정하는 방법으로 URL(Uniform Resource Locator) 3가지가 제안되었다.
이 당시엔 WWW는 지금의 웹 브라우저와 같은 클라이언트 애플리케이션을 가리키는 명칭이었지만, 현재는 이러한 일련의 시스템의 명칭으로 사용되어 WWW 혹은 단순히 웹이라고 불린다.
웹이 성장한 시대
1990년 11월에 CERN에서 세계 최초의 웹 서버와 웹브라우저가 개발되었고, 이후 3년뒤 한국에서도 최초의 웹사이트가 개발되었다.
1993년 1월, NCSA에서는 웹 브라우저의 선조격인 모자이크를 개발했다. 모자이크는 세련된 그래픽을 사용해서 세계에 널리 퍼졌다. 모자이크는 텍스트와 이미지를 인라인으로 표시하는 최초의 웹 브라우저라고 한다. 이 무렵 CGI를 사용할 수 있는 웹서버와 NCSA HTTPd 1.0도 등장했다고 한다.
그 다음 해인 1994년 12월에 넷스케이프사에서 넷스케이프 내비게이터 1.0을 출시하고, 1995년에는 마이크로소프트사에서 인터넷 익스플로러 1.0과 2.0을 출시했다. 이 무렵에 Apache 0.2도 등장하고, HTML 2.0도 발생하는 등 웹이 약진하는 한해였다.
1995년 경부터 마이크로소프트와 넷스케이프에 의해 웹 브라우저 경쟁이 과열된다. 이 두 회사는 HTML을 독자적으로 확장해서 지금도 HTML을 만드는 사람들을 곤란하게 만들고 있다. 두 브라우저 벤더끼리의 경쟁으로 그 당시 추진된 여러 웹 표준화를 무시해오고, 심지어 새로운 기능에 대한 문서도 없는 상황이 종종 발생했다.
2000년경 넷스케이프사의 쇠퇴와 함께 경쟁은 결말이 나지만, 2004년 모질라 파이어폭스의 출시와 함께 제 2차 브라우저 전쟁에 돌입하게 된다.
인터넷 익스플로러는 버전 6에서 7이 등장하기까지 5년이 걸렸으나 뒤로 7, 8, 9, 10 버전을 연달아 출시했다. 또한 크롬과 오페라, 사파리와 같은 브라우저도 점유율을 늘리고 있다.
진보 안하는 HTTP
- HTTP/0.9 : 1990년대 HTTP가 등장했는데, 이때 HTTP는 정식 사양서가 아니었다. HTTP 1.0 이전이란 의미에서 이 당시 등장한 HTTP를 HTTP/0.9라고 부른다.
- HTTP/1.0 : 1996년 5월 HTTP/1.0으로 RFC1945가 발행되었다. 초기 스펙이지만 아직 많은 서버에서 현역으로 가동되고 있는 프로토콜 스펙이다.
- HTTP/1.1 : 1997년 1월에 공개된 HTTP/1.1 버전이 현재 가장 많이 사용되는 버전이다. RFC2068로 발행되었고, 1999년에 개정을 거친 RFC2616이 최신버전이다… 라고 책에 나와있지만, 덧붙이자면 2014년에 HTTP/1.1 스펙이 다시 개정되어 RFC7230 ~ 7235로 발행된 버전이 가장 최신 버전임을 알아두자.
웹 문서 전송 프로토콜로서 등장한 HTTP는 거의 버전이 업그레이드 되지 않았다. 현재 차세대를 담당할 HTTP/2.0이 책정되어 있지만 아직 널리 사용되기까지는 시간이 걸릴 것 이다.
HTTP는 처음에는 주로 텍스트를 전송하기 위해 고안된 프로토콜 이지만, 프로토콜 자체가 굉장히 간단하여 여러가지 응용 방법을 고려해서 기능이 계속 추가되었다. 지금은 웹이라는 틀을 넘어서 다양하게 사용되는 프로토콜이다.
책의 내용에 조금 더 덧붙이자면 HTTP/2.0는 2015년 RFC 7540으로 발행되었고, HTTP/3.0 또한 정말 정말 최근인 2022년 6월 6일에 RFC 9114로 발행되었다. 책의 내용과 같이 HTTP/1.1 이 현재 가장 많이 사용되는 버전은 맞다. 하지만 HTTP/2.0과 HTTP/3.0의 점유율도 점점 증가하는 추세이다. 네이버 메인 페이지를 접속해보면 2.0 버전으로 통신하는 것을 확인할 수 있으며, 심지어 구글은 3.0 버전으로 통신되는 것을 확인할 수 있다.
네트워크의 기본은 TCP/IP
TCP/IP는 프로토콜의 집합
HTTP 프로토콜은 TCP/IP라는 프로토콜에서 동작한다. 프로토콜에는 여러가지가 있다. 케이블 규격, IP 주소 지정 방법, 떨어진 상대를 찾기 위한 방법, 그 곳에 도달하는 순서, 그리고 웹을 표시하기 위한 순서 등이 있다. 이렇게 인터넷과 관련된 프로토콜을 모은 것을 TCP/IP 라고 부른다. 원래는 TCP와 IP 프로토콜을 가리켜 TCP/IP 라고 부르기도 하지만, IP 프로토콜을 사용한 통신에서 사용되는 프로토콜을 총칭해서 TCP/IP라는 이름이 사용된다.
계층으로 관리하는 TCP/IP
TCP/IP에서 중요한 개념 중 하나는 계층이다. TCP/IP 는 위에서 차례대로 애플리케이션 계층, 트랜스포트 계층, 네트워크 계층, 링크 계층 이렇게 4개의 계층으로 나뉜다.
인터넷이 하나의 프로토콜로 되어 있다면 스펙이 변경되었을 때 전체를 변경해야겠지만, 이렇게 계층화 되어 있으면 스펙이 변경된 부분의 계층만 변경하면된다. 각 계층은 계층간 연결되는 방식만 결정되어 있어 내부 구현을 자유롭게 설계할 수 있다. 마치 Layered Architecture 와 같다.
계층은 자기 자신의 역할만 충실하면 된다. 예를 들어 애플리케이션 계층은 상대가 어디에 있는지, 어떠한 루트로 메시지를 전달하는지, 전달한 메시지가 확실하게 전달해도 되는지를 고려하지 않아도 된다. 덧붙이자면 각 계층은 상위계층과 하위 계층이 어떻게 동작하는지 알 필요가 없다. 관심사의 분리가 이루어진 것이다.
애플리케이션 계층
유저에게 제공되는 어플리케이션에서 사용하는 토인이다. FTP, DNS 그리고 HTTP와 같은 계층이 포함된다.
트랜스포트 계층
애플리케이션 계층에 네트워크로 접속되어 있는 2대의 컴퓨터 사이의 데이터 흐름을 제공한다. 트랜스포트 게층에는 TCP와 UDP 두 가지 프로토콜이 있다.
네트워크 계층(혹은 인터넷 계층)
네트워크 상에서 전송 데이터의 최소 단위인 패킷의 이동을 다룬다. 상대 컴퓨터까지 네트워크의 어떠한 경로로 패킷을 보낼지 결정한다. 인터넷에서 내 컴퓨터에서 상대 컴퓨터까지 수 많은 경로가 존재하는데 이 중 하나의 경로를 선택하는 것이 네트워크 계층의 역할이다.
링크 계층(혹은 데이터 링크 계층, 네트워크 인터페이스 계층)
네트워크에 접속하는 하드웨어적인 면을 다룬다. 디바이스 드라이버, 네트워크 인터페이스 카드와 케이블 같이 물리적으로 보이는 부분도 포함한다.
TCP/IP 통신의 흐름
TCP/IP 통신은 계층 순서대로 이루어진다. 보내는 쪽의 데이터는 애플리케이션 계층부터 링크 계층으로 아래로 내려가고, 받는 쪽의 데이터는 반대로 링크 계층에서 애플리케이션 계층으로 올라간다. 데이터가 보내질때 거쳐지는 계층마다 헤더라고 불리는 계층마다 필요한 정보가 추가된다. 그리고 데이터를 수신하는 쪽에서는 거쳐지는 계층 마다 해당 계층에서 헤더를 사용한뒤 제거해서 위 계층으로 데이터를 보낸다.
HTTP 리퀘스트가 발생하면, 그 HTTP 리퀘스트 메시지는 TCP 계층으로 내려간다. TCP 계층은 이 데이터에 TCP 헤더를 붙이고, IP 헤더로 내려 보낸다. IP 계층에서도 마찬가지로 IP 헤더를 붙여 링크 계층으로 내려 보낸다. 링크 게층에서는 Ethernet 헤더를 붙여 데이터를 전송한다. 이렇게 정보를 감싸는 것을 캡슐화라고 한다.
HTTP와 관계가 깊은 프로토콜은 IP/TCP/DNS
배송을 담당하는 IP
IP는 네트워크 계층이다. IP의 역할은 개개의 패킷을 상대방에게 전달하는 것 이다. 여기서 중요한 개념은 IP 주소와 MAC 주소이다. IP 주소는 네트워크 각 노드에 부여된 주소, MAC 주소는 각 네트워크 카드에 할당된 고유한 주소이다. IP 주소는 변경할 수 있지만, MAC 주소는 변경할 수 없다.
IP 통신은 MAC 주소에 의존해서 통신한다. IP 주소만으로는 IP 프로토콜로 데이터를 보낼 수 없다. 따라서 ARP(Address Resolution Protocol)이라는 프로토콜을 사용하여 상대측 IP 주소를 통해 상대측 MAC 주소를 확보한 후 데이터를 전송한다.
데이터가 목적지까지 중계되는 과정은 컴퓨터와 라우터 등의 네트워크 기기는 목적지에 도착하기까지 대략적인 목적지만을 알고있다. 이 시스템을 라우팅이라고 부르는데 택배 배송과 흡사하다. 즉, 인터넷의 어떤 노드도 인터넷 전체를 상세하게 파악하고 있지 않다.
신뢰성을 담당하는 TCP
TCP는 트랜스포트 계층이다. TCP는 용량이 큰 데이터를 보내기 쉽게 TCP 세그먼트라는 작은 단위 패킷으로 분해해서 관리하는 신뢰성 있는 바이트 스트림 서비스를 제공한다. 그리고 상대방에게 그 데이터가 정확히 도착했는지 확인하는 역할을 한다.
TCP는 이런 신뢰성 있는 통신을 위해 3-Way 핸드쉐이크라는 방법을 사용한다. 데이터를 보내는 측에서 SYN 플래그로 상대방에게 접속함과 동시에 패킷을 보낸다. 수신 측은 SYN/ACK 플래그로 송신측에 접속함과 동시에 패킷을 잘 수신했다고 알린다. 이후 송신측이 ACK 플래그를 보내서 패킷교환이 완료되었음을 알린다. 이 과정에서 어디선가 통신이 도중에 끊어지면 TCP는 같은 수순으로 패킷을 재전송한다.
이름 해결을 담당하는 DNS
DNS(Domain Name System)은 애플리케이션 계층에게 도메인명에서 IP 주소를 조사하거나, 반대로 IP 주소로부터 도메인명을 조사하는 서비스를 제공한다.
URI와 URL
URI, URL 그리고 URN 포스팅에서 자세히 다루었으므로 생략한다.