기존 구독이 업데이트되지 않을 때는 현재 서버 목록을 그대로 둔 채 URL, 계정 상태, 네트워크 요청과 응답 내용을 확인하세요. 마지막으로 한 번만 업데이트하고 결과를 기록합니다. 이 글은 서비스 제공업체에서 구독을 이미 받은 사용자가 요청 미완료, 구독 형식이 아닌 응답, 사용 가능한 항목이 없는 목록을 구분하도록 돕습니다. 설정을 반복해서 삭제하고 다시 만들어 문제를 키우지 마세요.
1. 업데이트 실패, 빈 목록, 연결 실패 구분하기
Shadowrocket의 구독 업데이트는 저장된 주소로 서버 항목을 요청한 뒤, 인식할 수 있는 내용을 Home에 표시하는 과정입니다. 업데이트에 성공해도 모든 서버에 연결된다는 뜻은 아닙니다. 서버 연결에 실패했다고 구독 URL이 잘못됐다고 단정할 수도 없습니다. 구독, 규칙, 서버 설정을 한꺼번에 바꾸기보다 먼저 어느 단계에서 문제가 생겼는지 확인하세요.
Home에서 해당 구독 그룹을 펼쳐 그룹이 접혀 있을 뿐인지 확인하세요. 검색이나 필터를 사용 중이라면 조건을 해제합니다. 업데이트 전 항목 수를 기록하고, 업데이트 후 기존 항목이 유지되는지, 목록이 비었는지, 연결 테스트만 실패하는지 확인하세요. 세 경우의 해결 방법은 서로 다릅니다.
| 화면에 보이는 증상 | 우선 확인할 항목 | 지금은 변경하지 않을 항목 |
|---|---|---|
| 업데이트 오류, 기존 항목은 남아 있음 | 주소, 네트워크 연결, 서버 응답 | 기존 서버 설정 |
| 그룹을 펼쳐도 항목이 없음 | 계정 이용 권한, 응답 내용, 출력 형식 | Config의 라우팅 규칙 |
| 항목은 있지만 연결 실패 | 서버 상태, 인증 정보, TLS 설정 | 정상 작동이 확인된 구독 주소 |
2. 전체 URL 확인하기: 도메인만 맞는지 보지 마세요
구독 URL은 이용 중인 서비스 제공업체에서 받아야 합니다. 계정 관리 페이지, 로그인 페이지, 청구 페이지의 주소가 아니라 제공업체가 안내하는 구독 복사 기능을 사용하세요. 아래 값은 URL 구조를 설명하기 위한 예시일 뿐 실제로 사용할 수 있는 구독이 아닙니다. 실제 URL은 경로, 매개변수 이름, 길이가 다를 수 있으므로 예시를 보고 직접 조합하지 마세요.
https://example.com/sub?token=xxxx
- 시작과 끝 확인: 프로토콜, 도메인, 경로, 전체 쿼리 매개변수가 복사됐는지 확인하세요. 메신저에서 줄바꿈되어 보여도 내용이 바뀌지 않을 수 있지만, 텍스트를 직접 선택하면 마지막 부분이 빠질 수 있습니다.
- 덧붙은 문구 제거: “구독 주소:”, URL을 감싼 따옴표, 문장 끝 문장 부호, 줄바꿈을 URL 입력란에 함께 넣지 마세요. URL 안에 원래 들어 있는 기호는 삭제하지 마세요.
- 매개변수 원문 유지:
?뒤에는 보통 쿼리 매개변수가 오고,&는 매개변수를 구분합니다. 이를 전각 기호로 바꾸면 주소가 달라집니다. 대소문자를 임의로 바꾸거나 퍼센트 인코딩을 반복해서 디코딩하지 마세요. - 다시 복사하기: Home에서 해당 Subscribe 항목의 편집 화면을 열어 URL을 확인하세요. 다시 추가해야 한다면 Home의 추가 메뉴에서 Add Server로 이동해 Subscribe를 선택한 다음 URL을 입력합니다. 계속 사용할 수 있는 서버를 잃지 않도록 기존 항목은 먼저 유지하세요.
일부 웹페이지 소스에서는 구분 기호 &를 &로 표시합니다. 소스에서 바로 복사하면 이 표기까지 주소에 포함될 수 있습니다. 서비스 제공업체 페이지의 복사 버튼을 우선 사용하고, 올바르게 복사한 URL을 전체 바꾸기 기능으로 다시 수정하지 마세요.
3. 서비스 제공업체 측 확인: 계정이 유효해도 응답에 항목이 있다는 뜻은 아닙니다
앱 구매와 서비스 제공업체 계정은 서로 별개입니다. 클라이언트 일회 구매 ≠ 회선 요금제입니다. App Store에서 Shadowrocket 구매를 복원해도 서비스 제공업체 계정 권한이 자동으로 복구되거나 만료된 구독 URL이 바뀌지는 않습니다. URL이 완전한지 확인한 뒤 기존 계정의 유효 기간과 사용 가능한 데이터, 구독 주소가 재설정됐는지, 제공업체가 명시한 요청 제한이 있는지 살펴보세요.
이는 HTTP 상태 코드이며 Shadowrocket에 반드시 같은 문구로 표시되는 팝업이 아닙니다. 앱의 오류 정보나 서비스 제공업체가 확인한 응답에서 해당 상태를 확인한 경우에만 그에 맞게 조치하세요. 목록이 비었다는 이유만으로 계정이 만료됐다고 판단할 수는 없습니다.
HTTP 401 Unauthorized
원인: 서버 인증에 실패했습니다. token이 만료됐거나 URL이 재설정됐을 수 있습니다.
해결: 서비스 제공업체에서 현재 유효한 URL을 받아 저장된 URL 전체를 교체한 다음 업데이트하세요.
HTTP 403 Forbidden
원인: 서버가 요청을 거부했습니다. 계정 권한이나 접근 조건이 원인일 수 있으며 비밀번호 오류만으로 단정할 수 없습니다.
해결: 서비스 제공업체에 해당 구독 요청이 거부된 이유를 확인하고, 안내에 따라 계정이나 접근 제한을 처리하세요.
HTTP 429 Too Many Requests
원인: 요청이 서버의 빈도 제한에 걸렸습니다. 계속 새로고침해도 거부될 수 있습니다.
해결: 수동 업데이트를 중단하세요. 응답에 Retry-After가 있으면 안내된 시간만큼 기다리고, 그렇지 않으면 서비스 제공업체에 재개 조건을 문의하세요.
결론: 확인된 서버 거부부터 해결하세요
응답이 401, 403 또는 429로 확인됐다면 인증, 권한 또는 요청 빈도 문제부터 해결하세요. Config를 다시 작성하거나 같은 URL을 반복해서 추가해도 문제가 해결되지 않습니다.
4. 성공 응답인데 서버 목록이 비어 있음: 상태 코드뿐 아니라 내용도 확인하세요
HTTP 200은 서버가 성공 응답을 반환했다는 뜻일 뿐, 그 내용이 Shadowrocket에서 파싱할 수 있는 구독이라는 보장은 없습니다. 로그인 페이지, 인증 페이지, 만료 안내도 200으로 반환될 수 있습니다. 도메인에 접속할 수 있고 페이지가 정상적으로 열려도 응답에 가져올 서버 항목이 없을 수 있습니다.
- 웹페이지가 반환됨: 서비스 제공업체가 반환 내용이 HTML 로그인 페이지나 인증 페이지라고 확인했다면, 구독 진입점이나 서버 접근 조건을 바로잡으세요. 해당 페이지 주소를 Subscribe에 계속 사용하지 마세요.
- 응답 본문이 비어 있음: 서비스 제공업체에 현재 계정에 항목이 실제로 할당됐는지, 구독 생성 기능이 정상인지 확인해 달라고 요청하세요. 로컬 규칙을 지워도 빈 본문에서 서버가 만들어지지는 않습니다.
- 출력 형식이 맞지 않음: 서비스 제공업체가 Shadowrocket용이라고 명시한 구독 진입점을 사용하세요. Base64는 인코딩 방식일 뿐, 인코딩된 내용이 무엇이든 유효한 구독이 되는 것은 아닙니다.
- 항목 내용이 불완전함: 서비스 제공업체에 프로토콜 필드와 직렬화 결과를 확인해 달라고 요청하세요. 오류 페이지의 문구를 서버 설정으로 직접 바꾸거나, 누락된 Address, Port, 인증 필드의 값을 추측하지 마세요.
Home의 Subscribe는 구독 서버를 관리하는 기능이고, Config의 구성 파일에는 규칙이나 다른 설정이 포함될 수 있습니다. 구성 파일 주소, 규칙 목록 주소, 서버 구독 주소를 서로 바꿔 사용하지 마세요. 서비스 제공업체가 여러 진입점을 제공한다면 각각의 용도를 확인한 다음 알맞은 유형을 선택하세요.
| 확인된 응답 결과 | 의미 | 다음 단계 |
|---|---|---|
| 200 및 HTML 페이지 | 요청은 성공했지만 서버 구독 내용이 아님 | 구독 진입점과 리디렉션 결과 확인 |
| 200 및 빈 본문 | 파싱할 본문이 없음 | 서비스 제공업체에 생성 결과 확인 요청 |
| 200 및 비어 있지 않은 구독 내용 | 형식과 항목 필드를 추가로 확인해야 함 | 민감 정보를 가린 오류 정보를 제공하고 출력 확인 요청 |
5. 네트워크와 업데이트 시점: 한 번에 조건 하나만 바꾸세요
업데이트는 먼저 도메인 확인, 연결, HTTPS의 TLS 검증을 마친 다음 구독을 파싱합니다. 요청 시간 초과와 파싱 실패는 서로 다른 단계의 문제입니다. 네트워크를 전환한 뒤 이전 연결이 아직 복구되지 않았을 수 있고, 계정을 갱신한 직후에는 서버 상태가 아직 업데이트되지 않았을 수 있습니다. 실제 요청 결과와 서비스 제공업체의 안내를 기준으로 판단하세요. 몇 분만 기다리면 반드시 복구된다는 식의 일률적인 기준은 없습니다.
- 현재 상태 기록: Wi-Fi와 셀룰러 네트워크 중 무엇을 사용하는지, VPN이 연결되어 있는지, Home → Global Routing에서 어떤 옵션을 선택했는지 기록하세요. 이 조건들을 한꺼번에 바꾸지 마세요.
- 한 번 업데이트: Home에서 해당 Subscribe 항목을 업데이트하고 요청이 끝날 때까지 기다리세요. 연속으로 누르거나 여러 기기에서 같은 URL에 반복 요청하지 마세요.
- 네트워크를 바꿔 재확인: 시간 초과가 발생했다면 기기 네트워크가 안정된 뒤 다른 사용 가능한 네트워크에서 한 번 테스트하세요. 한 네트워크에서는 실패하고 다른 네트워크에서는 성공한다면 token을 바로 재설정하기보다 네트워크 경로를 우선 확인하세요.
- 기존 연결 영향 분리: 현재 연결이 요청에 영향을 준다고 의심된다면, 연결이 끊길 수 있음을 이해한 상태에서 VPN을 잠시 해제하고 테스트할 수 있습니다. VPN이 자동으로 다시 연결되면 Settings → On Demand를 확인하세요. 테스트가 끝나면 기존 설정을 복원합니다.
- 시스템 시간 확인: 기기의 날짜나 시간이 크게 틀리면 인증서 유효 기간 판정에 영향을 줄 수 있습니다. 먼저 시간을 바로잡고, 구독 요청 오류를 해결하기 위해 인증서 검증을 끄지 마세요.
Global Routing의 Config, Proxy, Direct, Scene은 트래픽 처리 방식이지 구독 형식 선택기가 아닙니다. 업데이트 요청이 실제로 어떤 경로를 사용하는지는 앱 설정과 현재 연결 상태를 함께 고려해야 합니다. 모드 이름만으로 요청이 반드시 특정 경로를 이용한다고 판단할 수 없습니다. DOMAIN-SUFFIX, GEOIP, IP-CIDR 또는 FINAL을 수정해도 서버가 반환한 빈 본문은 해결되지 않습니다.
6. 문제 확인 정보 전달 및 복구 후 점검
앞의 확인으로도 원인을 찾지 못했다면 검증에 필요한 정보를 이용 중인 서비스 제공업체에 전달하세요. 단순히 “서버가 사라졌다”고 하기보다 언제, 어떤 네트워크에서, 무엇을 했고, 어떤 결과가 나왔는지 설명하세요. 계정 비밀번호나 전체 구독 URL을 공개할 필요는 없으며, 원본 URL을 낯선 사람에게 전달해 대신 테스트하게 하지 마세요.
- 발생 시각: 서비스 제공업체가 해당 요청을 찾을 수 있도록 날짜, 시간, 시간대를 기록하세요.
- 작업과 증상: Home에서 기존 Subscribe를 업데이트했는지, 새로 추가한 뒤 처음 업데이트했는지 설명하고 업데이트 전후에 항목이 있었는지 적으세요.
- 오류 원문: 실제 표시된 오류를 그대로 적거나 캡처하세요. 시간 초과, 인증서 오류, HTTP 상태, 파싱 오류를 구분하고 인증 매개변수와 계정 식별 정보는 가리세요.
- 비교 결과: Wi-Fi와 셀룰러 네트워크에서 결과가 같은지, 현재 연결을 해제해 본 적이 있는지, 계정 페이지에 어떤 유효 상태가 표시되는지 설명하세요.
- 서버 측 확인 항목: 요청 도착 여부, 최종 응답 상태, 리디렉션 여부, 본문이 비어 있는지, 출력이 Shadowrocket에 적합한지 서비스 제공업체에 확인해 달라고 요청하세요.
복구된 뒤 한 번 업데이트하고 그룹을 펼쳐 서버 항목이 표시되는지 확인한 다음, 기존 항목 하나로 연결을 테스트하세요. 목록은 복구됐지만 연결이 계속 실패한다면 구독을 다시 수정하지 말고 서버 연결 문제를 확인하세요. Trojan이나 TLS를 사용하는 다른 항목은 흔한 포트를 임의로 입력하지 말고 서비스 제공업체가 안내한 값에 따라 Address, Port 및 관련 TLS 필드를 확인하세요.
결론: 업데이트와 연결을 각각 확인하세요
먼저 구독 업데이트 한 번으로 항목이 안정적으로 생성되는지 확인하고, 선택한 서버가 연결되는지 별도로 확인하세요. 완료되면 문제 해결을 위해 임시로 바꾼 On Demand 및 라우팅 설정을 복원해 테스트 상태가 계속 남지 않도록 하세요.