Clash 구독 링크 오류 및 파싱 실패 점검 체크리스트: 404부터 YAML 오류까지 단계별 진단
구독 가져오기 오류가 나면 바로 링크를 바꾸지 마세요. 링크 접근성, 응답 내용 형식, User-Agent 제한, YAML 문법, 클라이언트 호환성까지 5단계로 점검해 구독 실패 원인을 정확히 찾고 해결하는 방법을 정리했습니다.
문제 단계 먼저 파악하기: 5단계 점검 흐름 총정리
구독 가져오기가 실패할 때 나오는 오류 메시지는 대부분 모호합니다. 클라이언트는 그냥 "파싱 실패", "연결할 수 없음" 같은 문구만 띄우거나 아무 반응도 보이지 않을 때가 많아서, 링크 자체가 죽었는지, 응답 형식이 잘못됐는지, 로컬 설정 문제인지 알려주는 경우는 거의 없습니다. 이것저것 순서 없이 시도하는 건 시간 낭비이므로, 요청 경로를 따라 바깥에서 안쪽으로 단계별로 좁혀가는 방식이 훨씬 효율적입니다. 먼저 링크에 실제로 접근이 되는지 확인하고, 그 다음 응답 내용이 정상적인 구독 데이터인지 확인하고, 요청 헤더 제한으로 인한 응답 차이를 배제한 뒤, 내용 안의 YAML 문법이 올바른지 검사하고, 마지막으로 클라이언트 버전 호환성 문제를 살펴봅니다. 이 5단계를 순서대로 거치면 대부분의 구독 오류 상황을 커버할 수 있고, 굳이 링크를 바꾸거나 클라이언트를 재설치하지 않고도 원인을 찾을 수 있습니다.
시작하기 전에 구독 링크만 따로 떼어내서 클라이언트 환경 없이 커맨드라인 도구로 직접 테스트해보는 것을 추천합니다. 이렇게 하면 클라이언트 자체의 캐시나 화면 표시 지연 같은 요인을 배제하고, 서버가 실제로 보내는 원본 응답을 확인할 수 있습니다.
1단계: 구독 링크 자체 접근 가능 여부 확인
가장 먼저 배제해야 할 것은 네트워크 계층 문제입니다. curl에 상세 정보 옵션을 붙여서 구독 주소를 직접 요청해보세요.
curl -v -o /tmp/sub.txt "https://your-provider.example/api/v1/client/subscribe?token=xxxx"
-v는 요청과 응답 헤더 전체를 출력하고, -o는 응답 본문을 로컬 파일로 저장해 이후 확인하기 편하게 해줍니다. 여기서 중요하게 봐야 할 것은 HTTP 상태 코드입니다.
| 상태 코드 | 흔한 원인 | 해결 방향 |
|---|---|---|
| 200 | 요청 성공 | 응답 내용 형식을 계속 확인 |
| 401 / 403 | 토큰 만료 또는 계정 이용 제한 | 서비스 제공업체 패널에 로그인해서 링크를 새로 발급받기 |
| 404 | 구독 인터페이스 경로 변경 또는 요금제 삭제 | 패널에서 구독 링크를 다시 복사하고, 즐겨찾기에 저장된 예전 주소는 사용하지 않기 |
| 429 | 요청이 너무 자주 발생해 속도 제한(레이트 리밋)에 걸림 | 클라이언트의 구독 자동 갱신 주기를 늘리기 |
| 응답 없이 타임아웃 | DNS 해석 실패 또는 서비스 제공업체 도메인 차단 | 시스템 기본 DNS가 아닌 방식으로 해석 테스트를 해보거나, 서비스 제공업체에 도메인 상태를 문의하기 |
상태 코드가 404라면 문제는 링크 자체에 있는 것이며 클라이언트 설정과는 무관합니다. 이 경우 클라이언트 설정을 계속 뒤지는 건 시간 낭비이고, 서비스 제공업체 패널로 돌아가 구독 주소를 새로 받아야 합니다. 많은 구독 링크에는 유효기간이 있는 토큰이 포함되어 있어서 만료되면 예전 링크가 바로 무효화되는데, 이것이 "지난주까지는 됐는데 이번 주 갑자기 안 된다"의 가장 흔한 원인입니다.
2단계: 응답 내용이 올바른 구독 형식인지 확인
상태 코드 200이라고 해서 내용까지 정상이라는 뜻은 아닙니다. 1단계에서 저장한 /tmp/sub.txt를 열어서 첫 몇 줄을 보고 형식 종류를 판단하세요.
- 내용이 긴 Base64 문자열이라면 대개 노드 공유 링크를 모아놓은 것(ss://, vmess:// 등을 인코딩해 이어붙인 형태)으로, 클라이언트나 변환 서비스로 디코딩해 규칙 설정을 새로 생성해야 합니다. 기본 Clash 코어는 이런 형식을 그대로 읽을 수 없습니다.
- 내용이
proxies:,rules:같은 필드로 시작한다면 표준 Clash/mihomo YAML 설정이며, 클라이언트가 바로 인식할 수 있습니다. - 내용이 HTML(
<html>태그 포함)이라면, 요청이 서비스 제공업체 게이트웨이에서 차단되어 구독 데이터 대신 오류 페이지가 반환된 것입니다. 요금제 만료나 중간 장치의 도메인 차단으로 통신사 안내 페이지가 대신 표시되는 경우가 흔합니다.
주의
응답 내용이 로그인 페이지, 인증 페이지, 또는 단순 텍스트 오류 메시지로 보인다면 그 내용을 억지로 클라이언트 설정으로 사용하지 말고, 먼저 계정 상태와 링크 출처가 맞는지 확인하세요.
받은 것이 Base64로 묶인 링크인데 클라이언트가 표준 YAML만 지원한다면, "파싱 실패" 오류는 사실 링크가 죽은 게 아니라 형식이 맞지 않는 것입니다. 이럴 때는 서비스 제공업체에 Clash 전용 구독 주소(보통 clash, meta, flag=clash 같은 파라미터가 붙음)를 제공하는지 확인해야 하며, 범용 노드 통합 링크와는 다릅니다.
3단계: User-Agent 및 요청 헤더 제한으로 인한 응답 차이
많은 구독 서비스는 요청의 User-Agent 헤더에 따라 다른 내용을 반환합니다. 브라우저로 접속하면 안내 페이지를 보여주고, Clash 클라이언트로 접속해야 실제 설정을 반환하는 방식입니다. 이 때문에 "브라우저로 링크를 열면 빈 페이지나 오류 페이지가 나오는데 클라이언트에서는 정상적으로 가져와지는" 경우나 그 반대 상황이 생깁니다. curl로 클라이언트 요청을 재현할 때는 해당 User-Agent를 명시적으로 지정해서 다시 테스트해보세요.
curl -v -H "User-Agent: ClashforWindows/0.20.39" \
"https://your-provider.example/api/v1/client/subscribe?token=xxxx" \
-o /tmp/sub_ua.txt
UA를 지정하지 않은 요청과 지정한 요청의 응답 내용을 비교해보세요. 차이가 확실하다면 서비스 제공업체가 실제로 UA에 따라 내용을 다르게 준다는 뜻이므로, 이후 어떤 도구로 테스트하든 해당 클라이언트의 식별 정보를 함께 보내야 합니다. 그렇지 않으면 얻은 샘플은 참고 가치가 없고, 링크가 죽었다고 잘못 판단하기 쉽습니다.
또한 일부 회사 네트워크나 가정용 라우터는 특정 UA나 요청 패턴을 차단하기도 합니다. 이 단계가 의심된다면 다른 네트워크 환경(예: 휴대폰 테더링)에서 같은 명령을 다시 테스트해서 로컬 네트워크 정책의 영향을 배제해보세요.
4단계: YAML 문법 오류 항목별 점검
응답 내용이 실제로 YAML 형식임을 확인했다면, 다음은 문법이 올바른지 검사하는 단계입니다. Clash/mihomo는 들여쓰기와 필드 타입에 비교적 엄격해서, 자주 발생하는 오류는 다음과 같습니다.
- 들여쓰기 불일치: YAML은 공백으로 계층을 표현하는데, 같은 계층의 필드는 앞의 공백 개수가 완전히 같아야 합니다. 탭과 공백을 섞어 쓰면 바로 파싱 실패로 이어집니다.
- 콜론 뒤 공백 누락:
name:노드1같은 표기는 키-값이 아니라 순수 텍스트로 처리됩니다. 올바른 표기는name: 노드1처럼 콜론 뒤에 반드시 공백을 하나 넣는 것입니다. - 특수 문자 인용 부호 누락: 노드 이름이나 비밀번호에 콜론, 샵(#), 대괄호 같은 YAML 특수 문자가 들어가면 문자열 전체를 인용 부호로 감싸야 합니다. 예:
password: "abc:123". - 목록 항목 들여쓰기 오류:
proxies:아래 각 항목은- name:으로 시작하는데, 하이픈 뒤 필드는 동일한 들여쓰기 레벨을 유지해야 합니다. 한 항목이라도 공백이 하나 더 많거나 적으면 전체 목록 구조가 깨집니다.
로컬에서 점검할 때는 커맨드라인 도구로 빠르게 문법 검사를 할 수 있으며, 전체 설정을 클라이언트에 넣고 시행착오를 반복할 필요가 없습니다.
python3 -c "import yaml,sys; yaml.safe_load(open('/tmp/sub.txt'))"
파일 문법에 문제가 있다면 이 명령은 바로 예외를 던지면서 오류가 발생한 줄 번호와 열 번호를 알려줍니다. 클라이언트 화면에 뜨는 뭉뚱그린 "파싱 실패" 메시지보다 훨씬 정확해서, 정확히 어느 줄을 고쳐야 하는지 바로 알 수 있습니다. 구독이 서비스 제공업체가 자동으로 생성한 것이라 일반 사용자에게 수정 권한이 없다면, 문법 오류는 직접 고치지 말고 서비스 제공업체에 알려야 합니다. 그렇지 않으면 다음 자동 갱신 때 수정한 내용이 덮어씌워집니다.
5단계: 클라이언트 버전 및 필드 호환성 문제
YAML 문법 자체에는 문제가 없는데도 클라이언트가 계속 오류를 낸다면 필드 호환성을 의심해야 합니다. mihomo 코어는 계속 업데이트되면서 Clash 원본에는 없던 필드(특정 프록시 프로토콜의 고급 파라미터, 규칙 세트의 증분 업데이트 문법 등)가 많이 추가되었는데, 구버전 클라이언트는 모르는 필드를 만나면 해당 필드만 무시하는 대신 설정 전체를 로드하지 못하는 경우가 있습니다. 반대로 구독이 예전 문법으로 생성됐다면 최신 클라이언트는 대부분 호환되지만, 일부 필드가 폐기(deprecated) 표시된 후 동작이 바뀌는 경우도 있습니다.
점검 방향:
- 클라이언트 버전을 확인하고, 사용 중인 코어가 Clash 원본인지 mihomo(Clash Meta의 후속 프로젝트)인지 대조하세요. 둘이 지원하는 필드 집합이 완전히 같지 않습니다.
- 클라이언트 실행 로그(대개 설정에서 로그 항목이나 로컬 로그 파일 경로를 찾을 수 있음)를 확인하세요. 로그에는 보통 어떤 필드나 어느 줄에서 로드가 실패했는지 명확히 나와 있어서, 단순한 오류 팝업보다 정보량이 훨씬 많습니다.
- 구독 내용에 클라이언트가 모르는 프록시 프로토콜 타입(예: 최신 전송 계층 난독화 방식)이 있다면 해당 노드가 스킵되거나 설정 전체 로드가 실패할 수 있으며, 이는 클라이언트 구현에 따라 다릅니다. 최신 버전 클라이언트로 업그레이드하면 대부분 해결됩니다.
점검 순서 권장
먼저 커맨드라인으로 링크 접근 가능 여부와 내용의 유효성을 확인하고, 그 다음 UA 차이를 점검하고, 그 다음 YAML 문법을 검사하고, 마지막에 클라이언트 버전을 확인하세요. 앞의 네 단계로 대부분의 문제를 배제할 수 있으니, 처음부터 클라이언트를 재설치하거나 구독 주소를 계속 바꾸지 마세요.
흔한 오해와 조언
실제로 가장 흔하게 헛도는 두 가지 방향이 있습니다. 하나는 오류가 뜨면 바로 서비스 제공업체에 연락해 링크를 바꿔달라고 하지만, 새 링크가 결국 같은 설정을 가리켜서 문제가 그대로인 경우입니다. 다른 하나는 클라이언트 자체 버그를 의심해서 계속 삭제하고 재설치하지만, 사실 문제는 구독 내용의 형식에 있었던 경우입니다. 구독 링크의 원본 응답을 저장해두고 점검 근거로 활용하는 것을 권장합니다. 문제가 생기면 이 글의 5단계 방법을 먼저 한 번 훑어보고, 그 다음에 서비스 제공업체에 연락할지 클라이언트 관련 피드백을 남길지 결정하세요. 평소에는 구독의 자동 갱신 주기를 적절히 설정(429 제한에 걸리지 않도록)하고, 구독 주소를 어디서 받았는지 기록해두면 이후 점검 비용을 줄일 수 있습니다.
Clash 클라이언트 받기
표준 구독 형식과 최신 코어 필드를 안정적으로 지원하는 클라이언트가 필요하다면, 다운로드 페이지에서 바로 받을 수 있습니다.