DNS가 어떻게 동작하는지 설명해주세요.

김상욱·2024년 12월 4일

DNS가 어떻게 동작하는지 설명해주세요.

DNS(Domain Name System)는 인터넷에서 도메인 이름(www.example.com)을 IP주소(192.168.1.1)로 변환하는 시스템입니다. 사람들이 기억하기 쉬운 도메인 이름을 사용해도 컴퓨터는 숫자로 된 IP 주소를 사용해 통신하기 때문에 DNS가 필요.

DNS의 기본 개념
도메인 이름은 사용자가 웹사이트에 접근하기 위해 입력하는 주소. - IP 주소는 컴퓨터가 데이터를 주고받을 때 사용하는 네트워크 주소.
DNS는 이 둘을 연결하는 전화번호부 역할.

DNS의 주요 구성 요소
DNS 클라이언트(Resolver) : 사용자의 컴퓨터나 브라우저에서 동작하며 도메인 이름에 대한 IP 주소를 요청.
DNS 서버 : 요청을 받아 정보를 제공하거나, 다른 DNS 서버에 요청을 전달.

  • 루트 네임 서버 : 최상위 서버로 .com, .org 등 최상위 도메인을 관리
  • TLD 서버 : Top-Level Domain 서버로 특정 도메인 그룹의 정보를 관리한다.(ex - .com에 대한 정보)
  • 권한 있는 네임 서버(Authoritative Name Server) : 특정 도메인 이름의 최종 IP 주소를 보유한 서버

DNS 동작 과정
사용자가 www.example.com을 입력했을 때
1. 사용자의 브라우저 요청 : 사용자가 브라우저에 도메인을 입력하면 브라우저는 운영 체제의 DNS Resolver에게 도메인의 IP 주소를 요청.
2. 로컬 캐시 확인 : 운영 체제는 이전에 같은 도메인을 요청한 적이 있다면 캐시에 저장된 IP 주소를 사용. 캐시에 없다면 ISP(인터넷 서비스 제공업체)의 DNS 서버에 요청을 보낸다.
3. ISP의 리졸버 확인 : ISP의 리졸버는 캐시를 확인. 캐시에도 없으면, 루트 네임 서버에 요청을 보냄.
4. 루트 네임 서버 문의 : 루트 네임 서버는 요청받은 도메인의 최상위 도메인(TLD)을 식별
ex) ww.example.com의 경우 .com TLD를 관리한 TLD 주소 서버를 반환
5. TLD 서버 문의 : .com TLD 서버는 example.com의 권한 있는 네임 서버 주소를 반환
6. 권한 있는 네임 서버 문의 : example.com의 권한 있는 네임 서버는 www.example.com의 IP 주소를 반환
7. 최종적으로 IP 주소를 사용자의 브라우저에 반환. 이 IP 주소는 로컬 및 ISP 캐시에 저장되어 다음 요청 시 더 빠르게 처리.
8. 브라우저 요청 처리 : 브라우저는 반환받은 IP 주소를 사용해 웹 서버에 연결하고, 사용자가 요청한 웹페이지를 가져옴.


DNS 동작에 대해 실습을 통해 학습할 수 있는 부분은 크게 네트워크와 DNS 관련 도구를 사용하는 방법, Spring 백엔드에서의 DNS 활용 이해로 나눌 수 있습니다. 신입 Java, Spring 백엔드 개발자 입장에서 적합한 실습 아이디어를 정리해 드립니다.


1. DNS 동작 원리 실습

1-1. nslookup과 dig 도구 사용

  • DNS 조회 동작을 확인하기 위해 터미널에서 nslookup 또는 dig 명령어를 사용해 도메인 이름의 IP 주소를 확인해보세요.

실습 예제:

# 도메인의 A 레코드 조회
nslookup www.google.com

# 특정 DNS 서버를 통해 조회
nslookup www.google.com 8.8.8.8

# 자세한 정보 조회 (dig 사용)
dig www.google.com
dig www.google.com +trace
  • +trace 옵션을 사용하면 DNS 요청이 루트 서버부터 권한 있는 네임 서버까지 전달되는 과정을 확인할 수 있습니다.

1-2. hosts 파일 수정

  • 로컬 네트워크 캐시와 유사한 방식으로 동작하는 hosts 파일을 수정하여, 특정 도메인 이름을 원하는 IP 주소로 매핑할 수 있습니다.

실습 방법:
1. hosts 파일 열기 (운영체제별로 다름).

  • Linux/MacOS: /etc/hosts
  • Windows: C:\Windows\System32\drivers\etc\hosts
  1. 예시:
    127.0.0.1    mylocaltest.com
  2. 브라우저에서 http://mylocaltest.com 접속 → 로컬에서 제공하는 응답 확인.

2. Java/Spring 백엔드 개발자를 위한 실습

2-1. Java로 DNS 조회 기능 구현

