왜 .dev, .app, .page (및 40개 이상의 다른 TLD) 가 WHOIS에 응답하지 않을까

발행: (2026년 1월 7일 오전 04:52 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

조사

첫 번째 생각: 구글이 자신의 도메인에 대한 WHOIS 조회를 차단했을까? .dev에 대한 WHOIS 서버를 확인해 보자:

whois -h whois.iana.org dev

출력 (축약):

domain:       DEV
organisation: Charleston Road Registry Inc.
...
whois:

status:       ACTIVE
remarks:      Registration information: https://www.registry.google

whois: 필드가 비어 있는 것을 주목하라—.dev에 대한 WHOIS 서버가 없다.

구글은 40개 이상의 TLD를 보유하고 있으며, 그 중 어느 것도 WHOIS 서버를 가지고 있지 않다. 예를 들면:

.app, .page, .new, .google, .youtube, .android, .chrome, .zip, .mov, .dad, .phd, .prof, .meme, .foo, .nexus, .rsvp, .fly, .ing, .boo, .channel

IANA의 루트 데이터베이스에서 원하는 TLD를 확인할 수 있다 – “WHOIS Server” 필드를 찾아보라. 이것은 버그가 아니라 설계상의 의도이다.

왜 WHOIS가 없나요?

Google은 2012년 이후에 이 TLD들을 출시했으며, 그때 ICANN은 RDAP(Registration Data Access Protocol)라는 새로운 프로토콜을 홍보하기 시작했습니다.

WHOIS의 주요 문제는 표준 형식이 없다는 점입니다—레지스트라마다 서로 다른 텍스트, 필드 이름, 날짜 형식을 반환합니다.

RDAP가 이를 해결합니다:

  • JSON 응답 – 무작위 텍스트 형식을 파싱할 필요 없이 json.Unmarshal만 하면 됩니다.
  • 표준 필드 이름 – 만료 날짜는 항상 eventAction: "expiration"입니다.
  • RESTful API – 간단한 GET 요청만으로 모든 HTTP 클라이언트에서 동작합니다.

2025년 1월, ICANN이 gTLD에 대한 WHOIS를 공식적으로 종료했습니다. 이제 RDAP가 표준이 되었습니다.

RDAP를 사용하여 도메인 만료 확인하기

도메인 만료를 모니터링하거나 조회 도구를 만들고 싶다면, RDAP가 최선의 선택입니다. 아래는 동작하는 Go 예제입니다:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "os"
    "strings"
    "time"
)

func main() {
    domain := "google.dev"
    if len(os.Args) > 1 {
        domain = os.Args[1]
    }

    expiry, err := getExpiry(domain)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }

    days := int(time.Until(expiry).Hours() / 24)
    fmt.Printf("%s expires %s (%d days)\n", domain, expiry.Format("2006-01-02"), days)
}

func getExpiry(domain string) (time.Time, error) {
    tld := domain[strings.LastIndex(domain, ".")+1:]

    // RDAP endpoints (from IANA bootstrap file)
    endpoints := map[string]string{
        "com": "https://rdap.verisign.com/com/v1/domain/",
        "net": "https://rdap.verisign.com/net/v1/domain/",
        "org": "https://rdap.publicinterestregistry.org/rdap/domain/",
        "dev": "https://pubapi.registry.google/rdap/domain/",
        "app": "https://pubapi.registry.google/rdap/domain/",
        "io":  "https://rdap.nic.io/domain/",
    }

    endpoint, ok := endpoints[tld]
    if !ok {
        return time.Time{}, fmt.Errorf("unknown TLD: %s", tld)
    }

    resp, err := http.Get(endpoint + domain)
    if err != nil {
        return time.Time{}, err
    }
    defer resp.Body.Close()

    var data struct {
        Events []struct {
            Action string `json:"eventAction"`
            Date   string `json:"eventDate"`
        } `json:"events"`
    }

    if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
        return time.Time{}, err
    }

    for _, e := range data.Events {
        if e.Action == "expiration" {
            return time.Parse(time.RFC3339, e.Date)
        }
    }

    return time.Time{}, fmt.Errorf("no expiration date found")
}

실행해 보세요:

$ go run main.go google.dev
google.dev expires 2025-09-14 (252 days)

$ go run main.go github.com
github.com expires 2026-10-09 (642 days)

깨끗한 JSON, 표준 필드, 파싱 악몽이 없습니다.

RDAP 적용 범위

모든 gTLD(.com, .org, .dev 등)는 RDAP를 지원합니다. 대부분의 ccTLD(.uk, .de, .ru 등)는 아직 WHOIS에 의존하고 있지만, 적용 범위는 매년 확대되고 있습니다.

RDAP 엔드포인트 전체 목록은 IANA’s bootstrap file에 있습니다; 여기에서 모든 TLD에 대한 올바른 엔드포인트를 확인할 수 있습니다.

핵심 요약

  • 새로운 최상위 도메인(TLD) (특히 Google의)은 WHOIS 서버가 없고 – RDAP만 제공됩니다.
  • ICANN은 2025년에 WHOIS를 폐기했습니다 – RDAP가 미래입니다.
  • RDAP는 JSON을 반환합니다 – 50가지 서로 다른 날짜 형식을 파싱할 필요가 없습니다.

RDAP를 직접 다루고 싶지 않나요? upsonar.io/docs/domain‑expiry – 도메인 만료를 모니터링하고 만료 전에 알림을 보냅니다. 무료 티어 이용 가능.

어떤 TLD를 모니터링하고 있나요? 특이한 엣지 케이스가 있나요?

Back to Blog

관련 글

더 보기 »

기술은 구원자가 아니라 촉진자다

왜 사고의 명확성이 사용하는 도구보다 더 중요한가? Technology는 종종 마법 스위치처럼 취급된다—켜기만 하면 모든 것이 개선된다. 새로운 software, ...

에이전틱 코딩에 입문하기

Copilot Agent와의 경험 나는 주로 GitHub Copilot을 사용해 인라인 편집과 PR 리뷰를 수행했으며, 대부분의 사고는 내 머리로 했습니다. 최근 나는 t...