정글사관학교 개발일지/웹 서버

정글사관학교 47일차 TIL: PORT, URI, 웹브라우저 요청 흐름(중요)

Woonys 2021. 12. 18. 20:55
반응형

PORT

클라이언트가 동시에 여러 서버와 연결해야 하는 경우를 생각해보자. 예를 들어 내 컴퓨터에서 게임도 하고, 화상통화도 하며, 그 와중에 웹서핑까지 하면 어떻게 될까? 아래 이미지처럼 두 개의 서버가 필요하다고 할때, IP만으로는 한 서버에서 게임/화상통화 요청시 응답오는 패킷을 구별할 수 없다. (둘다 200.200.200.2)

우리가 이전 공부 자료에서 봤던 것처럼, TCP/IP 패킷에서는 PORT라고 하는 글자를 본 적이 있을 것이다. 이것이 바로 이러한 상황에서 필요한 정보이다. 아래처럼 TCP의 PORT 정보를 활용하면 우리는 한 서버 내에서 오는 다양한 프로세스를 구별할 수 있게 된다.

 

 

 

즉, PORT는 같은 IP 내에서 프로세스를 구분하게 해주는 식별자라고 보면 되겠다. 이름부터가 "항구"를 뜻하지 않나. 

 

위 이미지처럼 게임은 8090, 화상통화는 21000, 웹 브라우저는 10010번 포트로 정보가 들어오는 것을 볼 수 있다. 비유를 하자면, IP가 "00아파트"까지를 나타내는 주소라고 하면, PORT는 "101동 304호"와 같은 동호수를 나타내는 정보라고 할 수 있겠다. 그래야 집 문앞까지 배달될 테니까.

 

잘 알려진 PORT 번호

 

포트는 0부터 65535까지 할당 가능하다. 이 중에서 0부터 1023까지는 잘 알려진 포트이니 우리가 웹서버를 만들 때 우리의 포트로 사용하지 않는 것이 좋다.

 

DNS: 우리가 143.248.56.177 대신 google.com으로 구글에 접속할 수 있는 이유

 

다시 IP로 돌아와 보자. 우리가 서버에 요청하기 위해서는 상대방 IP 주소와 port를 알아야 한다고 했다. 그런데, 보다시피 IP 주소는 자릿수만 최대 12자리에 달하는 숫자로 되어 있다. 거기다가 포트 번호까지 붙으면 최대 17자리.. 사람이 일일이 외우고 쓰기에는 매우 불편하다. 심지어 서버 단에서 새로운 IP를 발급받는다면? 문제는 더욱 심각해진다. 서버에서 어떤 IP로 변경됐는지 소식을 듣지 못하면 절대 그 서버로 갈 수 없게 된다. 이를 위해 존재하는 것이 DNS(Domain Name System)이다.

 

DNS는 도메인 네임 시스템으로, 일종의 서버 IP를 찾도록 도와주는 전화번호부 역할을 한다. 전화번호부에는 어떻게 되어 있나? 이름과 전화번호가 대응된다. 즉, DNS는 도메인 명을 IP 주소로 변환해주는 시스템이며, DNS 서버는 이 역할을 수행하는 서버이다. 우리가 자주 접속하는 사이트의 IP 주소는 대부분 캐시 파일에 저장되어 있다. 그래서 클라이언트는 DNS에 요청하기 전에 먼저 캐시를 뒤져서 우리가 방문하려는 사이트의 IP 주소가 있는지를 확인한다. 없으면 hostfile로 이동하는데, 여기부터는 사용자 모드가 아닌 커널에 요청해야 하는 모드로 변환된다.  

 

 

URI (Uniform Resource Identifier)

 

갑자기 URI? URL이 아니라? 뭔가 이상한 느낌이 드는데, 한 번 찬찬히 따라가 보자. URI는 자원을 식별하는 통합된 방법을 뜻한다. URI는 우리가 잘 아는 개념인 URL(Uniform Resource Locator)과 URN(Uniform Resource Name)을 포함하는 보다 상위 개념이라고 이해해두자.

 

위의 웹사이트 주소를 예시로 보자. 똑같은 IP 주소를 url 방식으로도, urn 방식으로도 접속할 수 있다. 차이라면 URL은 리소스가 있는 위치를 지정하는(Locator) 방식이며, URN은 리소스에 이름을 부여(Name)하는 방식이다. 위치는 변할 수 있는 반면, 이름은 변하지 않는다. 그런데 잘 알다시피 요즘은 모두가 URL 방식을 사용해 URN 방식으로 실제 리소스(서버 위치)를 찾는 방법이 보편화되지 않았다. 따라서 앞으로 URI는 URL과 같은 개념으로 쓴다고 생각하자.

 

URL

 

URL 예시를 한 번 살펴보자. 아래는 우리가 잘 아는 구글 주소이다.

 

https://www.google.com:443/search?q=hello&hl=ko

 

하나씩 뜯어보면

  • scheme - 프로토콜(https): 프로토콜은 어떤 방식으로 자원에 접근할 것인가에 대한 통신 규약을 의미한다. 종류로는 http, ftp, https 등이 있다. 프로토콜에 대한 포트는 생략이 가능하다. https는 http에 보안 기능을 추가한 것.
  • 호스트명(www.google.com): DNS 서버에 호스트명이 저장되어 있으며 이는 IP 주소와 대응한다.
  • 포트 번호(443): 그 포트 번호. 일반적으로는 생략해도 된다.
  • path(/search): 서버에 도착하면 서버 내 우리가 요청하고자 하는 특정 페이지에 대한 디렉토리까지의 path를 뜻한다. 즉, 리소스에 대한 경로를 뜻하며 이는 계층적인 구조이다.
  • 쿼리 파라미터(q=hello&hl=ko): key=value 형태를 띄고 있다. 웹 서버에 제공하는 파라미터로, 클라이언트가 서버에게 요청할 때, 특정 요청을 전달하는 인자에 해당한다. 보면 알겠지만 우리가 보낸 쿼리는 hello에 대한 검색이고, 그에 대한 결과는 한국어 페이지(ko)로 띄워달라는 파라미터이다. 보다시피 문자 형태를 띈다. ?로 시작하며 &로 파라미터를 추가할 수 있다.

 

 

웹브라우저 요청 흐름(중요!)

면접 단골 질문이니 잘 정리해두자.

 

자, 구글에 접속해보자.

 

 

이제 면접관이 질문을 한다.

지금부터 구글에 hello를 검색할 거예요. 검색창이 뜨기까지, 컴퓨터에서는 무슨 일이 벌어지고 있는지 설명해주세요.

 

검색창에 hello를 적고 enter를 누르는 순간부터 시작한다.

 

1. 

 

 

 

 

 

 

 

반응형