2026년 10월 22일, 운영하던 네 정보 서비스를 gamepunch.org의 /public/ 하위에서 punchblog.com의 별도 경로로 옮겼습니다. 첫 적용은 이전 주소에서 새 주소로 이동시키는 방식이었고, 이후 운영자의 의도에 맞춰 이전 공개 주소가 서비스 화면을 열지 않도록 410 응답으로 바꿨습니다. 이 글은 그 두 동작을 구분한 작업 기록과 반영 후 직접 수행한 여덟 번의 공개 GET 확인입니다. 여기서 종료한 대상은 이전 서비스 화면입니다. 같은 경로 아래의 데이터까지 한꺼번에 종료하면 이미 설치된 앱을 깨뜨릴 수 있었습니다. 최초 화면 확인 자료는 그대로 두고, 아래에 데이터 복구 기록과 별도의 후속 확인을 추가했습니다.

접속 유지와 검색 제외를 다른 질문으로 나눴습니다

종료한 옛 화면은 410, 기존 앱 데이터 주소는 200 JSON, 새 서비스 화면은 200과 noindex로 구분하는 흐름
AI 생성 개념도 · 본문의 서비스 이전 사례를 화면·앱 데이터·검색 노출 정책으로 나눠 표현했습니다. noindex는 검색 제외 지시이며 접속 차단이나 애드센스 심사 제외를 보장하지 않습니다. 응답의 실제 관찰값과 확인 시각은 아래 운영 기록을 기준으로 읽으세요. 본문 근거와 적용 조건 · 그림을 누르면 원본 크기로 볼 수 있습니다.

기존 서비스를 계속 쓸 수 있어야 한다는 조건과, 이전 도메인에서는 그 서비스가 열리지 않아야 한다는 조건을 함께 정리했습니다. 새 주소가 200을 반환한다는 사실만 확인하면 이전 주소가 여전히 200인지, 새 주소로 이동하는지, 종료됐는지 알 수 없습니다. 또한 새 주소에 noindex를 넣어도 브라우저 접속은 계속 가능합니다. 접속 여부와 검색 노출 의도는 응답의 다른 부분에서 확인해야 했습니다.

확인 대상기대한 HTTP 상태따로 확인한 항목
기존 서비스 화면 주소 (데이터 예외는 아래 별도 확인)410Location 헤더로 새 주소에 보내지 않는지
새 서비스 주소200X-Robots-Tag에 noindex가 있는지
원래 글 사이트200기존 글과 사이트맵을 유지하는지

반영 후 직접 확인한 여덟 응답

아래 표는 설정 반영을 끝낸 뒤 공개 HTTPS 주소에 GET 요청을 보낸 결과입니다. curl에 -L을 주지 않아 이동 응답을 자동으로 따라가지 않았고 TLS 검증을 켰습니다. 상태 코드는 2026년 10월 22일에 관찰한 응답이며, 변경 전 화면을 보존한 자료나 장시간 가용성 시험은 아닙니다. 기존 주소 네 곳은 410과 Location 없음, 새 주소 네 곳은 200과 noindex를 확인했습니다.

요청 주소HTTPLocation검색 제외 헤더
https://gamepunch.org/public/gamepunch410없음noindex, follow
https://gamepunch.org/public/coinpunch410없음noindex, follow
https://gamepunch.org/public/punch-livescore410없음noindex, follow
https://gamepunch.org/public/punch-re410없음noindex, follow
https://punchblog.com/gamepunch200없음noindex, follow, noarchive
https://punchblog.com/coinpunch200없음noindex, follow, noarchive
https://punchblog.com/punch-livescore200없음noindex, follow, noarchive
https://punchblog.com/punch-re200없음noindex, follow, noarchive

왜 이동 응답만으로 끝내지 않았나요

왜 이동 응답만으로 끝내지 않았나요의 판단 조건을 설명하는 개념 그림
AI 생성 개념도 · 왜 이동 응답만으로 끝내지 않았나요에 관한 설명용 그림입니다. 구체적인 조건·계산·확인 범위는 아래 본문을 따르며, 실제 화면이나 관찰·측정 자료가 아닙니다. 본문 근거와 적용 조건 · 그림을 누르면 원본 크기로 볼 수 있습니다.

