DNS over HTTPS (DoH)용 JSON API

이전에는 웹 기반 애플리케이션에 DANE, DNS-SD 서비스 검색과 같은 고급 DNS 기능을 사용하거나 MX 레코드와 같이 IP 주소가 아닌 다른 항목을 확인하려면 브라우저 확장 프로그램이 필요했습니다. 브라우저나 OS에서 SSHFP 레코드와 같은 DNSSEC 종속 기능을 사용하려면 이러한 확장 프로그램에서 DNSSEC 자체의 유효성을 검사해야 합니다.

2016년부터 Google Public DNS는 브라우저나 OS 구성이나 확장 프로그램이 필요 없는 DNSSEC 유효성 검사와 함께 웹 친화적인 DoH용 API를 제공했습니다. 간단한 GET 쿼리 매개변수와 JSON 응답을 통해 클라이언트가 일반적인 웹 API를 사용하여 결과를 파싱하고 도메인 이름의 포인터 압축과 같은 복잡한 DNS 메시지 형식 세부정보를 피할 수 있습니다.

HTTP 헤더, 리디렉션 처리, 개인 정보 보호 권장사항, HTTP 상태 코드와 같은 DoH 일반적인 내용은 일반적인 DoH 문서 페이지를 참조하세요.

보안 전송 페이지에는 DoH에 대한 curl 명령줄 예시와 DoH 및 DNS over TLS(DoT)에 공통되는 정보(예: TLS 지원 및 DNS 잘림)가 있습니다.

JSON API 사양

모든 API 호출은 HTTP GET 요청입니다. 중복 매개변수의 경우 첫 번째 값만 사용됩니다.

지원되는 매개변수

이름

문자열, 필수

유일한 필수 매개변수입니다. RFC 4343 백슬래시 이스케이프가 허용됩니다.

  • 길이 (백슬래시 이스케이프를 대체한 후)는 1과 253 사이여야 합니다(선택사항인 후행 점이 있는 경우 무시).
  • 모든 라벨 (점 사이에 있는 이름의 일부) 길이가 1~63바이트여야 합니다.
  • .example.com, example..com 또는 빈 문자열과 같은 잘못된 이름 또는 400 잘못된 요청 가져오기.
  • ASCII가 아닌 문자는 푸니코딩해야 합니다 (ελ가 아닌 xn--qxam).
유형

문자열, 기본값: 1

RR 유형은 [1, 65535] 형식의 숫자 또는 표준 문자열(A 또는 aaaa 등 대소문자를 구분하지 않음)로 표시할 수 있습니다. 'ANY' 쿼리에 255를 사용할 수 있지만 A 및 AAAA 또는 MX 레코드 모두의 쿼리를 전송하기 위한 대체는 아닙니다. 권한 네임서버가 이러한 쿼리에 대해 모든 레코드를 반환할 필요는 없습니다. 일부는 응답하지 않으며, 다른 데이터 (예: cloudflare.com)는 HINFO만 반환합니다.

cd

불리언, 기본값: false

CD (Checking Disabled) 플래그입니다. cd=1 또는 cd=true를 사용하여 DNSSEC 유효성 검사를 중지합니다. cd=0, cd=false 또는 cd 매개변수를 사용하지 않고 DNSSEC 유효성 검사를 사용 설정합니다.

개수

문자열, 기본값: 비어 있음

원하는 콘텐츠 유형 옵션. ct=application/dns-message를 사용하여 응답 HTTP 본문에 JSON 텍스트 대신 바이너리 DNS 메시지를 수신합니다. ct=application/x-javascript를 사용하여 JSON 텍스트를 명시적으로 요청합니다. 다른 콘텐츠 유형 값은 무시되고 기본 JSON 콘텐츠가 반환됩니다.

포함된

불리언, 기본값: false

DO (DNSSEC OK) 플래그입니다. DNSSEC 레코드 (RRSIG, NSEC, NSEC3)를 포함하려면 do=1 또는 do=true를 사용합니다. do=0, do=false 또는 do 매개변수를 사용하지 않고 DNSSEC 레코드를 생략합니다.

다른 구현에 항상 DNSSEC가 포함될 수 있으므로 애플리케이션은 JSON 응답의 모든 DNSSEC 레코드를 항상 처리하고 필요한 경우 무시해야 합니다. Google에서는 향후 JSON 응답의 기본 동작을 변경할 수 있습니다. 바이너리 DNS 메시지 응답은 항상 DO 플래그 값을 따릅니다.

edns_client_subnet

문자열, 기본값: 비어 있음

edns0-client-subnet 옵션 형식은 서브넷 마스크가 있는 IP 주소입니다. 예: 1.2.3.4/24, 2001:700:300::/48

