birchholt 직접 해보고 남기는 기록

티스토리에 개인 도메인을 붙이며 알게 된 것

티스토리 블로그 두 개에 각각 개인 도메인의 하위 주소를 붙였습니다. misiq-log.tistory.commisiq.birchholt.com으로, checkin-directory.tistory.comcheckin.birchholt.com으로요.

작업 자체는 CNAME 한 줄이면 끝나는 일인데, 시작하기 전에 세운 계획이 틀려 있었습니다. 그리고 붙인 다음에도 예상 못 한 것이 하나 남았습니다. 그 두 가지가 이 글의 내용입니다.

1. “하루 한 번"은 계정당이 아니라 블로그당이었습니다

티스토리 공지에 이런 문장이 있습니다.

개인 도메인은 하루 한 번만 설정할 수 있습니다.

저는 이걸 계정 전체에 걸리는 제한으로 읽었습니다. 그래서 “오늘 하나 붙이고 내일 나머지를 붙이자"고 계획을 세웠습니다. 블로그가 두 개니까 이틀이 걸리는 작업이라고 생각한 것입니다.

그런데 같은 공지의 예시 문장을 다시 읽어보니 이렇게 되어 있었습니다.

abc.com으로 설정하신 후 (…) 당일에 xxx.abc.com 등 다른 도메인으로 변경이 불가

한 블로그가 자기 도메인을 바꾸는 것에 대한 제한이었습니다. 블로그가 다르면 서로 무관합니다. 실제로 같은 날 두 블로그 모두 설정에 성공했습니다.

교훈: 제한 문장을 읽을 때는 무엇에 걸리는 제한인지를 먼저 확정해야 합니다. 계정당인지, 블로그당인지, 도메인당인지에 따라 일정이 통째로 달라집니다. 저는 이걸 확인하지 않아 하루를 더 잡아두고 있었습니다.

2. DNS는 CNAME 한 줄, 단 프록시는 꺼야 합니다

설정한 레코드는 이것뿐입니다.

misiq    CNAME   host.tistory.io
checkin  CNAME   host.tistory.io

문제는 Cloudflare를 DNS로 쓸 때입니다. Cloudflare는 레코드를 추가하면 기본적으로 프록시(주황색 구름)를 켠 상태로 만듭니다. 이 상태로 두면 티스토리의 SSL 인증서 발급이 실패합니다. 인증 기관이 도메인 소유를 확인하러 왔을 때 티스토리 서버가 아니라 Cloudflare가 응답하기 때문입니다.

프록시가 실제로 꺼졌는지는 응답 IP로 확인할 수 있습니다. 티스토리 실서버 대역이 나오면 꺼진 것이고, Cloudflare 대역(104.x, 172.67.x)이 나오면 아직 켜져 있는 것입니다.

$ dig +short misiq.birchholt.com
host.tistory.io.
blog-tistory-xxxxxxxx.kgslb.com.
211.249.222.34          ← 티스토리 실서버. 프록시 OFF 확인

설정 화면에서 회색 구름으로 보이는 것만 믿지 말고 이렇게 한 번 재보는 편이 확실합니다.

CAA 레코드도 미리 봐두면 좋습니다

도메인에 CAA 레코드가 걸려 있으면 특정 인증기관만 인증서를 발급할 수 있습니다. 티스토리는 Let’s Encrypt를 쓰는데, CAA에 그게 빠져 있으면 발급이 막힙니다. 저는 CAA를 아예 설정하지 않은 상태였고(dig CAA 응답 0건), 그래서 차단 요인이 없었습니다. 발급이 계속 안 되면 여기를 의심해볼 만합니다.

3. SSL 발급을 기다리는 동안 건드리면 안 되는 것

DNS 설정을 마치면 티스토리 관리 화면에 “DNS 설정 정보 확인 완료"가 뜨고, 보안 접속 인증서는 발급 대기 상태가 됩니다. 이때 다음 세 가지를 하면 발급이 처음부터 다시 시작되거나 실패합니다.

안 되는 것 같아서 이것저것 만지고 싶어지는 구간인데, 여기서는 기다리는 게 맞습니다. 제 경우 두 도메인 모두 다음 날 확인했을 때 발급이 끝나 있었고, curl의 인증서 검증 결과가 0(정상)으로 바뀌어 있었습니다.

$ curl -s -o /dev/null -w "%{http_code} %{ssl_verify_result}\n" https://misiq.birchholt.com/
200 0

4. 남는 문제 — 원래 주소가 사라지지 않습니다

개인 도메인을 붙여도 기존 *.tistory.com 주소가 그대로 살아 있습니다. 리다이렉트되지 않고 똑같이 200을 반환합니다. 같은 글이 두 주소에서 열립니다.

$ curl -s -o /dev/null -w "%{http_code} redirects=%{num_redirects}\n" \
       https://misiq-log.tistory.com/42
200 redirects=0

티스토리가 301 리다이렉트를 지원하지 않기 때문입니다. 검색엔진 입장에서는 같은 내용이 두 주소에 있는 것이라 어느 쪽을 대표로 볼지 애매해집니다.

다만 티스토리가 이 부분은 처리해 두었습니다. 원래 주소로 들어가도 페이지가 스스로를 개인 도메인이라고 선언합니다.

<link rel="canonical" href="https://misiq.birchholt.com/42"/>
<meta property="og:url" content="https://misiq.birchholt.com/42"/>

내부 링크도 전부 개인 도메인을 가리킵니다. 그래서 원래 주소로 들어온 사람도 아무 링크나 누르면 개인 도메인으로 넘어갑니다. 검색 유입은 개인 도메인 쪽으로 모입니다.

다만 완전히 해결된 것은 아닙니다. 옛 링크나 북마크로 원래 주소에 직접 들어오는 경우는 남습니다. 이걸 없앨 방법은 찾지 못했습니다. 티스토리에서 리다이렉트를 설정하는 수단이 없기 때문입니다. 혹시 방법이 있다면 알려주시면 이 글을 고치겠습니다.

정리

항목확인한 것
하루 1회 제한계정당이 아니라 블로그당. 블로그가 다르면 같은 날 각각 연결됨
DNS 레코드CNAME → host.tistory.io 한 줄
Cloudflare 프록시꺼야 함. 응답 IP가 티스토리 대역인지로 검증
CAA 레코드있으면 Let’s Encrypt 포함 여부 확인. 없으면 차단 요인 없음
SSL 대기 중재설정·프록시 켜기·레코드 변경 금지
원 주소200으로 남음. canonical과 내부 링크는 개인 도메인을 가리킴

가장 크게 배운 건 첫 번째입니다. 문서에 적힌 제한을 읽을 때 그게 무엇에 걸리는 제한인지를 확정하지 않으면, 있지도 않은 제약에 맞춰 일정을 짜게 됩니다. 저는 하루를 더 잡아두고 있었고, 실제로 해보고 나서야 알았습니다.