당신의 집이 하나의 거대한 컴퓨터라고 상상해 보세요. 굿디슨 거리나 4번가 같은 주소 대신, 집 주소는 숫자로 이루어집니다. 예를 들면 이렇습니다: 112.231.31.20.
마치 미래 영화에서처럼, 당신의 도시에는 하늘을 날아다니는 첨단 로봇들이 집집마다 메시지를 전달하고 응답을 가지고 옵니다.
그림이 그려지시나요?
인터넷 작동 원리 개요
조금 단순화해서 설명하면, 브라우저에 웹 주소를 입력했을 때 일어나는 일은 다음과 같습니다:
- 요청을 보내고자 하는 '집'의 주소를 찾습니다
- 로봇 우편배달부를 통해 요청을 보냅니다
- 로봇 우편배달부가 돌려줄 응답을 기다립니다
이 모든 과정은 최종 사용자인 여러분에게서 추상화되어 있습니다. 브라우저에 웹 주소만 입력하면 웹 페이지가 마법처럼 눈앞에 나타나죠.
충분히 발전된 기술이 그렇듯이, 이러한 추상화가 없다면 일반 사용자는 인터넷을 사용하기 매우 어려울 것입니다.
대부분의 경우, 무언가가 어떻게 작동하는지 알 필요는 없습니다. 작동한다는 사실만 알면 되니까요.
하지만 어떤 주제에 대해서는 내부 구조를 조금 더 깊이 파헤치는 것이 도움이 되고, 호기심도 해결해 줍니다.
이 글을 읽는다고 인터넷 기술 전문가가 되지는 못합니다. 그러려면 훨씬 많은 시간과 노력이 필요하죠. 하지만 전체적인 그림을 얻고 더 깊이 이해하게 될 것입니다.
더 배우고 싶어진다면, 제가 YouTube에 올린 재생목록에서 더 자세한 내용을 다루고 있으니 참고하세요.
메시징 시스템
이 글의 처음에 든 비유에서 알 수 있듯이, 인터넷은 메시지가 오가는 것으로 이루어져 있습니다. 이 메시지들은 대부분 HTTP 프로토콜이라 불리는 방식으로 전송됩니다.
프로토콜. 좀 어렵게 느껴지는 단어죠. 들으면 눈이 멀어지고 브라우저를 닫고 싶어지는那种 단어입니다. 그럼 더 쉬운 용어로 풀어봅시다.
프로토콜은 결국 '약속'을 멋있게 부르는 말일 뿐입니다.
비유를 통해 더 명확히 이해해 봅시다.
당신과 친한 친구가 서로 비밀 메시지를 남긴다고 생각해 보세요. 현관 앞에 '볼풋(ballfoot)'이라는 단어가 적힌 종이가 놓여 있다면, 친구가 오늘 저녁 8시에 축구하러 만나자는 뜻임을 알 수 있습니다.
당신이 이를 아는 이유는, 집으로 전달되는 종이에 적힌 '볼풋'이라는 단어가 축구 초대를 의미한다고 서로 약속했기 때문입니다.
그런데 비밀스러운 의미를 알려주지 않은 다른 친구들에게도 '볼풋' 쪽지를 남기기 시작하면 문제가 생깁니다. 그들은 이 정보로 무엇을 해야 할지 모릅니다.
그들은 현관 앞에서 쪽지를 발견하고 잠시 고민하다가, 거실로 돌아가 포트나이트 게임을 계속할 겁니다. 그리고 당신과 단 한 명의 친구만 공을 주고받겠죠. 왔다 갔다, 왔다 갔다. 지루함이 견딜 수 없을 때까지. 결국 두 사람 모두 집으로 돌아갈 겁니다.
하지만 꼭 그럴 필요는 없습니다. 친구들에게 '볼풋'의 의미를 알려주면 어떨까요? 그러면 모든 친구들이 '볼풋' 쪽지는 저녁 8시에 동네 운동장에서 축구하러 모이자는 약속이라는 것을 함께 공유하게 됩니다.
성공입니다!
이것이 바로 HTTP 프로토콜의 본질입니다. 특정 방식으로 메시지를 보내면 서버가 이를 이해하고 응답을 돌려준다는 규칙을 정해 놓은 것이죠.
메시지의 구조
HTTP 약속을 좀 더 자세히 살펴봅시다. HTTP는 요청(request)과 응답(response)으로 구성됩니다. 간단히 말해, 무언가를 요청하면 '서버'라 불리는 곳에서 답변을 받는 것입니다.
계속 진행하기 전에, HTTP 요청/응답 주기를 더 잘 이해하기 위해 처음의 비유를 조금 수정해 봅시다.
메시지를 들고 집집마다 돌아다니던 로봇들을 기억하시나요? 이제 그 로봇들 모두 각자의 주인이 있다고 상상해 보세요.
여러분에게는 자신만의 전용 로봇이 있어서, 메시지를 들고 어떤 주소(IP 주소)로든 보낼 수 있습니다. 로봇이 메시지를 가지고 목적지에 도착하면 안으로 들어가 '전달할 메시지가 있습니다'라고 당당히 외친 후, 메시지를 읊습니다.
비유를 위해, 집(서버)의 문이 반지의 제왕에 나오는 모리아 광산 입구와 같다고 상상해 보세요. 올바른 언어로 말해야만 문이 열리고 안으로 들어갈 수 있습니다.
즉, 로봇이 정해진 방식대로 메시지를 말했을 때에만 응답 메시지를 받아 여러분에게 가져올 수 있는 것입니다.
이것이 바로 작동 중인 HTTP 프로토콜입니다. 요청 및 응답 메시지가 어떤 형태를 가져야 하는지에 대한 미리 정의된 규칙이 존재하는 것이죠.
이쯤 되면 이런 의문이 들 수 있습니다. 이 메시지들은 대체 어디서 오는 걸까요? 브라우저에 웹사이트 주소를 입력할 때 직접 작성하지는 않았을 테니까요.
실은 이 모든 것이 브라우저가 자동으로 처리해 줍니다. 주소를 입력하면 브라우저가 HTTP 요청 메시지를 작성해 서버로 전송합니다. HTTP 요청 메시지는 다음과 같은 형태입니다:
GET / HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko)
Version/11.0 Mobile/15A372 Safari/604.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
...등등꽤 복잡해 보이죠?
브라우저가 이 작업을 대신해 주니 다행입니다.
첫 번째 줄만 자세히 살펴봅시다: GET / HTTP/1.1. 이 줄은 로봇을 구글의 집으로 보내 "사이트 최상위 경로에 있는 내용을 받을 수 있을까요?"라고 물어보게 합니다. (www.google.com/home이 아니라 www.google.com에 있는 내용을 가져오고 싶다는 뜻입니다.)
이제 우리는 올바른 방식으로 구글의 집(서버)에 메시지를 전달했습니다. 문이 밝게 빛나며 열립니다.
안에는 또 다른 로봇이 있습니다. 그 뒤에는 GET / HTTP/1.1, GET /search HTTP/1.1 같은 텍스트가 적힌 잠금 상자들이 늘어서 있습니다. 요청이 그중 하나와 일치하면, 로봇은 상자를 열어 내용물을 건네주고, 여러분의 로봇은 응답을 들고 신속히 돌아옵니다.
응답
돌려받는 응답은 대략 다음과 같은 형태입니다:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed평소에는 브라우저 개발자 도구로 직접 확인하려 하지 않는 한 이 응답을 볼 일은 없지만, 실제로는 분명히 받고 있습니다.
이후 어떤 일이 일어나는지는 받은 응답의 종류와 서버의 잠금 상자 안에 무엇이 들어 있었는지에 따라 달라집니다.
많은 경우 돌려받는 것은 HTML 문서입니다. HTML은 웹페이지의 구조를 나타내며 브라우저가 무엇을 표시해야 하는지 정의합니다.
www.google.com에 접속하면 google.com 사이트가 브라우저에서 어떻게 표시될지 정의하는 HTML 파일을 돌려받습니다.
시간이 된다면, HTTP 요청과 응답을 더 깊이 다루는 11분짜리 영상도 참고해 보세요:
결론
이 글에서는 인터넷이 작동하는 방식과 인터넷에서 HTTP를 사용해 통신하는 방법을 살펴봤습니다.
HTTP 프로토콜은 인터넷에서 브라우저와 서버 간 통신에 사용되며, 요청을 보내고 받는 방식에 대한 널리 합의된 표준으로 이루어져 있다는 것을 배웠습니다.
또한 이러한 통신 표준이 왜 중요한지, 그리고 공통 표준을 따르는 것이 어떤 이점을 가지는지도 살펴봤습니다.
인터넷 작동 방식과 받을 수 있는 응답의 종류를 이해하는 데에는 아직 더 많은 요소들이 있습니다.
시간이 있다면, 웹 서버를 직접 만드는 방법을 가르쳐주는 18분짜리 영상이 이 글에서 다룬 많은 주제를 복습하고 새로운 내용도 소개합니다:
이제 인터넷 통신이 어떻게 작동하는지 전반적으로 이해하게 되셨을 겁니다.
이 글이 다른 사람에게도 도움이 될 것 같다면 널리 공유해 주세요. 새 콘텐츠가 올라오는 소식을 받고 싶으시면 제 YouTube 채널을 구독하거나 Twitter에서 @foseberg를 팔로우해 주세요.