DEEP DIVE · TRENDSHIFT #23

DigitalPlatDev/FreeDomain — 153k 스타의
"모두를 위한 무료 도메인" 인프라

153k 스타 · 2.6k 포크 · 50만 개+ 등록 도메인의 비영리 무료 도메인 발급 플랫폼. .dpdns.org · .us.kg · .qzz.io · .xx.kg 4개 확장자를 누구나 1개씩 무료로 받을 수 있다. 가비아·후이즈·Namecheap에서 매년 1~2만 원씩 내던 도메인이 0원이 되는 마법. 운영자 1인(Edward Hsing)이 Hack Club Bank 후원으로 굴리는 nonprofit. AGPL-3.0 일부 오픈소스 — 프론트엔드와 WHOIS 서버 코드 공개, 백엔드는 보안 감사 진행 중.

목차
  1. 한 줄 요약
  2. 왜 지금 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석 — 도메인 위임 + 자체 WHOIS의 작동 원리
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어/시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1한 줄 요약

FreeDomain이 정확히 무엇인지부터 못박고 시작
ONE-LINER

"무료 도메인 등록 사이트"가 아니라, "누군가가 비싼 돈 주고 산 도메인의 하위 영역을 나눠 쓰게 해 주는 인프라"

FreeDomain은 신규 TLD(.com·.net 같은 최상위 도메인)를 발급하는 게 아니다. DigitalPlat Foundation이 ICANN/NIC에서 사전에 구매·등록한 second-level 도메인(dpdns.org·us.kg·qzz.io·xx.kg) 아래에 사용자가 원하는 이름을 서브도메인으로 나눠 갖는다.

예) inbeom.dpdns.org은 사실 dpdns.org(DigitalPlat 소유)의 한 서브도메인이지만, DNS 위임을 통해 사용자 본인이 NS·A·CNAME·TXT 레코드를 자유롭게 통제할 수 있어, 체감상으로는 "내 도메인"과 같다.

비유

제일 가까운 비유는 "건물주가 사 둔 큰 빌딩을 작은 사무실로 쪼개서 공짜로 빌려주는 것". DigitalPlat이 산 빌딩이 dpdns.org, 사용자가 빌리는 호실이 inbeom.dpdns.org. 호실 안 인테리어(DNS 레코드)는 세입자 마음대로 할 수 있고, 빌딩 주인은 가끔 청소(어뷰즈 신고 처리)만 한다.

또 다른 비유는 "공중전화 부스의 자유 사용권". 부스(루트 TLD)는 KT(레지스트라)가 소유하지만, 누구나 들어가서 통화(서브도메인 운영)할 수 있다. FreeDomain은 그 "공중전화 부스"를 nonprofit이 무료로 깔아둔 격이다.

운영 주체는 Edward Hsing이라는 1인 개발자. DigitalPlat Foundation이라는 비영리 단체를 만들고, Hack Club Bank를 통해 후원금을 받아 도메인 갱신·서버 유지 비용을 충당한다. 2026년 5월 기준 50만 개+ 도메인이 등록돼 있어, 사실상 개인 1인이 굴리는 가장 큰 무료 도메인 레지스트라다.

TERM
Second-Level Domain Re-allocation (2LD 재분배)
최상위 도메인(.com·.org 등)을 새로 만드는 건 ICANN 승인이 필요하고 1억 달러 단위가 들지만, 누군가 산 second-level 도메인(예: us.kg)을 사서 그 아래 서브도메인을 무한히 만들 수 있다. example.us.kg은 기술적으로 서브도메인이지만, DNS 위임을 통해 등록자에게 NS 권한을 넘기면 별도 도메인처럼 동작한다. FreeDomain의 핵심 모델.

2왜 지금 주목받는가

TrendShift 23위까지 올라간 이유 — Freenom 몰락과 인디 해커 붐의 합작

1) Freenom 사망 → 무료 도메인 시장의 빈 공간

2010년대 초중반까지 무료 도메인 = Freenom이었다. .tk·.ml·.ga·.cf·.gq 5개 TLD를 무료로 발급해 누적 4천만 개+ 도메인을 등록했다. 그러나 2022년 메타(Meta)가 "Freenom 도메인이 피싱 사기에 압도적으로 많이 쓰인다"며 미국 법원에 소송을 걸었고, 2023년 Freenom은 신규 등록을 영구 중단했다.

