Computer >> 컴퓨터 >  >> 네트워킹 >> 네트워킹

DNS 캐시란 무엇인가? 인터넷 속도 향상을 위한 DNS 캐싱 완벽 가이드

DNS 캐시(때로는 DNS 리졸버(resolver) 캐시라고도 불림)는 컴퓨터 운영체제가 유지 관리하는 임시 데이터베이스로, 최근에 방문했거나 방문을 시도한 웹사이트 및 기타 인터넷 도메인에 대한 기록을 담고 있습니다.

쉽게 말해, DNS 캐시는 최근 수행된 DNS 조회(lookup) 기록의 모음입니다. 웹사이트를 불러오려 할 때 컴퓨터가 이 기록을 빠르게 참조할 수 있기 때문에 접속 속도가 크게 향상됩니다.

이 글의 내용은 DNS 설정을 별도로 변경하지 않은 일반 가정용 사용자를 기준으로 작성되었습니다.

DNS 캐시의 목적

인터넷은 도메인 네임 시스템(DNS, Domain Name System)에 의존하여 모든 공개 웹사이트와 그에 해당하는 IP 주소의 색인을 관리합니다. 이를 흔히 '전화번호부'에 비유하곤 합니다.

전화번호부가 있으면 모든 사람의 전화번호를 외울 필요가 없습니다. 전화기끼리 통신하려면 반드시 번호가 필요하지만, 번호부만 있으면 이름으로 찾아볼 수 있으니까요. 마찬가지로 DNS 덕분에 우리는 모든 웹사이트의 IP 주소를 외우지 않아도 됩니다. 네트워크 장비와 웹사이트가 서로 통신하려면 IP 주소가 반드시 필요하지만, 사용자는 도메인 이름만 입력하면 되는 것입니다.

그렇다면 브라우저에 웹사이트를 요청할 때 화면 뒤에서는 어떤 일이 벌어질까요?

예를 들어 브라우저에 lifewire.com처럼 URL을 입력하면, 웹 브라우저는 먼저 공유기(라우터)에 해당 사이트의 IP 주소를 요청합니다. 공유기에는 DNS 서버 주소가 저장되어 있으므로, 그 DNS 서버에 해당 호스트명의 IP 주소를 문의합니다. DNS 서버가 lifewire.com에 속한 IP 주소를 찾아내면, 브라우저는 어떤 웹사이트를 요청했는지 파악하고 알맞은 페이지를 불러올 수 있습니다.

이 과정은 방문하는 모든 웹사이트마다 반복됩니다. 호스트명으로 웹사이트에 접속할 때마다 브라우저는 인터넷으로 요청을 보내며, 이 요청은 사이트 이름이 IP 주소로 '변환'되기 전까지는 완료될 수 없습니다.

문제는, 공개 DNS 서버가 아무리 많아도 변환(리졸루션) 과정의 속도를 높여 줄 수는 있어도, 여전히 로컬에 '전화번호부' 사본을 두는 편이 더 빠르다는 점입니다. 바로 이 지점에서 DNS 캐시가 중요한 역할을 합니다.

DNS 캐시는 최근 방문한 주소에 대한 이름 변환을 인터넷으로 요청을 보내기 전에 미리 처리함으로써, 그 과정을 한층 더 빠르게 만들어 줍니다.

실제로 컴퓨터가 웹사이트를 불러오기까지 거치는 '조회' 과정의 모든 단계에는 DNS 캐시가 존재합니다. 컴퓨터가 공유기에 도달하고, 공유기가 ISP(인터넷 서비스 제공업체)에 연결되며, 경우에 따라 다른 ISP를 거쳐 최종적으로 '루트 DNS 서버(root DNS servers)'에 도달하게 됩니다. 이 과정의 각 지점마다 같은 이유, 즉 이름 변환 속도를 높이기 위해 DNS 캐시가 함께 작동하고 있는 것입니다.

DNS 캐시의 작동 원리

브라우저가 외부 네트워크로 요청을 보내기 전에, 컴퓨터는 각 요청을 가로채 DNS 캐시 데이터베이스에서 도메인 이름을 먼저 조회합니다. 이 데이터베이스에는 최근 접근한 모든 도메인 이름과, 처음 요청 시 DNS가 계산해 둔 주소들이 목록 형태로 저장되어 있습니다.

윈도우에서는 명령 프롬프트에 ipconfig /displaydns 명령어를 입력하면 로컬 DNS 캐시의 내용을 확인할 수 있으며, 결과는 대략 다음과 같습니다.

