인터넷과 웹은 무엇일까? 평소에 우리는 인터넷을 항상 사용하고 그에 둘러싸여져 있지만 그게 정확히 무엇인지는 잘 생각해보지 않는다. 너무나 당연하기 때문이다.

사실 인터넷과 웹은 다른 것이고 웹은 인터넷에 귀속되어 있는 서비스 중 하나로, 위계상으로는 인터넷의 하위분류인 전자 메일, P2P (토렌트 등), SSH, FTP, SFTP, RDP, VPN 등등 과 같은 위계에 위치해있다. 

인터넷의 유래는 냉전 시기에 미국 국방부 산하의 연구소에서 연구용으로 개발하였으며, 이때 데이터 전송방식이 회선 교환, circuit switching에서 패킷 교환, packet switching 방식으로 넘어가게 되었다. 최초의 인터넷 상호간 연결은 1969년 10월 29일 UCLA와 SRI연구소간에 연결되으며, 이가 인터넷의 시초이다. 

앞서 말한 패킷은 와이파이, 랜선, 광섬유 등 데이터 전송매체를 통해 전송되는 정보의 기본 단위다. 전송에 사용되는 방식에 따라 패킷의 크기는 다양하며, 그 안에서 패킷의 크기를 마음대로 정할 수 있다. 패킷의 크기가 커지면 효율성은 좋아지나 패킷에 오류가 있음이 발견되면 큰 것을 다시보내야해 시간 손실이 커질 수 있고, 작아지면 오류가 날 확률도 적고 나더라도 시간 손실은 없지만, 쪼개 보내다보니 효율성이 떨어진다.

인터넷상에서 데이터를 전송할때는 이름과 마찬가지로 IP 주소가 필요한데, 0~255의 숫자 4개가 조합된 192.168.0.1와 같은 것이다. 이는 계산해보면 알 수 있듯이 2^32가지 뿐이고, 이 개수제약을 해결하기 위해 현재는 IPv4 대신 IPv6가 보급되는 중이다. 이때, 인터넷에는 여러가지 서비스가 있고 각 서비스의 종류별로 분류하여 통신하기 위해 각 서버, 즉 ip 주소가 지칭하는 personal computer나 server는 여러개의 포트를 가지고 있다. 

번호는 0번부터 65535까지 65536개가 있는데 워낙 많아 보통 1000번대까지만 쓰며, 특수한 경우 뒤쪽도 사용된다. 포트를 사용해 전송되는 데이터는 전송 제어 프로토콜(TCP)와 사용자 데이터그램 프로토콜(UDP) 둘중 하나에 담겨서 전송되는데, 서비스 별로 무엇을 선택할지 결정할수있게 되있거나 이미 결정되어있다. 

이때, 우리가 아는 웹이란 WWW, world wide web의 줄임말로, W3도 가능하며 1989년 3월 유럽 입자 물리 연구소(CERN)의 컴퓨터과학자 팀 버너스-리(Tim Berners-Lee, 영국 옥스퍼드대학 교수)가 물리학자들 상호간의 신속한 정보교환과 공동연구를 위한 프로그램으로 고안되었다. 현재 웹에서는 크게 두가지 프로토콜, 즉 데이터 전송 방식이 사용되는데, url 앞에 붙은 http, https 두가지정도가 있다. 둘다 UDP 프로토콜을 기반으로 하며, 각각 80번, 443번 포트를 쓴다. 이 경우 포트 번호가 일정하므로 웹브라우저상에서 http://url 주소 혹은 ip 주소라고 만 입력해도 포트를 80번으로 지정해준다.

웹이 작동하는 방식은 웹브라우저에 url이나 ip를 치면 dns 를 거치거나 거치지 않고 서버의 80 / 443포트로 url과 함께 요청을 하고, 서버측에서는 기본적으로 url 파싱을 통해 알맞은 html 파일 하나를 보내준다. 이 파일 자체는 보통 커봤자 10mb정도로 텍스트로 이루어져있다. 그러면 웹브라우저에서는 html파일을 해독해 필요한 이미지, 자바스크립트, CSS, 동영상, 다른 html 파일 등 모든 리소스의 주소를 얻어내어 80/ 443포트로 다시 요청하고, 이를 다시 서버에서 전송해주면 우리 웹브라우저가 알맞게 표시해주는 것이다. 즉, html파일은 단순 텍스트이며 그 안에 적힌 주소로 다시 요청해야만 콘텐츠들이 보인다. 파이썬 requests로 요청한다고 브라우저에서 보이던 모든 게 안보이는 이유도 그러하고, html만 저장한다고 이미지가 보이지 않는 이유도 그렇다. 이때 html자체는 프로그래밍언어가 아니라 동적인 행동을 하지 못하고, 오직 js, 자바스크립트가 실행되며 로그인, 포스팅 등의 다양한 동작을 수행한다. 이과정에서 브라우저측이 다시 서버에 업로딩을 하는 과정도 존재한다.