Java의 기본 네트워크 API를 활용해 특정 도메인의 IP 주소를 확인하는 간단한 DNS 조회 프로그램을 작성할 수 있습니다.

예제 코드:

import java.net.InetAddress;

public class DnsLookupExample {
    public static void main(String[] args) {
        try {
            // 도메인 이름
            String domain = "www.example.com";

            // IP 주소 조회
            InetAddress[] addresses = InetAddress.getAllByName(domain);

            System.out.println("IP addresses for domain: " + domain);
            for (InetAddress address : addresses) {
                System.out.println(address.getHostAddress());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 위 코드를 실행하면 도메인 이름의 IP 주소가 출력됩니다.
  • 이 코드를 확장해 입력받은 도메인의 DNS 기록을 저장하거나 분석하는 프로그램을 만들어도 좋습니다.

2-2. Spring Boot와 외부 DNS 서비스 통합

Spring Boot 애플리케이션에서 외부 API 또는 DNS 관련 서비스를 활용하는 방법을 익힐 수 있습니다.

실습 아이디어:
1. 외부 DNS API 사용

  • Cloudflare, Google DNS 같은 API를 통해 DNS 레코드를 조회.
  • 예를 들어, Cloudflare의 DNS 조회 API:
    curl -X GET "https://cloudflare-dns.com/dns-query?name=example.com&type=A" \
         -H "accept: application/dns-json"
  • 이를 Spring Boot 애플리케이션에서 호출하여 결과를 출력.
  1. Spring Boot에서 DNS 호출 기능 구현
    • RestTemplate 또는 WebClient를 사용해 외부 DNS API에 요청.
    • 결과를 가공해 클라이언트에 반환하는 간단한 RESTful 서비스 개발.

Spring Boot 컨트롤러 예제:

@RestController
@RequestMapping("/dns")
public class DnsController {

    @GetMapping("/lookup")
    public List<String> lookup(@RequestParam String domain) {
        try {
            InetAddress[] addresses = InetAddress.getAllByName(domain);
            return Arrays.stream(addresses)
                         .map(InetAddress::getHostAddress)
                         .collect(Collectors.toList());
        } catch (Exception e) {
            return List.of("Error: " + e.getMessage());
        }
    }
}
  • /dns/lookup?domain=example.com로 요청하면 해당 도메인의 IP 주소를 반환하는 API.

2-3. DNS 설정 변경에 따른 애플리케이션 동작 확인

Spring Boot 애플리케이션에서 커스텀 DNS 서버를 설정하여 특정 DNS 서버를 통해 요청을 보낼 수도 있습니다.

실습 예제:
1. application.properties에 DNS 서버 설정 추가:

java.net.preferIPv4Stack=true
sun.net.spi.nameservice.provider.1=dns,8.8.8.8
  • Google Public DNS 서버(8.8.8.8)를 사용.
  1. 위 DNS 설정이 애플리케이션의 도메인 조회에 영향을 미치는지 확인.

3. Docker와 DNS 실습

Docker 컨테이너에서 특정 DNS 서버를 설정해 컨테이너의 네트워크 요청이 어떻게 처리되는지 확인.

실습 아이디어:
1. Docker 컨테이너 실행 시 특정 DNS 서버 설정:

docker run --dns=8.8.8.8 -it alpine nslookup www.google.com
  1. 컨테이너 내부에서 다른 DNS 서버를 사용하도록 설정 후 결과 비교.

4. Kubernetes와 DNS

클라우드 환경에서 DNS는 필수적인 요소입니다. Kubernetes에서는 CoreDNS를 사용해 클러스터 내부 서비스 간의 통신을 관리합니다.

실습 아이디어:

  • Kubernetes에서 간단한 서비스를 배포하고 DNS를 활용해 서비스 이름으로 통신 테스트.
  • 예: curl my-service.default.svc.cluster.local

5. DNS와 로드밸런싱

백엔드 개발에서는 DNS와 로드밸런서를 조합해 트래픽을 분산 처리하는 구조를 이해하는 것이 중요합니다.

실습 아이디어:
1. NGINX를 사용해 여러 백엔드 서버로 요청을 분산.
2. DNS Round-Robin 설정을 테스트:

  • DNS 레코드에 여러 IP 주소를 설정하고 클라이언트 요청이 어떻게 분산되는지 확인.

실습을 통해 배울 수 있는 점

  1. 네트워크 기본 원리 이해 (DNS의 역할과 동작 과정).
  2. Java와 Spring Boot를 활용한 네트워크 프로그래밍 기초.
  3. 클라우드 환경에서 DNS 활용 (Docker, Kubernetes).
  4. 백엔드 개발 시 DNS 설정 변경에 따른 시스템 동작 확인.

이 실습들을 통해 DNS의 역할과 백엔드 개발에서의 활용도를 자연스럽게 이해할 수 있을 것입니다!

0개의 댓글