docs.google.com
-------------------------------------
Record Name . . . . . : docs.google.com
Record Type . . . . . : 1
Time To Live . . . . : 21
Data Length . . . . . : 4
Section . . . . . . . : Answer
A (Host) Record . . . : 172.217.6.174

DNS에서 'A' 레코드(A record)는 특정 호스트명에 대한 IP 주소를 담고 있는 항목입니다. DNS 캐시는 이 IP 주소와 요청된 웹사이트 이름, 그리고 호스트 DNS 항목의 여러 다른 매개변수들을 함께 저장합니다.

DNS 캐시 오염(DNS Cache Poisoning)이란?

DNS 캐시에 승인되지 않은 도메인 이름이나 IP 주소가 삽입되면, 그 캐시는 오염(poisoned) 또는 변질(polluted)되었다고 표현합니다.

캐시는 때때로 기술적인 결함이나 관리자의 실수로 인해 손상되기도 하지만, DNS 캐시 오염은 대개 컴퓨터 바이러스나 기타 네트워크 공격이 잘못된 DNS 항목을 캐시에 삽입하는 경우와 연관됩니다.

오염이 발생하면 클라이언트의 요청이 엉뚱한 곳으로 리디렉션됩니다. 대부분 악성 웹사이트나 광고로 가득한 페이지가 목적지입니다.

예를 들어, 위 예시의 docs.google.com 레코드가 다른 'A' 레코드 값을 가지고 있다면, 브라우저에 docs.google.com을 입력했을 때 전혀 다른 곳으로 연결될 것입니다.

이것은 인기 있는 웹사이트에 치명적인 문제를 일으킵니다. 공격자가 Gmail.com에 대한 요청을 겉보기에는 Gmail과 똑같지만 실제로는 아닌 가짜 사이트로 리디렉션한다면, 사용자는 피싱(phishing) 공격의 일종인 '웨일링(whaling)' 등의 피해를 입을 수 있습니다.

DNS 플러싱: 하는 일과 실행 방법

캐시 오염이나 기타 인터넷 연결 문제를 해결할 때, 컴퓨터 관리자는 DNS 캐시를 플러싱(flushing, 즉 비우거나 초기화 또는 삭제)하기도 합니다.

DNS 캐시를 비우면 모든 항목이 제거되므로, 잘못된 레코드 역시 함께 삭제됩니다. 그리고 다음에 해당 웹사이트에 접속하려고 할 때 컴퓨터가 그 주소들을 강제로 새로 채우게 됩니다. 이 새로운 주소들은 네트워크가 사용하도록 설정된 DNS 서버에서 가져옵니다.

앞선 예시를 다시 들어보면, Gmail.com 레코드가 오염되어 이상한 웹사이트로 연결되고 있다면, DNS 플러싱은 정상적인 Gmail.com을 되찾기 위한 좋은 첫걸음입니다.

마이크로소프트 윈도우에서는 명령 프롬프트(Command Prompt)에서 ipconfig /flushdns 명령어를 입력하면 로컬 DNS 캐시를 비울 수 있습니다. 'Windows IP configuration successfully flushed the DNS Resolver Cache' 또는 'Successfully flushed the DNS Resolver Cache'(DNS 확인자 캐시를 성공적으로 플러시했습니다)라는 메시지가 나타나면 정상적으로 실행된 것입니다.

macOS 사용자는 터미널에서 dscacheutil -flushcache 명령어를 사용하면 됩니다. 다만 이 명령은 실행 후 '성공' 메시지를 표시하지 않으므로, 작동 여부를 직접 알려주지 않는다는 점에 유의하세요. 경우에 따라 Mac 사용자는 DNS 응답기(responder)를 종료해야 할 수도 있습니다(sudo killall -HUP mDNSResponder). 리눅스 사용자는 /etc/rc.d/init.d/nscd restart 명령어를 입력하면 되지만, 정확한 명령어는 사용 중인 리눅스 배포판에 따라 달라질 수 있습니다.

공유기(라우터)에도 DNS 캐시가 존재할 수 있습니다. 그래서 네트워크 문제 해결 과정에서 공유기를 재부팅하는 것이 자주 권장되는 것입니다. 컴퓨터에서 DNS 캐시를 비우는 것과 같은 이치로, 공유기를 재부팅하면 임시 메모리에 저장된 DNS 항목들이 삭제됩니다.