고객사 도메인 50개, 엑셀 없이 관리하기

웹 에이전시나 호스팅 대행을 하다 보면 어느 순간 이런 엑셀이 생긴다.

고객사 도메인 인증서 만료 도메인 만료 담당
A사 a-corp.co.kr 2026-11-03 2027-02-14 김OO
B사 b-shop.com 2026-10-21 ? 김OO
… (×50행)

이 엑셀의 문제는 하나다 — 만든 날 이후로 아무도 안 고친다. 갱신하면 날짜가 바뀌는데 엑셀은 모르고, 고객사가 도메인을 하나 더 사면 행이 없고, 담당자가 바뀌면 그 파일이 어디 있는지부터 못 찾는다. 엑셀은 기록이지 감시가 아니다.

몇 단계로 벗어날 수 있다. 각 단계는 전 단계보다 손이 덜 가고, 전부 오늘 시작할 수 있다.

1단계 — 엑셀을 버리고 텍스트 파일 + 스크립트

도메인 목록을 한 줄에 하나씩 넣은 domains.txt 하나가 엑셀보다 낫다. 날짜를 사람이 안 적기 때문이다 — 날짜는 물어보면 된다.

#!/bin/bash
# check-all.sh — domains.txt 의 인증서·도메인 만료를 한 번에
while read -r d; do
  [ -z "$d" ] && continue
  cert=$(openssl s_client -connect "$d:443" -servername "$d" </dev/null 2>/dev/null \
         | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
  cert_days=$(( ($(date -d "$cert" +%s 2>/dev/null || echo 0) - $(date +%s)) / 86400 ))
  dom=$(curl -sL -m 10 "https://rdap.org/domain/$d" \
        | python3 -c "import json,sys
try:
  [print(e['eventDate'][:10]) for e in json.load(sys.stdin)['events'] if e['eventAction']=='expiration']
except: print('?')" | head -1)
  printf '%-28s 인증서 %4s일  도메인만료 %s\n' "$d" "$cert_days" "$dom"
  sleep 2   # RDAP 레이트리밋 예의
done < domains.txt
a-corp.co.kr                 인증서   46일  도메인만료 2027-02-14
b-shop.com                   인증서   12일  도메인만료 2026-12-01

이것만으로 “지금 상태”는 항상 정확하다. 남은 문제는 누가 이걸 매일 돌리고, 빨간 줄을 알아채는가다.

2단계 — cron + 알림: 사람이 보는 게 아니라 통보받게

만료 사고가 반복되는 구조에서 봤듯, 사람이 결과를 “보러 가는” 체계는 반드시 무너진다. 뒤집어야 한다 — 임계값을 넘은 것만 슬랙으로 날아오게.

#!/bin/bash
# alert.sh — 30일 이내만 슬랙 통보 (cron: 0 9 * * *)
WEBHOOK="https://hooks.slack.com/services/…"
while read -r d; do
  [ -z "$d" ] && continue
  if ! openssl s_client -connect "$d:443" -servername "$d" </dev/null 2>/dev/null \
       | openssl x509 -noout -checkend $((30*86400)) >/dev/null 2>&1; then
    curl -s -X POST "$WEBHOOK" -H 'content-type: application/json' \
      -d "{\"text\":\"⚠️ $d 인증서 30일 이내 만료 (또는 접속 불가)\"}" >/dev/null
  fi
  sleep 1
done < domains.txt

포인트 두 가지:

  • -checkend 는 접속 실패도 알림이 되게 실패 시 통보로 묶는다 — 침묵이 곧 정상이라는 착각이 제일 위험하다
  • 웹훅은 개인 DM 이 아니라 팀 채널로. 수신자가 사람이면 그 사람 휴가가 곧 장애다

여기까지 하면 실무적으로 엑셀 시대는 끝난다. 스크립트 두 장, 서버 한 대면 된다.

3단계 — 2단계가 부족해지는 순간들

직접 굴려보면 이런 것들이 남는다:

  • 스크립트 돌리는 서버가 죽으면? 감시가 죽었다는 알림은 누가 주나 — 감시의 감시 문제. 갱신과 감시를 분리했듯, 감시 자체도 단일 지점이면 안 된다
  • 도메인 만료일 조회의 파편화 — TLD 마다 RDAP 서버가 달라 IANA 부트스트랩부터 타야 하고, 미지원 ccTLD 도 있다. 도메인 만료가 더 위험한데 정작 조회가 제일 까다롭다
  • 지역 차이 — 서버에서 본 인증서와 고객 지역에서 보이는 게 다를 수 있다. CDN 을 쓰는 고객사면 실제로 겪는다
  • 이력 — “지난달에 왜 알림이 왔었지?“를 답하려면 결과가 어딘가 쌓여야 한다
  • 고객사별 보고 — 월말에 “귀사 도메인 이상 없음” 리포트를 뽑는 일이 결국 수작업으로 남는다

이 지점부터는 스크립트의 영역이 아니라 서비스의 영역이다.

지금 당장은

도메인 몇 개는 진단 툴에 넣어보면 인증서 상태·체인·지역별 차이까지 바로 나온다. 50개를 매일 자동으로 — 도메인 만료까지 묶어서 — 감시하고 알림받는 도구는 지금 만들고 있다. 위 3단계의 남는 문제들이 정확히 그 도구의 요구사항이다. 먼저 써보고 싶으면 진단 툴 페이지에 이메일을 남겨두면 된다.