새 주소를 알려 주면서 이전 링크의 이용자를 계속 연결하려면 리디렉션이 한 가지 방법입니다. 하지만 이번 요청은 이전 도메인의 서비스 주소를 열어도 서비스로 연결되지 않는 상태였습니다. 그래서 이 네 공개 경로의 기대 상태를 410으로 바꿨습니다. 모든 도메인 이전에서 같은 결정을 권하는 뜻은 아닙니다. 이전 링크의 이용자를 새 서비스로 안내해야 한다면 목표 자체가 다르므로 종료 코드 대신 적절한 이동 응답을 검토해야 합니다.

검사 도구도 그 목표를 따라 바꿔야 했습니다. 200 또는 이동 뒤의 최종 화면만 성공으로 판정하면, 의도한 410을 장애로 오인할 수 있습니다. 이번 검사는 기존 경로의 410과 새 경로의 200을 각각 정상 기대값으로 두었습니다. 읽기 전용 스크립트는 응답 본문을 공개하지 않고 길이와 해시만 남기며, 쿠키나 계정 정보를 기록하지 않습니다.

공개 경로를 막았는데 새 서비스도 같이 막히는 경우

두 도메인이 같은 서버의 기존 라우팅을 이용하면 새 도메인의 내부 요청도 이전 경로를 거칠 수 있습니다. 공개 경로를 구분 없이 막으면 새 주소까지 410으로 끝나는 자기 차단이 생길 수 있습니다. 이번 작업은 외부 공개 요청의 종료 규칙과 내부 루프백 라우팅을 구분했습니다. 공개 확인에서 새 주소가 실제 콘텐츠를 반환하는지 검사한 이유입니다. 웹서버가 켜져 있다는 상태 확인만으로는 이 구분을 검증하지 못합니다.

본문 안의 링크·스크립트·데이터 경로도 대상입니다. 첫 HTML만 새 주소에서 열려도 검색이나 상세 화면이 이전 도메인을 다시 요청하면 이전 경로의 종료 규칙에 걸립니다. 이 사례에서는 공개 전 테스트 경로에서 네 서비스의 화면과 연결 경로를 먼저 점검하고, 공개 후 다시 확인했습니다. 이 글의 다운로드 자료는 여덟 대표 요청의 후속 확인만 담으며, 모든 브라우저 동작이나 로그인 상태를 재현하는 검사는 아닙니다.

noindex는 브라우저 접근 차단이 아닙니다

새 서비스는 공개 접속을 유지하면서 X-Robots-Tag의 noindex로 검색 제외 의도를 전달했습니다. 이 헤더는 비밀번호나 접근 제어 기능이 아니므로 주소를 아는 사람이 서비스를 여는 것을 막지 않습니다. Google이 이 설정을 읽으려면 해당 주소를 수집할 수 있어야 합니다. 따라서 검색 제외를 읽히게 하려는 주소를 robots.txt로 동시에 막는 방식은 쓰지 않았습니다.

410을 적용했다고 서치콘솔의 이전 주소 수가 그 자리에서 사라지지는 않습니다. HTTP 응답을 고치는 작업과 검색엔진이 다시 방문해 결과를 반영하는 일은 서로 다른 시점에 일어납니다. 이번 스크립트는 공개 서버가 보내는 응답만 확인합니다. Google의 실제 재수집, 검색 결과 삭제나 광고 심사 결과를 검증하는 도구가 아닙니다.