물론 서버측에서는 데이터만 받아 내부에서 동작하는 언어는 자바스크립트도 가능하지만 (node.js) 그외에 java(Spring, Servlet, JSP), PHP, ASP, python (Django, Flask),, c#, Ruby, .Net 등의 언어가 사용된다. 괄호속의 것은 해당언어를 기반으로 동작하는 엔진이다. 참고로 java와 java script는 완전 다른 언어이며 java script가 지명도를 얻기 위해 기존에 유명하던 java를 이름에 넣었다는 소문이 있다.

만약 ftp같이 포트가 유동적이라면 ftp://url 또는 ip주소:21 등으로 지정해주어야 한다.

url이라는 것은 53번 포트를 통해 서비스 되는 domain name system, DNS 덕분에 사용가능한 것인데, ip 주소를 외우기가 귀찮으므로 url을 요청하면 dns 서버에서 ip주소를 응답해준다.

즉, 우리가 도메인을 구매한다는 것은 dns 서버상에서 naver.com이라는 url을 내 서버의 ip로 매칭시켜달라고 해주고 돈을 주는 것이다. dns 서버 회사는 수없이 많지만, 자기들끼리 구역을 나눠 DNS zone을 형성하고, 이미 점유중이라면 트레이드를 하며 도메인을 사고판다.

주로 url을 a record를 사용하여 ip주소로 연결하고, cname 레코드등을 사용하면 다른 url로 연결시킬수도 있다.

그렇다면 왜 나의 pc는 서버가 될수 없는 것일까?

그 이유는 나의 pc도 ip주소를 가지고 있지만 이는 내가 속한 상위네트워크에서만 통하는 internal ip이거나, external이더라도 상위네트워크의 ip이지 내 ip가 아니다. 즉, 외부의 클라이언트가 내 external ip를 호출해도 불리는 건 내가 아니라 해당 ip를 부여받은 공유기나 서버이다. 즉, 공유기나 서버에서 실제 외부 ip를 받고, 단지 인터넷만을 분산시켜 하위 pc들에게 내부 ip주소 (보통 192.168.로 시작)를 뿌리는 것이다. 그래서 우리는 외부에 요청하거나 전송만 가능하지 외부에서 우리에게 요청하는 건 불가능하다. 

이를 가능하게 하기 위해서는 공유기나 서버등 제일 상위 기기에서 요청을 받았을때 다시 나에게 요청을 전해주는 '포트 포워딩'을 해야한다. 만약 80번 포트를 내 컴퓨터로 열고 내가 서버를 돌리면 전세계 모든 사람이 내 ip주소를 웹브라우저에 입력했을때 내가 보내는 index.html 파일이 표시될 것이다. 만약 65536개의 포트를 모두 개방하고 싶다면 할수도 있고, 이를 dmz라고 부른다. 중요한 것은 포트를 개방하려면 내가 관리자거나 관리자서버에 접속할수 있어야 한다. (보통 192.168.0.1, 192.168.219.1 등에 접속하면 관리자 페이지를 볼수 있고, 비번을 알아야 모든 걸 할 수 있다)

웹서버에 관해서는 초보자는 Apache2서버를 많이 쓰는데 이는 그냥 파일 디렉터리 그대로 url을 파싱하여 맞는 파일을 http로 전송한다. 좀 발전하면 node js 등으로 url을 파싱하여 디렉터리와 관계없이 내가 원하는 파일을 보낼 수 있으나 조금 복잡해진다.

또한가지 궁금할수도 있는 것이 유튜브의 ip를 알아내면 그것을 웹브라우저에 입력하면 왜 유튜브가 안뜨냐는 것인데, 서버측에서는 url을 파싱하기에 url이 youtube여야만 유튜브 사이트를 제공하는 구글의 경우도 있다.

저작권자 © 복지TV부울경방송 무단전재 및 재배포 금지