그 직후 GitHub Pages·Vercel·Netlify로 개인 프로젝트를 띄우는 인디 해커들이 무료 도메인 대안을 찾기 시작했고, EU.org · is-a.dev · js.org · FreeDomain 등이 그 빈 공간을 채웠다. 이 중 FreeDomain은 "GitHub PR로 신청"이 아니라 "웹 대시보드에서 즉시 발급"이라는 차별점으로 가장 빠르게 성장했다.

2) DNS 잠금 없음 — Cloudflare/FreeDNS 자유 선택

FreeDomain의 가장 큰 장점은 "DNS 제공자를 강제하지 않는다"는 점이다. 일부 무료 도메인 서비스는 자체 DNS만 쓸 수 있게 락인하지만, FreeDomain은 등록자가 NS(네임서버) 레코드를 직접 입력하게 한다.

# DigitalPlat 대시보드에서 NS 레코드 등록
inbeom.dpdns.org  NS  alice.ns.cloudflare.com
inbeom.dpdns.org  NS  bob.ns.cloudflare.com

# 이후 모든 DNS 권한은 Cloudflare로 이관
# A / AAAA / CNAME / TXT / MX 자유 추가
# Cloudflare 무료 SSL · CDN · WAF 그대로 사용 가능

즉, FreeDomain은 "도메인 발급"만 하고 DNS 운영은 Cloudflare·FreeDNS·Hostry·자체 BIND 서버 등 사용자가 자유롭게 고른다. 데이터 주권을 잃지 않는 무료 서비스가 인디 해커들에게 어필한 핵심 포인트.

3) 자체 WHOIS 서버 운영 — RFC 3912 정식 구현

대다수 무료 도메인 서비스가 WHOIS 정보를 공개하지 않거나, 호스팅 회사의 generic 정보로 채우는 데 비해, FreeDomain은 whois.digitalplat.org이라는 자체 WHOIS 서버를 운영한다.

# 표준 RFC 3912 WHOIS 프로토콜 (port 43, TCP)
$ whois -h whois.digitalplat.org example.dpdns.org

Domain Name: example.dpdns.org
Registrant: [REDACTED]
Registered: 2026-02-14
Nameservers: alice.ns.cloudflare.com, bob.ns.cloudflare.com
Status: active

구현은 opensource/whois_server/whois.py 71줄짜리 Python 표준 라이브러리 코드로 공개. port 43에서 TCP socket을 직접 듣고, 1024바이트씩 받아 WHOIS 응답을 반환한다. 외부 의존성 0, RFC 1036 클라이언트 호환.

4) AGPL-3.0 부분 오픈소스 + Hack Club 후원 모델

FreeDomain은 AGPL-3.0으로 라이선스되어 있다. 다만 백엔드 전체가 공개된 건 아니고, 프론트엔드 HTML + WHOIS 서버 + 이메일 템플릿만 opensource/ 폴더에 들어 있다. 운영자 말로는 "보안 감사가 끝나지 않은 코드를 공개하면 악용될 위험이 크다"고 한다.

운영비는 Hack Club Bank 후원금으로 충당된다. Hack Club은 미국의 비영리 청소년 해커 단체로, hcb.hackclub.com에서 누구나 후원할 수 있다. 2026년 기준 50만 개 도메인을 1인이 굴리며 nonprofit 회계 100% 공개라는 점이 OSS 커뮤니티의 신뢰를 얻은 결정적 이유.

3기술 스택 전체 지도

실제 코드/HTML을 뜯어보고 정리한 백엔드·프론트엔드·인프라 스택

백엔드

전체 백엔드 코드는 공개되지 않았지만, 프론트엔드 HTML의 {% include "ga.html" %} · {% include "partials/modern_styles.html" %} 같은 Jinja2 템플릿 문법과 /panel/overview · /whois/ui 같은 URL 라우팅 패턴으로 보아 Python Flask(또는 호환 프레임워크)로 추정된다.