내 사이트에서는 어떤 요청을 먼저 확인할까요

  1. 목표 응답을 적습니다

    이전 주소를 이동시킬지 종료할지, 새 주소의 접속과 검색 노출은 어떻게 할지 나눕니다.

  2. 이동을 따라가지 않고 요청합니다

    curl의 HTTP 상태·Location·검색 제외 헤더를 별도 항목으로 읽습니다.

  3. 첫 화면 뒤의 경로를 확인합니다

    상세 글, 정적 파일, 데이터 요청과 없는 주소도 기대 상태와 대조합니다.

  4. 현재 응답과 검색 기록을 구분합니다

    사이트맵에서 종료 주소를 빼고, 재수집 전의 보고서 숫자로 배포 실패를 단정하지 않습니다.

본인 서비스 주소로 바꿔 실행하는 GET 확인 예시 · -L을 넣지 않습니다.
curl -q -sS --connect-timeout 4 --max-time 20 \
  -D response-headers.txt -o response-body.html \
  -w '%{http_code}\n' https://example.com/old-service

설치된 앱은 새 화면 주소를 자동으로 알지 못했습니다

화면 주소 여덟 곳이 의도대로 응답해도 설치 앱의 데이터 연결은 별개였습니다. 이전 데이터 주소 네 곳까지 410 HTML이 되었고 새 도메인의 대응 데이터 주소는 200 JSON이었습니다. 기존 앱은 옛 주소를 계속 호출하므로 새 서비스가 열려 있어도 목록을 받을 수 없었습니다. 다음 표는 10월 22일 보관한 공개 확인 기록입니다. 정확한 요청 시각은 기록되지 않았으며 오늘의 장애를 다시 재현한 자료가 아닙니다.

보관된 데이터 경로복구 전 기존 주소같은 때 새 주소
게임 홈 API410 · text/html200 · application/json
코인 홈 JSON410 · text/html200 · application/json
축구 점수 API410 · text/html200 · application/json
부동산 지역 API410 · text/html200 · application/json

복구는 이전 화면 전체를 되살리는 방식이 아니라 설치 앱이 이미 쓰는 데이터 경로에만 기존 처리기로 연결하는 방식이었습니다. 원래의 캐시·요청 제한을 유지하고 API 응답에 noindex를 남겼습니다. 특히 축구 공개 요청에 외부 공급자 재조회 경로를 넣지 않았습니다. 주소 이전으로 생긴 연결 문제와 캐시 미수집·자료 지연은 다른 원인이므로 구분했습니다.

현재 데이터 여덟 곳과 종료 화면 네 곳을 따로 검사했습니다

직접 관찰한 결과 · 2026-10-23 KST
서비스요청 종류HTTP기대 형식 일치검색 제외 헤더
gamepunchold_data200Truenoindex, follow
gamepunchnew_data200Truenoindex, follow, noarchive
gamepunchold_html410Truenoindex, follow
coinpunchold_data200Truenoindex, follow
coinpunchnew_data200Truenoindex, follow, noarchive
coinpunchold_html410Truenoindex, follow
punch-livescoreold_data200Truenoindex, follow
punch-livescorenew_data200Truenoindex, follow, noarchive
punch-livescoreold_html410Truenoindex, follow
punch-reold_data200Truenoindex, follow
punch-renew_data200Truenoindex, follow, noarchive
punch-reold_html410Truenoindex, follow

후속 공개 GET에서는 기존·새 데이터 주소 여덟 곳이 모두 200 JSON, 이전 화면 네 곳은 모두 410이었습니다. 데이터별로 sections 배열, global 객체, response 배열, regions 배열이 있는지 검사했습니다. JSON 본문이 바이트 단위로 같다는 조건은 쓰지 않았습니다. 시각·캐시 갱신 등에 따라 두 요청의 값이 달라질 수 있고, 외곽 형식 일치만으로 모든 값의 정확성이나 앱의 모든 화면을 보장하지는 않기 때문입니다.

독자가 같은 이전을 준비한다면 화면 URL 목록과 설치된 클라이언트의 실제 데이터 URL 목록을 따로 적고, 기존 버전의 주소도 검사해야 합니다. 새 앱을 배포하기 전까지 필요한 호환 경로의 범위를 기록하고 화면의 410 응답도 함께 확인합니다. 이 후속 검사는 공개 읽기 전용 요청이며 휴대폰 설치·로그인·푸시 알림 검사는 아닙니다. noindex는 접속 차단이나 애드센스 심사 제외를 보장하는 장치가 아닙니다.

