- 평소에 알고 있는 인터넷 접근방식을 보다 자세히 알고자 이 블로그를 작성하였습니다.
- naver.com을 검색시 어떻게 동작하며 이를 어떻게 naver.com으로 접속할 수 있는지 조사하여 작성하고자 합니다.
우선 DNS을 사용하기 전에 평소에 Naver와 같이 접근하기 위해서는 URL을 사용하는데 구조을 분석해보겠습니다.
URL
URL(Uniform Resource Locator)은 인터넷 상에서 자원이 위치한 고유한 주소를 나타내는 문자열입니다.
예를 들어, "https://www.example.com:8080/path/to/page?query=string&key=value" 라는 URL을 살펴보겠습니다.
- 프로토콜(Protocol): "https://"
- 이 부분은 웹 브라우저가 서버와 통신하는 방식을 지정합니다.
- 여기서는 "https"라는 프로토콜이 사용되었습니다.
- 호스트(Host): "www.example.com"
- 이 부분은 웹 페이지가 호스팅되어 있는 서버의 도메인 이름이나 IP 주소를 지정합니다.
- 여기서는 "www.example.com"이라는 도메인이 사용되었습니다.
- 포트(Port): ":8080"
- 이 부분은 서버와의 통신에 사용되는 포트 번호를 지정합니다.
- 여기서는 포트 번호가 "8080"으로 지정되어 있습니다.
- 경로(Path): "/path/to/page"
- 이 부분은 서버 내에서 요청한 페이지의 경로를 지정합니다.
- 여기서는 "/path/to/page"라는 경로가 사용되었습니다.
- 쿼리(Query): "?query=string&key=value"
- 이 부분은 서버에 전달되는 추가적인 매개변수를 지정합니다.
- 여기서는 "query=string&key=value"라는 쿼리 문자열이 사용되었습니다.
URI
URI(Uniform Resource Identifier) 는 자원을 식별하는 고유한 주소이며, URI는 리소스의 고유한 식별자를 나타내며, URL과 URN(Uniform Resource Name)을 포함합니다.
DNS
DNS는 Domain Name System의 약자로, 인터넷에서 사용되는 도메인 이름을 해당 도메인이 연결된 IP 주소로 변환하거나, 그 역으로 IP 주소를 도메인 이름으로 변환하는 시스템입니다.
예를 들어, 우리가 "naver.com"이라는 도메인을 웹 브라우저에 입력하여 네이버 웹사이트에 접속하고 싶을 때, DNS를 통해 "naver.com"이라는 도메인 이름이 해당하는 IP 주소로 변환됩니다. 이렇게 변환된 IP 주소를 통해 웹 브라우저는 네이버 서버에 연결됩니다.
필요성
DNS의 역할은 사용자가 외울 수 있는 도메인 이름을 사용하여 인터넷에 연결할 수 있도록 도와주는 것입니다. 만약 DNS가 없다면, 우리는 모든 웹사이트의 IP 주소를 기억해야 하며, 이는 상당히 번거로운 작업이 될 것입니다. 따라서 DNS는 인터넷 사용을 편리하고 직관적으로 만들어주는 중요한 기술입니다.
대표적으로 우리가 자주 접하는 naver.com , google.com 모두 DNS을 가진 DN(Domain Name)이라고 할 수 있습니다.
서비스 | 도메인 주소 | IP 주소 |
다음(Daum) | daum.net | 203.133.167.81 |
네이버(Naver) | naver.com | |
구글(Google) | google.com | 142.250.207.14 |
실제로 위의 IP주소를 통해 google로도 접근 할수 있습니다.
DNS가 IP 주소를 우리가 알아보기 쉬운 문자열로 변환한다는 의미를 이해하고, 이것이 어떻게 이루어지는지 조사해보았습니다.
DNS의 동작원리
windows에서 naver.com을 접근시에 대한 예시로 작성하도록 하겠습니다.
1. 사용자가 naver.com을 접근
2. windows caches에 접근하여 naver.com이 있는지 확인
3. 캐시에 없을시 hosts에 있는지 확인
4. 없으면 Local DNS에 정보가 있는지 확인
5. 없으면 Root DNS에 물어보고 반복하여 com DNS -> naver.com DNS 으로 순차적으로 물어보며 IP 주소를 가지고 오며 이를 토대로 naver.com을 접속할수 있습니다.
이러한 동작원리로 작동되며 3번의 동작원리에서 hosts을 수정시 naver가 아닌 다른 도메인으로 접근할 수 있습니다.
hosts파일을 관리자권한으로 편집하여 아래와 같이 구문을 추가하면
//C:\Windows\System32\drivers\etc\hosts
223.130.200.104 google.co.kr
이후 google.co.kr로 들어갈시 naver.com으로 접속 됨을 확인할 수 있습니다.
hosts 파일은 일반적으로 시스템이 자동으로 수정하지 않으며, 사용자가 필요에 따라 수동으로 수정하여 사용합니다. 이 파일은 주로 개발 및 테스트와 같은 특수한 상황에서 사용됩니다.
또한, 주의할 점은 브라우저가 서로 다른 DNS 캐시를 유지하는 것이 아니라, 해당 운영 체제의 DNS 캐시를 공유한다는 것입니다. 따라서 각 브라우저가 독립적인 DNS 캐시를 유지하는 것이 아니라, 운영 체제의 DNS 캐시를 공유하여 사용합니다. 또한, 운영 체제별로 DNS(Domain Name System)에 접근하는 방식은 기본적으로 유사하지만, 구현 방법에는 차이가 있을 수 있습니다.
Local DNS 서버
로컬 DNS 서버는 사용자의 노트북이나 로컬 네트워크에 설정된 DNS 서버를 말합니다. 일반적으로 사용자의 노트북은 DHCP(Dynamic Host Configuration Protocol)를 통해 로컬 네트워크에 연결될 때 DNS 서버의 주소를 자동으로 받아옵니다. 이 DNS 서버는 사용자의 노트북이 도메인 이름을 IP 주소로 해석할 때 사용됩니다.
즉, 사용자의 노트북이 인터넷에 연결할 때, 해당 노트북의 네트워크 설정에 설정된 DNS 서버를 사용하여 도메인 이름을 해석합니다. 이 DNS 서버는 일반적으로 ISP(인터넷 서비스 제공업체)가 제공하는 DNS 서버이거나 조직의 내부 DNS 서버일 수 있습니다. 사용자의 노트북은 이 로컬 DNS 서버에 도메인 이름을 요청하여 해당하는 IP 주소를 받아오고, 이를 통해 웹 사이트에 접속하거나 통신을 수행합니다.
따라서 로컬 DNS 서버는 사용자의 노트북이나 로컬 네트워크에 설정되어 있으며, 사용자의 인터넷 이용 환경에 중요한 역할을 합니다.
위의 동작 방식을 통해 DNS 서버에서 IP 주소를 얻을 수 있습니다. 이제 이를 기반으로 웹 서버가 어떻게 사용자에게 웹 페이지를 제공하는지에 대한 과정을 조사해보겠습니다.
- DNS를 통해 IP 주소를 얻습니다.
- 웹 서버에 HTTP 요청을 보냅니다. 이 요청은 TCP/IP 프로토콜을 통해 클라이언트에서 서버로 안정적으로 전송됩니다. GET, PUT, DELETE 등의 메서드로 구성되어 있으며, 서버에 필요한 작업을 요청합니다.
- 웹 서버는 요청을 받아들여 해당하는 리소스를 찾습니다.
- 동적 페이지를 요청한 경우, 해당 요청은 웹 애플리케이션 또는 웹 컨테이너로 전달됩니다.
- 웹 컨테이너는 받은 요청을 처리하기 위해 서블릿을 호출하거나 다른 방법으로 웹 애플리케이션을 실행합니다.
- 데이터베이스와 통신하여 결과값을 받아와 이를 사용해 HTTP 응답을 생성합니다.
- HTTP 응답을 웹 서버에게 응답합니다.
- 웹 서버는 생성된 HTTP 응답을 클라이언트에게 전송합니다. 이때 TCP/IP 프로토콜을 사용하여 응답이 클라이언트에게 전달됩니다.
- 클라이언트는 받은 HTTP 응답을 해석하고, 콘텐츠를 표시하여 사용자에게 화면을 보여줍니다.
전체적인 흐름은 이렇게 구성되어 있습니다.
2번 단계에서 클라이언트는 DNS를 통해 얻은 IP 주소로 HTTP 요청을 보냅니다. 이때, 목적지 서버의 IP 주소를 ARP 프로토콜을 사용하여 해당하는 MAC 주소로 변환합니다. 변환된 MAC 주소를 통해 클라이언트는 서버와의 통신이 가능한지를 확인하기 위해 3-way handshake를 수행합니다. 확인이 완료되면 클라이언트는 HTTP 요청을 목적지 서버에게 전송합니다.
상세 과정
- 클라이언트는 목적지 서버의 IP 주소를 ARP 프로토콜을 사용하여 해당하는 MAC 주소로 변환합니다.
- 변환된 MAC 주소를 사용하여 클라이언트와 서버 간의 TCP 연결 설정을 위한 3-way handshake를 시작합니다.
- TCP의 3-way handshake가 완료되면 클라이언트가 HTTP 요청을 목적지 서버에 전송합니다.
- 서버는 데이터를 수신하고, TCP 프로토콜을 사용하여 데이터의 안정성을 유지하기 위해 필요한 경우 데이터 손실을 감지하고 재전송을 요청합니다.
- 데이터 응답이 완료되면, 클라이언트와 서버는 TCP의 4-way handshake를 통해 연결을 종료합니다.
더 자세한 네트워크 과정에 대한 이해를 위해서는 ARP 프로토콜: IP와 MAC 주소의 차이와 필요성, 그리고 TCP와 UDP 프로토콜: 동작원리와 사용 사례 비교에 대한 내용을 확인해보시는 것이 좋습니다.
3번 단계는 요청된 페이지의 특성을 판별하여 해당하는 리소스를 찾는 과정입니다. 이때 웹 서버는 요청된 페이지가 정적페이지인지 동적페이지인지를 구별합니다. 요청된 페이지가 정적페이지인 경우, 웹 서버는 해당 페이지의 파일을 찾아서 바로 응답을 보내게 되며, 동적페이지인 경우에는 웹 애플리케이션에게 요청을 전달하여 동적으로 생성된 콘텐츠를 제공하는 분기점에 해당합니다.
웹 서버
- 정적 콘텐츠(HTML 페이지, 이미지, CSS, JavaScript 등)를 제공하고, 요청을 처리하여 해당 파일을 클라이언트에게 전송하는 역할을 합니다.
- 정적 콘텐츠(정적 페이지)의 제공과 HTTP 요청의 처리가 주된 역할입니다. 주로 Apache, Nginx 등이 웹 서버로 사용됩니다.
- 주로 정적 콘텐츠를 제공하기 위해 HTTP 프로토콜을 사용합니다.
- 주로 SSL/TLS 같은 보안 기능을 제공하여 데이터의 암호화와 사용자 인증을 처리합니다.
WAS(Web Application Server)
- 동적 콘텐츠를 생성하고 처리하는 역할을 합니다. 이를 위해 서버 사이드 기술(Java EE, ASP.NET, PHP 등)을 사용하여 비즈니스 로직을 실행하고 데이터베이스와의 상호작용을 담당합니다.
- 동적 콘텐츠(동적 페이지)를 처리하며, 클라이언트 요청에 따라 데이터베이스에 접근하고 비즈니스 로직을 실행합니다. 주로 Tomcat, JBoss, WebSphere, WebLogic 등이 WAS로 사용됩니다.
- HTTP 뿐만 아니라, 서버 사이드 기술에 따라 다양한 프로토콜을 지원할 수 있습니다.
- WAS도 SSL/TLS와 같은 보안 기능을 제공할 수 있으나, 주로 애플리케이션 자체의 보안을 강화하는 데 초점을 맞춥니다.
- WAS = Web Server + Web Container
정적페이지(Static Page)
- 정적페이지는 웹 서버에 미리 저장된 파일로, 서버에서 직접 그 내용을 제공합니다.
- HTML, CSS, JavaScript 등의 파일이 정적페이지에 속합니다.
- 정적페이지는 요청시에 변경되지 않으며, 항상 동일한 콘텐츠를 제공합니다.
- 예시로는 회사 웹사이트의 소개 페이지, 블로그의 기사 내용 등에 해당합니다.
동적페이지(Dynamic Page)
- 동적페이지는 서버에서 요청에 따라 생성되는 콘텐츠입니다.
- 서버 측 프로그램(예: PHP, Java, Python 등)을 통해 요청에 맞는 콘텐츠를 동적으로 생성합니다.
- 동적페이지는 사용자의 요청이나 상황에 따라 다양한 형태의 콘텐츠를 생성할 수 있습니다.
- 예시로는 로그인 페이지, 사용자 프로필 페이지, 온라인 쇼핑몰의 상품 목록 등에 해당합니다.
주요 차이점으로는 사용자의 이벤트 처리 여부로 사용자의 이벤트와 관계없이 항상 동일한 내용을 제공하는 페이지는 정적페이지에 해당하며, 사용자의 이벤트에 따라 페이지의 내용이 동적으로 변경되는 페이지는 동적페이지에 해당합니다.
Web Server와 WAS의 분리 이유
- 역할 분리: 웹 서버는 정적 콘텐츠 제공 및 요청 전달과 같은 단순한 기능을 처리하고, WAS는 동적 콘텐츠 생성 및 비즈니스 로직 처리와 같이 복잡한 기능을 처리합니다. 이러한 역할 분리는 시스템의 유지보수와 관리를 쉽게 합니다.
- 확장성: 웹 서버와 WAS를 분리하면 각각의 서버를 독립적으로 확장할 수 있습니다.
- 성능: 웹 서버는 정적 콘텐츠를 제공하는 데 최적화되어 있으며, WAS는 동적 콘텐츠를 처리하는 데 최적화되어 있습니다. 따라서 각각의 서버가 자신의 역할에만 집중하면서 전체 시스템의 성능을 향상시킬 수 있습니다.
- 안정성: 각각의 서버가 독립적으로 동작하기 때문에 한 서버에서 발생한 장애가 다른 서버에 영향을 미치지 않습니다. 이는 시스템의 안정성을 향상시키는 데 도움이 됩니다.
이제 이러한 정적페이지와 동적페이지를 웹 서버에서 어떻게 구별하는지 살펴보겠습니다 .
웹서버에서의 정적페이지와 동적페이지 구별
파일 확장자를 통한 구별
- 일반적으로 정적페이지는 .html, .css, .js와 같은 파일 확장자를 갖습니다. 이러한 파일 확장자를 가진 요청은 웹 서버에 의해 정적으로 처리됩니다.
- 반면에 동적페이지는 .php, .jsp, .aspx와 같은 서버 사이드 스크립트 언어를 사용하는 파일 확장자를 갖습니다. 이러한 파일 확장자를 가진 요청은 웹 서버가 해당 언어의 서버에서 처리됩니다.
URL 패턴을 통한 구별
- 웹 서버는 요청된 URL의 패턴을 분석하여 정적페이지와 동적페이지를 구별할 수 있습니다.
- 예를 들어, "/static/"이라는 패턴을 가진 URL은 정적페이지로 처리하고, "/dynamic/"이라는 패턴을 가진 URL은 동적페이지로 처리할 수 있습니다.
- 이는 개발자가 웹서버나 웹애플리케이션의 설정에 따라 달라질 수 있습니다.
HTTP 요청 헤더를 통한 구별
- 클라이언트가 요청하는 페이지의 정보를 담고 있는 HTTP 요청 헤더를 분석하여 정적페이지와 동적페이지를 구별할 수 있습니다.
- 일부 웹 서버는 특정한 요청 헤더를 보고 해당 요청을 동적페이지로 처리하도록 구성할 수 있습니다.
- 예를 들어, 클라이언트가 정적페이지를 요청할 때는 HTTP 요청 헤더에는 "Accept: text/html"과 같은 값이 포함될 수 있습니다. 반면에 동적페이지를 요청할 때는 JSON 혹은 XML과 같은 데이터 형식을 요청할 수 있습니다. 따라서 "Accept: application/json"이나 "Accept: application/xml"과 같은 헤더가 요청에 포함될 수 있습니다.
웹 서버는 이러한 방법들을 통해 정적 페이지와 동적 페이지를 구별하고, 그에 맞게 HTTP 응답을 생성합니다.
이제 WAS 또는 Web Container에서 동적페이지를 처리하는 과정을 살펴보겠습니다.
Web Container
- 웹 애플리케이션을 실행하고 관리하는 서버 환경을 제공하는 소프트웨어입니다.
- 웹 컨테이너는 일반적으로 서블릿(Servlet)과 JavaServer Pages(JSP)와 같은 웹 애플리케이션 컴포넌트를 실행하고 이를 관리하는 역할을 수행합니다.
- 주로 자바 서버 페이지(JSP)와 서블릿 기술을 기반으로 동작합니다.
- 주요 웹 컨테이너에는 Apache Tomcat, Jetty, IBM WebSphere, Oracle WebLogic 등이 있습니다.
- 주요 기능
- 웹 애플리케이션 실행 환경 제공: 웹 컨테이너는 웹 애플리케이션을 실행하는 데 필요한 환경을 제공합니다. 이는 웹 애플리케이션의 배포, 실행, 관리를 담당합니다.
- 요청 처리 및 응답 제공: 클라이언트로부터 HTTP 요청을 받아들이고, 해당 요청을 처리하여 적절한 응답을 생성합니다. 이를 통해 웹 애플리케이션은 클라이언트와 상호작용할 수 있습니다.
- 서블릿과 JSP 실행: 웹 컨테이너는 서블릿과 JSP 파일을 실행하고, 이를 통해 동적 콘텐츠를 생성합니다. 이를 위해 서블릿 컨테이너와 JSP 컨테이너가 포함되어 있습니다.
- 세션 관리 및 상태 유지: 웹 컨테이너는 클라이언트와 서버 간의 상태를 유지하기 위해 세션 관리 기능을 제공합니다. 이를 통해 사용자의 로그인 상태나 장바구니와 같은 상태를 유지할 수 있습니다.
- 보안 및 인증: 웹 컨테이너는 보안 기능을 제공하여 웹 애플리케이션의 보안을 강화합니다. 이는 사용자 인증, 권한 부여, 데이터 암호화 등을 포함합니다.
- 스레드 관리: 웹 컨테이너는 동시 다중 요청을 처리하기 위해 스레드 풀을 관리하고, 이를 통해 효율적인 리소스 활용을 지원합니다.
WAS 동작 원리
- WAS는 해당 요청을 처리할 수 있는 웹 컨테이너로 전달합니다. 웹 컨테이너는 서블릿 컨테이너의 일종으로, 클라이언트의 요청을 받아들이고 처리하기 위한 환경을 제공합니다.
- 웹 컨테이너는 요청된 서블릿을 로드하고 실행합니다. 이를 통해 클라이언트의 요청에 따라 동적으로 콘텐츠를 생성하고 처리할 수 있습니다.
- 서블릿은 클라이언트의 요청을 처리하기 위해 필요한 비즈니스 로직을 실행합니다. 이 단계에서는 데이터베이스나 외부 시스템과의 상호 작용 등의 작업이 수행될 수 있습니다.
- 처리된 결과에 따라 서블릿은 HTTP 응답을 생성합니다. 이 응답은 클라이언트에게 반환될 것입니다.
이러한 과정을 통해 사용자가 naver.com을 요청하면, 먼저 DNS를 통해 해당 도메인의 IP 주소를 가져옵니다. 이후, 웹 서버와 WAS를 거쳐 응답을 받게 됩니다.
출처
- https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
- https://all-young.tistory.com/21
- https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-DNS-%EA%B0%9C%EB%85%90-%EB%8F%99%EC%9E%91-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4-%E2%98%85-%EC%95%8C%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC
- https://blog.naver.com/koromoon/120173630705
'네트워크' 카테고리의 다른 글
TCP와 UDP 프로토콜: 동작원리와 비교 (0) | 2024.06.12 |
---|---|
ARP 프로토콜: IP와 MAC 주소의 차이와 필요성 (0) | 2024.06.12 |
[네트워크]OSI 7Layer (0) | 2022.04.10 |