개인 정보 보호 문제로 DNS-over-HTTPS를 사용하고 있고 지리적 위치의 정확성을 위해 IP 주소의 어떤 부분도 신뢰할 수 있는 네임서버로 전송하지 않으려는 경우 edns_client_subnet=0.0.0.0/0를 사용합니다. Google Public DNS는 일반적으로 대략적인 네트워크 정보를 보냅니다. 일반적으로 IPv4 주소의 마지막 부분을 0으로 만듭니다.

random_padding

문자열, 무시됨

이 매개변수의 값은 무시됩니다. 예: XmkMw~o_mgP2pf.gpw-Oi5dK

HTTPS GET 요청의 패킷 크기를 사용하여 발생할 수 있는 부채널 개인 정보 보호 공격에 관해 우려하는 API 클라이언트는 이를 사용하여 임의 데이터로 요청을 패딩하여 모든 요청을 정확히 동일한 크기로 만들 수 있습니다. URL의 잘못된 해석을 방지하려면 패딩 문자를 예약되지 않은 URL 문자(대문자 및 소문자, 숫자, 하이픈, 마침표, 밑줄, 물결표)로 제한합니다.

JSON 형식의 DNS 응답

성공적인 응답 (여기에 추가된 댓글은 실제 응답에 표시되지 않음):

{
  "Status": 0,  // NOERROR - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question":
  [
    {
      "name": "apple.com.",  // FQDN with trailing dot
      "type": 1              // A - Standard DNS RR type
    }
  ],
  "Answer":
  [
    {
      "name": "apple.com.",   // Always matches name in the Question section
      "type": 1,              // A - Standard DNS RR type
      "TTL": 3599,            // Record's time-to-live in seconds
      "data": "17.178.96.59"  // Data for A - IP address as text
    },
    {
      "name": "apple.com.",
      "type": 1,
      "TTL": 3599,
      "data": "17.172.224.47"
    },
    {
      "name": "apple.com.",
      "type": 1,
      "TTL": 3599,
      "data": "17.142.160.59"
    }
  ],
  "edns_client_subnet": "12.34.56.78/0"  // IP address / scope prefix-length
}

'범위 프리픽스 길이'와 캐싱에 미치는 영향에 대한 자세한 내용은 RFC 7871 (EDNS 클라이언트 서브넷)을 참조하세요.

진단 정보가 포함된 실패 응답:

{
  "Status": 2,  // SERVFAIL - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question":
  [
    {
      "name": "dnssec-failed.org.",  // FQDN with trailing dot
      "type": 1                      // A - Standard DNS RR type
    }
  ],
  "Comment": "DNSSEC validation failure. Please check http://dnsviz.net/d/dnssec-failed.org/dnssec/."
}

따옴표 및 네임서버 저작자 표시가 포함된 SPF 및 TXT 레코드:

{
  "Status": 0,  // NOERROR - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question": [
    {
      "name": "*.dns-example.info.",  // FQDN with trailing dot
      "type": 99                      // SPF - Standard DNS RR type
    }
  ],
  "Answer": [
    {
      "name": "*.dns-example.info.",   // Always matches name in Question
      "type": 99,                      // SPF - Standard DNS RR type
      "TTL": 21599,                    // Record's time-to-live in seconds
      "data": "\"v=spf1 -all\""        // Data for SPF - quoted string
    }
  ],
  "Comment": "Response from 216.239.38.110"
  // Uncached responses are attributed to the authoritative name server
}

{
  "Status": 0,  // NOERROR - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question": [
    {
      "name": "s1024._domainkey.yahoo.com.", // FQDN with trailing dot
      "type": 16                             // TXT - Standard DNS RR type
    }
  ],
  "Answer": [
    {
      "name": "s1024._domainkey.yahoo.com.", // Always matches Question name
      "type": 16,                            // TXT - Standard DNS RR type
      "data": "\"k=rsa;  p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDrEee0Ri4Juz+QfiWYui/E9UGSXau/2P8LjnTD8V4Unn+2FAZVGE3kL23bzeoULYv4PeleB3gfm\"\"JiDJOKU3Ns5L4KJAUUHjFwDebt0NP+sBK0VKeTATL2Yr/S3bT/xhy+1xtj4RkdV7fVxTn56Lb4udUnwuxK4V5b5PdOKj/+XcwIDAQAB; n=A 1024 bit key;\""
      // Data for TXT - multiple quoted strings
    }
  ],
}

DNS 문자열

모든 TXT 레코드는 RFC 4408 (SPF) 또는 RFC 4871 (DKIM)과 같이 더 긴 TXT 레코드 형식의 사용을 포함하여 단일 JSON 문자열로 인코딩됩니다.

통합 DNS : EDNS : EDNS

일반적인 EDNS 확장 메커니즘은 지원되지 않습니다. EDNS 클라이언트 서브넷 옵션 (edns-client-subnet)은 GET 요청의 매개변수이자 JSON 응답의 최상위 필드입니다.