편집자 의견

다음 주소 이전에서는 설치된 앱의 데이터 URL 목록을 화면 주소와 함께 먼저 준비하겠습니다. 이번에는 화면 여덟 곳을 확인해도 기존 앱의 데이터 410 문제를 찾지 못했으므로, 홈페이지가 열리는 것만으로 이전 완료를 판단한 범위가 부족했습니다.

옛 화면을 종료하면서 기존 앱을 유지해야 한다면 필요한 데이터 호환 경로를 따로 관리하겠습니다. 새 앱의 보급 상태를 확인하기 전에는 새 도메인의 응답 성공만을 근거로 이전 데이터 경로까지 일괄 종료하지 않는 편이 낫습니다.

판단 근거: 현재 데이터 여덟 곳과 종료 화면 네 곳을 따로 검사했습니다

의견 추가 2026-10-23 · 본문 자료를 바탕으로 한 편집 판단

운영 기록과 후속 확인 자료

서비스 주소 이전과 종료 설정은 실제 작업 기록을 바탕으로 정리했습니다. 아래 자료는 작업이 끝난 뒤 별도로 수행한 공개 HTTPS GET 요청 여덟 건입니다. 이전 응답의 보관본이나 검색엔진 재수집 기록은 아닙니다.

현재 상태 관찰 시각: 2026-10-22T13:10:12.961287+00:00
Linux · Python 3.10.12 · curl · dig

Python 3과 curl이 있는 환경에서 실행합니다. 인증 없이 공개 주소에 GET만 보내고 설정·계정·검색엔진 상태를 바꾸지 않습니다. 기존 출력 파일은 덮어쓰지 않습니다.

python3 check-service-retirement.py --output new-observations.json

참고한 공식 문서

원고 검토: 2026-10-24 · 정정 요청

추가 공개 확인의 환경과 원자료

관찰 시각: 2026-10-22T15:41:50.011595+00:00
os: Linux · python: 3.10.12 · network: 12 public HTTPS GET requests, TLS verified

설치된 클라이언트의 기존 데이터 URL, 이동한 데이터 URL, 종료한 HTML의 대표 주소를 각각 확인했습니다. 리디렉션은 따라가지 않았습니다. 응답 해시와 필요한 일부 헤더만 공개하며 본문·쿠키·인증 정보는 공개하지 않습니다.

확인하지 않은 범위: 기록된 시점의 응답을 확인했으며 지속 가동이나 실제 기기의 동작을 시험한 것은 아닙니다. 외곽 필드가 맞아도 모든 내부 값이나 앱 화면을 검증한 결과는 아닙니다. 이 스크립트로 과거의 변경 전 상태를 다시 만들 수는 없습니다.

Python 3 표준 라이브러리로 공개 HTTPS GET 12건을 보냅니다. 인증이나 관리자 권한은 사용하지 않습니다. 본문·쿠키는 저장하지 않고 상태·일부 헤더·본문 해시만 기록합니다. 서버 설정과 기존 결과 파일은 변경하지 않습니다.

python3 check-native-api-compatibility.py --output check-native-api-compatibility-result.json

이 글의 보완 기록

  • · 신규 발행. 실제 변경의 의도와 후속 공개 GET 요청 여덟 건, 재확인 코드와 한계를 공개했습니다.
  • · 설치 앱의 기존 데이터 경로까지 410이 된 문제와 호환 경로 복구를 추가했습니다. 최초 여덟 화면 확인 자료는 보존하고 별도의 공개 GET 12건 및 JSON 필드 검사를 공개했습니다.
  • · 본문 근거에 대한 편집자의 판단과 결론이 달라지는 조건을 추가했습니다. 기존 관찰일·공식 자료 확인일은 유지했습니다.
  • · 글별 적용 사례와 반례를 보강했습니다. 기존 관찰일과 원자료 확인일은 유지했습니다.