레이어구성요소역할
웹 프레임워크Python Flask (추정) + Jinja2/panel/*·/auth/*·/whois/* 라우트, 템플릿 렌더링
DB비공개 (PostgreSQL/MySQL 추정)사용자·도메인·NS·슬롯·결제·이메일 인증 등
WHOIS 서버Python socket 표준 라이브러리port 43 TCP, RFC 3912 응답
인증이메일 + 비밀번호, 비밀번호 재설정 토큰login.html·register.html·reset_password.html 존재
이메일SMTP 발송 + 자체 템플릿 (opensource/email_template/)가입 인증·비밀번호 재설정·도메인 만료 알림
결제비공개 (Stripe-like 추정) + Hack Club Bank 기부pay_success.html 존재 — 유료 슬롯 확장용

프론트엔드

공개된 opensource/frontend/ 폴더에 16개 HTML 파일이 들어 있다. 모두 서버사이드 렌더링 + iframe 기반 미니 SPA 구조.

분류기술비고
CSS 프레임워크Tailwind CSS (CDN)https://cdn.tailwindcss.com JIT 컴파일러 직접 로드 — 빌드 없음
아이콘Font Awesome 5.15.1 (CDN)fa-tachometer-alt·fa-globe 등 사용
폰트Google Fonts Inter (400/500/600/700)본문·UI 전용 sans-serif
JSVanilla JS (프레임워크 0)iframe src 교체·History API·로딩바 토글
SPA 패턴panel.html에서 iframe + history.pushState사이드바 메뉴 클릭 → iframe URL 교체 + URL ?page= 동기화
라이브 채팅Tawk.to 위젯embed.tawk.to/685fdc4c.../1iur792r9
분석Google Analytics (ga.html include)partials/ 아래에 별도 include
쿠키 동의Cookie Consent Managerdata-cc="show-preferencesModal" 트리거
관찰

2026년 기준으로 보면 "React/Next.js 없이 Flask + Jinja + Tailwind CDN + Vanilla JS" 조합은 약간 클래식한 선택이지만, "1인 운영자가 유지보수 가능한 가장 단순한 풀스택"이라는 점에서 합리적이다. 빌드 파이프라인 0, Node 의존성 0, 그냥 Python 서버 띄우면 끝.

인프라 / 네트워크

레이어구성비고
도메인 소유NIC.KG (.us.kg, .xx.kg), ICANN gTLD 레지스트라 (.dpdns.org, .qzz.io)DigitalPlat이 정식 등록자
대시보드dash.domain.digitalplat.org발급·관리 UI
메인 사이트domain.digitalplat.org홈페이지, FAQ, 약관
WHOIS 서버whois.digitalplat.org:43자체 운영 Python 스크립트
DNS 위임 모델사용자가 NS 레코드 직접 등록 → Cloudflare/FreeDNS/Hostry 등 자유 선택DNS 운영은 위임, 도메인 소유권은 DigitalPlat 보유
커뮤니티Discord 서버 (discord.gg/ma4RZzMmVW)지원·공지·어뷰즈 신고 ※ Telegram은 계정 탈취로 공식 채널 폐기
후원Hack Club Bank (hcb.hackclub.com/donations/start/digitalplat)회계 100% 공개

레포 자체의 코드 비중 (GitHub Linguist 기준)

즉, 레포의 "코드"는 공개된 부분만이고, 실제 백엔드(도메인 등록 로직·DB·결제·이메일 발송)는 별도 비공개 저장소에 있다. "오픈소스를 표방하면서 핵심 비즈니스 로직은 비공개"인 부분 오픈소스(source-available) 모델.

4아키텍처 심화 분석

도메인 위임 + 자체 WHOIS의 작동 원리 — 패킷 레벨에서 따라가기

전체 시스템 구조도

┌────────────────────────────────────────────────────────────────────────┐ │ ICANN / IANA Root Zone │ │ (".") │ └──────────────────────┬──────────────────┬──────────────────────────────┘ │ │ ┌──────────▼─────────┐ ┌────▼─────────────┐ │ .org / .io TLD │ │ .kg TLD (NIC.KG)│ │ (Verisign/PIR) │ │ (Kyrgyz NIC) │ └──────────┬─────────┘ └────┬─────────────┘ │ │ │ ┌───────────────┘ ▼ ▼ ┌──────────────────────────────┐ │ DigitalPlat Foundation │ │ (정식 등록자) │ │ - dpdns.org │ │ - us.kg │ │ - qzz.io │ │ - xx.kg │ └──────────┬───────────────────┘ │ DNS 위임 (NS records) ▼ ┌──────────────────────────────────────┐ │ 사용자 서브도메인 │ │ inbeom.dpdns.org / myapp.us.kg / ... │ └────────────┬─────────────────────────┘ │ 사용자가 NS 지정 ▼ ┌──────────────────────────────────────┐ │ 사용자 DNS 호스팅 제공자 │ │ Cloudflare / FreeDNS / Hostry / BIND │ └────────────┬─────────────────────────┘ │ A·AAAA·CNAME·TXT 레코드 ▼ ┌──────────────────────────────────────┐ │ 사용자의 실제 서버 / Vercel / GH Pages │ └──────────────────────────────────────┘

도메인 등록부터 첫 요청 도달까지 — 시간 순서

  1. 회원가입: 이메일 + 비밀번호로 dash.domain.digitalplat.org에 가입. 이메일 인증 토큰 발송.
  2. 도메인 신청: 대시보드 → "Domain Registration" → 원하는 이름과 4개 확장자 중 1개 선택. 기본 슬롯 1개 사용.
  3. NS 레코드 입력: Cloudflare 가입 → 도메인 추가 → Cloudflare가 알려주는 NS 2개(alice.ns.cloudflare.com 등)를 DigitalPlat 대시보드에 입력.
  4. DNS 위임 활성화: DigitalPlat이 자기 권한 DNS 서버(dpdns.org의 SOA)에 사용자의 NS 레코드를 추가. 24시간 이내 전 세계 캐싱 갱신.
  5. 실제 요청 흐름: 누가 inbeom.dpdns.org을 브라우저에 치면 → 로컬 DNS → .org TLD 서버 → dpdns.org 권한 서버 (DigitalPlat) → NS 위임 응답 → Cloudflare → A 레코드 (사용자 서버 IP) → 사용자 서버 응답.
TERM
NS 위임 (NS Delegation)
상위 영역의 DNS 서버가 "이 서브도메인은 나 말고 저쪽 NS에 물어봐"라고 떠넘기는 것. DigitalPlat의 권한 DNS는 inbeom.dpdns.org NS alice.ns.cloudflare.com 같은 레코드만 가지고 있고, 실제 A·CNAME은 알지 못한다. 그래서 사용자가 Cloudflare에서 DNS를 바꾸면 DigitalPlat을 거치지 않고 즉시 반영된다. 무료 도메인 서비스의 자유도가 여기서 나온다.

WHOIS 서버 코드 해부 (whois.py 71줄)

import socket, logging

def whois(query):
    try:
        response = get_whois(query).format(query)
        return response
    except Exception as e:
        logging.error(f"Error processing WHOIS query: {e}")
        return "Internal server error"

def main():
    host = '0.0.0.0'
    port = 43                                     # 1. RFC 3912 표준 포트

    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host, port))
    server_socket.listen(5)
    logging.info(f"WHOIS Server Started, port: {port}")

    while True:
        try:
            client_socket, addr = server_socket.accept()      # 2. TCP 연결 수락
            with client_socket:
                client_socket.settimeout(10.0)                 # 3. 10초 타임아웃
                data = client_socket.recv(1024).strip()        # 4. 1024바이트 도메인 질의
                decoded_data = data.decode('utf-8')
                response = whois(decoded_data)                 # 5. 응답 생성 (get_whois 미공개)
                client_socket.sendall(response.encode('utf-8')) # 6. 텍스트 평문 응답
        except Exception as e:
            logging.error(f"Error: {e}")

if __name__ == "__main__":
    while True:
        try: main()
        except Exception as e:
            logging.critical(f"Critical: {e}")
            import time; time.sleep(1)              # 7. 무한 재시작 보장
GOOD DESIGN
단순함의 미덕

외부 의존성 0(표준 라이브러리만), 71줄, 어떤 Python 3.x 환경에서도 즉시 실행. 부모 프로세스가 죽어도 while True: try: main() ...으로 자동 재시작. "인프라용 작은 데몬은 이렇게 만들면 된다"는 교과서적 예시.

CAVEAT
실전에서는 부족한 점

이 코드는 싱글 스레드다. 한 클라이언트가 처리되는 동안 다른 클라이언트는 대기. 트래픽이 많아지면 threading.Thread·asyncio·또는 systemd socket activation + xinetd 패턴이 필요. 또 get_whois 본체가 비공개라 실제 DB 조회 로직은 알 수 없음. WHOIS는 평문이라 데이터 노출 위험도 있다(GDPR 대응으로 등록자 정보 마스킹 필수).

iframe 기반 미니 SPA — panel.html의 핵심 로직

panel.html은 좌측 사이드바 + 우측 메인 컨텐츠 레이아웃인데, 메인 컨텐츠가 <iframe>이다. SPA처럼 보이지만 React/Vue는 전혀 안 쓴다.

// 메뉴 클릭 시
function loadPage(link, url) {
  // 1. 활성 메뉴 표시
  document.querySelectorAll('.sidebar a').forEach(n => n.classList.remove('active'));
  link.classList.add('active');

  // 2. iframe src 교체
  document.getElementById('content-frame').src = url;

  // 3. 브라우저 주소창 동기화 (뒤로가기 작동)
  history.pushState({url}, '', '?page=' + encodeURIComponent(url));
}

// iframe 내부에서 라우팅이 일어났을 때도 부모 URL 동기화
setInterval(pollIframeURL, 5000);   // 5초마다 iframe pathname 확인
비유

제일 비슷한 비유는 "옛날 네이버 카페·다음 카페 좌측 메뉴". 좌측 메뉴 클릭하면 우측 글 영역만 갱신되던 그 패턴. React Router·Next.js Link 컴포넌트는 가상 DOM을 갈아끼우지만, iframe SPA는 그냥 페이지를 통째로 새로 로드한다. 단점은 무겁고 SEO에 나쁨, 장점은 백엔드가 페이지 하나하나 독립적으로 렌더링하므로 라우팅 라이브러리·번들러·하이드레이션 같은 거 전혀 없어도 됨.

슬롯 시스템 — "1 user = 1 domain" 모델

FreeDomain은 어뷰즈 방지를 위해 기본 1슬롯(= 1 도메인)으로 제한한다. 추가 슬롯은 /panel/redeem_slot에서 redeem key로 받거나, pay_success.html이 있는 걸 보아 유료 결제로 확장도 가능한 듯하다.

이 슬롯 제한이 Freenom 몰락의 교훈을 반영한다. Freenom은 1계정으로 수십 개 도메인을 발급 가능했고, 그게 피싱 사이트 대량 생산에 악용됐다. FreeDomain은 "공짜지만 한 개만"로 진입 장벽을 낮추면서 동시에 어뷰즈 비용을 올린다.

5디렉토리 구조 해부

레포에 실제로 들어있는 파일들 — 공개된 부분의 의미
FreeDomain/ ├── .github/ # GitHub Actions, 이슈 템플릿 ├── documents/ # 사용자용 문서 │ ├── domains/ │ │ ├── announcement.md # 공지 (비어있음 - placeholder) │ │ └── faq.md # FAQ — 슬롯·DNS·Cloudflare │ └── tutorial/ │ ├── index.md # 튜토리얼 인덱스 │ └── getting-started/ │ ├── 1.1-register-account.md # 회원가입 가이드 │ ├── 1.2-dns-hosting.md # Cloudflare DNS 설정 (3KB) │ └── imgs/ # 스크린샷 │ ├── opensource/ # 공개된 코드 (AGPL-3.0) │ ├── readme.md # "부분 오픈소스" 선언 │ ├── email_template/ # 가입/재설정/만료 이메일 HTML │ ├── frontend/ # 16개 페이지 HTML │ │ ├── domain_view.html (13.7KB) — 도메인 상세 보기 │ │ ├── domainmgr.html (4.5KB) — 도메인 목록 관리 │ │ ├── domainreg.html (5.6KB) — 도메인 등록 폼 │ │ ├── domainreg_check.html (5.8KB) — 가용성 확인 │ │ ├── domainreg_check_public.html (3.5KB) — 비로그인 가용성 체크 │ │ ├── error.html (1.4KB) │ │ ├── info.html (1.0KB) │ │ ├── login.html (5.9KB) │ │ ├── overview.html (7.0KB) — 대시보드 첫 화면 │ │ ├── panel.html (15.9KB) — iframe SPA 셸 │ │ ├── partials/ — Jinja include 조각 (ga.html, modern_styles.html) │ │ ├── pay_success.html (3.3KB) — 결제 성공 │ │ ├── register.html (12.1KB) — 회원가입 │ │ ├── reset_password.html (4.4KB) │ │ ├── success.html (1.3KB) │ │ ├── usermgr.html (10.0KB) — 어드민용? │ │ └── whois.html (2.4KB) — WHOIS 검색 UI │ ├── static/ │ │ └── img/logo.jpg │ └── whois_server/ │ ├── readme.md │ └── whois.py (2.4KB) — port 43 TCP 서버 │ ├── LICENSE # AGPL-3.0 └── README.md # 메인 소개

핵심 파일 설명

FRONTEND/PANEL.HTML

대시보드의 모든 것 — 15.9KB 단일 파일

가장 큰 프론트엔드 파일이자 가장 흥미로운 패턴. 좌측 사이드바 + 우측 iframe + Tawk.to 채팅 위젯 + Cookie Consent + 로딩바 + 모바일 햄버거 메뉴까지 전부 한 파일에 들어 있다. "하나의 HTML이 전체 SPA를 담당"하는 클래식 패턴.

FRONTEND/REGISTER.HTML

회원가입 — 12.1KB

12KB나 되는 이유는 캡차·CSRF 토큰·약관 동의 모달·이메일 검증 정규식·비밀번호 강도 미터까지 한 페이지에 다 담아서. 서버 검증 + 클라이언트 검증 이중화의 전형적 예시.

FRONTEND/DOMAIN_VIEW.HTML

도메인 상세 — 13.7KB

등록된 도메인의 NS 레코드 편집·소유권 이전·삭제 기능이 들어가는 페이지. 모든 위험한 작업이 한 화면에서 일어나므로 UX·검증 로직이 모두 무겁다.

WHOIS_SERVER/WHOIS.PY

WHOIS 데몬 — 단 71줄

외부 라이브러리 0개. socket·logging만 사용. 인프라 데몬을 어떻게 단순하게 만드는지 보여주는 교과서적 코드. 실무에서 "이렇게 짧아도 되나" 싶을 때 참고할 만함.

DOCUMENTS/TUTORIAL/GETTING-STARTED/1.2-DNS-HOSTING.MD

Cloudflare 연동 가이드

FreeDomain의 핵심 사용 시나리오. Cloudflare 계정 만들기 → 사이트 추가 → NS 받기 → DigitalPlat 대시보드에 입력 → 활성화까지의 5단계가 스크린샷과 함께 적혀 있다. "DNS 위임"이 어떤 모양으로 사용자에게 노출되는지 가장 잘 보여주는 문서.

6학습 포인트 (기술별)

이 레포에서 진짜 배울 수 있는 것 — 단순 사용법 너머의 지식

① DNS 시스템의 작동 원리 — 패킷 레벨 이해

FreeDomain은 DNS의 "위임 모델"을 가장 직관적으로 보여주는 살아있는 교재다. 루트 → TLD → 권한 DNS → 위임된 NS → 최종 응답의 흐름을 실제 도메인 하나로 따라가 볼 수 있다.

실습 아이디어: 자신의 FreeDomain을 발급받고, NS를 Cloudflare 대신 자체 BIND9 서버로 돌려보면서 권위 응답을 직접 만들어 본다.

② WHOIS 프로토콜 (RFC 3912)

WHOIS는 1982년에 만들어진 가장 오래된 인터넷 프로토콜 중 하나다. port 43, TCP, 평문 텍스트라는 단순한 구조. opensource/whois_server/whois.py가 이 프로토콜을 그대로 구현했다.

③ iframe 기반 SPA 패턴 (legacy but practical)

React/Next.js 안 쓰고도 SPA 같은 UX를 만드는 방법. panel.html의 약 200줄 JS가 이걸 전부 구현한다.

④ Tailwind CDN의 함정과 활용

FreeDomain은 https://cdn.tailwindcss.com을 모든 페이지에 직접 로드한다. Tailwind 공식은 "프로덕션에서는 CDN 비추천"이라고 명시하지만, 1인 nonprofit 입장에서는 빌드 파이프라인을 운영할 인력이 없으므로 합리적 선택.

⑤ AGPL-3.0과 "부분 오픈소스" 거버넌스

AGPL은 네트워크를 통해 서비스되는 소프트웨어도 소스 공개를 강제하는 라이선스. 일반 GPL의 "배포" 트리거를 "네트워크 호출"까지 확장한 변형. FreeDomain이 이걸 쓰는 이유는 누군가가 코드를 베껴서 영리 서비스로 만드는 걸 막기 위함.

⑥ Nonprofit 인프라 운영의 실무

1인이 50만 도메인을 굴리는 비결: 최대한 외주, 최대한 단순화, 비용 최소화.

7하드웨어/시스템 요구사항

자체 호스팅을 시도한다면 — 최소 사양과 운영 비용

"FreeDomain 자체"를 돌리려면

전체 백엔드가 비공개라 정확히 재현할 수는 없지만, 공개된 코드와 기능 명세를 기반으로 추정하면:

구성요소최소 사양비고
웹 서버 (Flask)1 vCPU, 1GB RAM40만 사용자 기준 캐싱 필수
DB (PostgreSQL)2 vCPU, 4GB RAM, 50GB SSD도메인·NS·사용자·결제 테이블
WHOIS 서버1 vCPU, 256MB RAMPython 단일 프로세스
권한 DNS1 vCPU, 512MB RAM, BIND9 또는 PowerDNS전 세계 anycast 권장
이메일SendGrid/Postmark 외부 SaaS자체 운영 비추천 (스팸 평판)
도메인 갱신비$50~200/년 × 4개 TLD.dpdns.org, .qzz.io는 일반 도메인, .us.kg는 별도 NIC.KG 정책

"FreeDomain을 사용자로 쓰려면"

0원. 그것이 전부의 매력. 도메인 + Cloudflare 무료 플랜 + GitHub Pages = 완전 무료 개인 사이트.

8직접 해볼 수 있는 실습 과제

난이도별 5개 — 30분짜리부터 주말 프로젝트까지
★☆☆☆☆ — 30분

실습 1. FreeDomain 발급 + Cloudflare 연동 + 정적 사이트 띄우기

목표: 무료 도메인 하나로 GitHub Pages 사이트에 커스텀 도메인 붙이기.

단계: ① dash.domain.digitalplat.org 가입 → ② yourname.dpdns.org 신청 → ③ Cloudflare 사이트 추가 → ④ NS 레코드 DigitalPlat에 입력 → ⑤ GitHub Pages에 정적 사이트 push → ⑥ Cloudflare DNS에 CNAME 추가 (@ → yourname.github.io) → ⑦ Pages 설정에서 커스텀 도메인 등록.

배우는 것: 도메인 → DNS → 호스팅의 전체 사슬을 한 번에 체험.

★★☆☆☆ — 1~2시간

실습 2. whois.py를 진짜로 동작하게 만들기

목표: 공개된 71줄 코드의 빈 get_whois()를 직접 구현해 본인 도메인 DB를 응답하는 WHOIS 서버 만들기.

단계: ① SQLite로 domains(name, registrant, ns1, ns2, created_at) 테이블 생성 → ② get_whois(query)가 SQL 조회 후 RFC 3912 포맷으로 응답하도록 구현 → ③ Docker로 컨테이너화 → ④ whois -h localhost example.local로 테스트.

배우는 것: 가장 단순한 인터넷 프로토콜 직접 구현, TCP socket 프로그래밍.

★★★☆☆ — 반나절

실습 3. iframe SPA → Next.js App Router 리팩토링

목표: panel.html의 사이드바 + iframe 구조를 Next.js 14 App Router의 layout + Server Components로 다시 짜기.

단계: ① Next.js 프로젝트 생성 → ② app/panel/layout.tsx에 사이드바 → ③ app/panel/overview/page.tsx·app/panel/domains/page.tsx 등 페이지 → ④ 동일한 Tailwind 스타일 적용 → ⑤ Lighthouse 점수 비교(iframe vs App Router).

배우는 것: 클래식 SSR vs 모던 RSC의 차이 체감, 라우팅 추상화의 가치.

★★★★☆ — 주말 프로젝트

실습 4. "My Mini FreeDomain" — 서브도메인 발급 서비스

목표: 본인이 보유한 도메인 1개를 활용해 미니 무료 서브도메인 서비스 만들기.

단계: ① 도메인 1개 구매(example.com 등) → ② Cloudflare DNS API 키 발급 → ③ Flask로 회원가입 + "subname 입력" UI → ④ Cloudflare API로 subname.example.com NS 레코드 추가 → ⑤ 사용자가 자신의 Cloudflare NS를 입력하면 위임 완료 → ⑥ WHOIS 서버 붙이기.

배우는 것: 외부 DNS API 자동화, 사용자 위임 모델 직접 구현. FreeDomain 백엔드를 사실상 복제해 보는 것.

★★★★★ — 1~2주

실습 5. 자체 권한 DNS 서버 운영 (BIND9 또는 PowerDNS)

목표: Cloudflare에 의존하지 않고 본인이 보유한 도메인의 권한 DNS 서버를 직접 운영.

단계: ① VPS 2대(anycast 흉내) → ② BIND9 또는 PowerDNS 설치 → ③ example.com의 NS를 본인 서버 2개로 변경 → ④ DNSSEC 키 생성 + 서명 → ⑤ dig DNSKEY example.com +dnssec으로 검증 → ⑥ Prometheus + Grafana로 쿼리 모니터링.

배우는 것: 인터넷 인프라의 가장 깊은 층, DNSSEC 신뢰 사슬, anycast/glue record 같은 고급 개념.

9관련 기술 심화 학습 로드맵

FreeDomain을 깊이 이해하기 위해 필요한 6주 커리큘럼

Week 1: DNS 기초 + RFC 1034/1035 정독

Week 2: TCP/IP + socket 프로그래밍

Week 3: Cloudflare API + 자동화

Week 4: Flask + Jinja 풀스택 미니 SaaS

Week 5: BIND9 / PowerDNS 권한 서버 운영

Week 6: AGPL/오픈소스 거버넌스 + Nonprofit 운영

10핵심 키워드 사전

레포와 도메인 인프라에 나오는 용어 풀이
TERM
TLD (Top-Level Domain)
도메인의 가장 오른쪽 부분. .com·.org·.kr·.kg 등. ICANN이 발급 권한을 관리. 신규 TLD를 만들려면 ICANN에 1억 원+ 비용과 운영 능력 입증이 필요.
TERM
SLD (Second-Level Domain) / 2LD
TLD 바로 왼쪽. example.com에서 example이 SLD. 일반적으로 우리가 "도메인을 산다"고 할 때 사는 게 이 SLD. FreeDomain은 자기가 산 SLD(dpdns.org)의 서브도메인을 나눠 준다.
TERM
NS Record (Nameserver Record)
"이 도메인의 DNS 질의에 답할 권한이 있는 서버"를 가리키는 레코드. 도메인을 어떤 DNS 호스팅에 맡길지 정함. FreeDomain은 사용자가 NS를 자유롭게 입력해서 Cloudflare/FreeDNS 등을 고를 수 있게 한다.
TERM
SOA Record (Start of Authority)
한 도메인 영역의 권위 정보 — 마스터 NS, 관리자 이메일, 시리얼 번호, refresh/retry 타이머. zone의 "신분증" 같은 레코드.
TERM
DNS Delegation (위임)
상위 영역이 하위 영역에 대한 답변 권한을 다른 NS로 넘기는 것. .org TLD가 dpdns.org 영역을 DigitalPlat NS에 위임, DigitalPlat NS가 inbeom.dpdns.org를 Cloudflare NS에 다시 위임. 이런 트리 구조가 DNS의 핵심.
TERM
WHOIS (RFC 3912)
도메인 등록 정보 조회 프로토콜. port 43 TCP, 평문 텍스트. 1982년 RFC 812에서 시작, 2004년 RFC 3912로 정식 표준화. 후속 표준은 RDAP(REST + JSON 기반).
TERM
Registrar / Registry
Registry는 TLD를 직접 관리하는 기관(Verisign=.com, PIR=.org, NIC.KG=.kg). Registrar는 사용자에게 도메인을 판매하는 회사(가비아·후이즈·Namecheap). DigitalPlat은 Registrar에서 SLD를 구매한 후 그 아래를 무료로 나눠 주는 "Sub-Registrar" 비공식 모델.
TERM
AGPL-3.0 (Affero GPL)
GPL의 변형. 일반 GPL은 소프트웨어를 "배포"할 때만 소스 공개 의무가 발생하지만, AGPL은 "네트워크 상에서 서비스 제공"만 해도 의무 발생. SaaS 시대에 GPL의 loophole을 막기 위한 라이선스. MongoDB·Sentry가 한때 사용 후 SSPL/BSL로 이전.
TERM
Hack Club Bank
미국 비영리 청소년 해커 단체 Hack Club이 운영하는 501(c)(3) 비영리 회계 플랫폼. 소규모 OSS 프로젝트가 자체 법인 없이도 후원금을 받고 회계를 투명하게 공개할 수 있게 해 줌. 모든 거래가 공개되어 신뢰도 ↑.
TERM
Tailwind CDN vs Build
CDN: script 한 줄로 즉시 사용, 런타임 JIT 컴파일. 프로토타이핑·소규모용. Build: tailwindcss -i in.css -o out.css로 사용된 클래스만 추출한 최소 CSS 생성. 프로덕션 권장. FreeDomain은 1인 운영 단순화를 위해 CDN을 채택.
TERM
Glue Record
NS 레코드가 가리키는 서버 이름이 그 도메인 자체의 서브도메인일 때(example.com의 NS가 ns1.example.com) 발생하는 순환 의존. 상위 영역이 IP를 함께 알려줘서 해결. FreeDomain은 사용자가 직접 NS를 운영할 때 이걸 신경 써야 함.
TERM
Freenom 효과
2010년대 4천만 무료 도메인을 발급하던 Freenom이 피싱 악용으로 2023년 폐쇄된 사건. 무료 도메인 = 피싱 위험의 인식이 굳어졌고, 후속 서비스들은 슬롯 제한·어뷰즈 보고 폼·KYC 같은 대응책을 의무화. FreeDomain의 "1user=1domain" 정책도 그 결과.

11참고 링크

더 깊이 파고들 자료들

FreeDomain 본진

비교 대상 무료 도메인 서비스

DNS / 인프라 학습

오픈소스 거버넌스

nonprofit 운영 참고