where-is-the-iss.dedyn.io는 웹사이트가 아니라 DNS LOC 레코드만으로 국제우주정거장(ISS)의 대략적 위치를 돌려주는 장난스러운 실험임
- DNS LOC는 RFC 1876의 실험적 표준으로, 도메인 레코드에 위도·경도뿐 아니라 고도까지 담을 수 있음
- LOC 레코드의 고도 범위는 -100,000m부터 42,849,672m까지라서 지하 시설부터 정지궤도 위성까지 표현 가능함
- ISS 좌표는 N2YO API에서 가져오며, LOC 형식에 맞추려면 고도는 km에서 m로, 위도·경도는 도·분·초 형식으로 변환해야 함
- deSEC API로 레코드를 갱신하고 TTL은 900초로 설정해, 15분마다 최선 노력(best-effort) 방식으로 최신 위치를 반영함
DNS LOC 레코드로 위치를 담기
- 도메인 이름은 보통 서버를 가리키지만, 서버도 결국 데이터센터 안의 물리적 위치를 가진 장비임
- DNS LOC 레코드는 도메인에 위도·경도·고도를 담을 수 있는 DNS 레코드임
- RFC 1876은 LOC 레코드를 정의한 실험적 표준임
- 데이터센터가 고층 건물에 있거나 지하에 있을 수 있어 고도 파라미터도 포함함
- 최소 고도는 -100,000m임
- 최대 고도는 42,849,672m로, 정지궤도 위성에도 쓸 수 있는 범위임
where-is-the-iss.dedyn.io
where-is-the-iss.dedyn.io는 ISS의 대략적 위치를 DNS 질의로 얻기 위해 만든 도메인임
- 이 도메인은 웹사이트가 아니며, ping도 할 수 없고 DNS 외의 상호작용 방식이 없음
- Linux와 Mac 사용자는 다음 명령으로 LOC 레코드를 조회할 수 있음
dig where-is-the-iss.dedyn.io LOC
- 응답은 ISS의 위도·경도·고도를 LOC 형식으로 반환함
;; ANSWER SECTION:
where-is-the-iss.dedyn.io. 1066 IN LOC 47 24 53.500 N 66 12 12.070 W 430520m 10000m 10000m 10000m
- DNS 레코드는 15분마다 최선 노력 방식으로 갱신됨
- Windows의 PowerShell이나 Command Prompt에서는 LOC 레코드를 조회하는 방법을 찾기 어렵다고 봄
위치 데이터 가져오기
- N2YO는 궤도상의 여러 객체를 추적할 수 있는 웹사이트와 무료 티어가 넉넉한 API를 제공함
- ISS는 N2YO API에서 위성 ID 25544로 조회함
- API 응답에는
satlatitude, satlongitude, sataltitude, timestamp, eclipsed 같은 필드가 들어 있음
{
"info": {
"satname": "SPACE STATION",
"satid": 25544,
"transactionscount": 7
},
"positions": [
{
"satlatitude": -21.25409321,
"satlongitude": 140.3335763,
"sataltitude": 420.09,
"azimuth": 292.92,
"elevation": -70.95,
"ra": 202.69300845,
"dec": -32.16097472,
"timestamp": 1751366048,
"eclipsed": true
}
]
}
- N2YO 응답의 고도는 km 단위지만, LOC 형식은 m 단위를 요구함
- 위도와 경도는 십진수로 오기 때문에 LOC 레코드에 넣으려면 도·분·초(Degrees, Minutes, Seconds) 형식으로 바꿔야 함
deSEC로 LOC 레코드 갱신하기
- LOC 레코드 업데이트 API를 제공하는 무료 도메인 이름 제공자는 많지 않았고, 베를린의 자선 단체인 deSEC를 선택함
- deSEC는 API 문서를 제공함
- 초기 LOC 레코드는
rrsets 엔드포인트에 curl로 추가함
curl https://desec.io/api/v1/domains/where-is-the-iss.dedyn.io/rrsets/ \
--header "Authorization: Token _______" \
--header "Content-Type: application/json" --data @- <<< \
'{"type": "LOC", "records": ["40 16 25.712 S 29 32 36.243 W 427550m 0.00m 10000m 10m"], "ttl": 900}'
- 레코드 갱신은 조금 더 까다로워, HTTP PATCH를 다른 URL에 보내야 함
- PATCH 요청에는 바뀐 데이터만 담으면 됨
curl -X PATCH https://desec.io/api/v1/… \
--header "Authorization: Token _______" \
--header "Content-Type: application/json" --data @- <<< \
'{"records": ["40 16 25.712 S 29 32 36.243 W 427550m 0.00m 10000m 10m"]}'
갱신 주기와 한계
- TTL은 900초로 설정함
- 코드는 15분마다 실행되어 DNS 레코드를 갱신함
- 이 주기는 N2YO와 deSEC 양쪽의 API 제한 안에 머무르게 함
- TXT 레코드로 마지막 갱신 시각이나 다른 비정형 데이터를 넣을 수도 있지만, 이 데모에서는 빠른 개념 증명으로 충분하다고 봄
- DNS TXT 레코드에 데이터를 배포하면 요청 제한이 사실상 없는 API처럼 쓸 수도 있으며, 정적이거나 자주 바뀌지 않는 데이터에 더 적합함
DNS에 담을 수 있는 특이한 데이터