Clash 구독 파싱 실패 및 무효화 원인과 단계별 점검 체크리스트

구독 가져오기 오류나 노드 목록이 비어 있을 때 링크 무결성, 응답 형식, 트래픽 만료, UA 제한, 클라이언트 호환성 5단계로 점검하고 공급자에게 문의할 시점을 안내합니다.

문제 유형 구분: 가져오기 오류인가, 노드 목록 공백인가

구독 관련 문제는 크게 두 가지로 나뉘며, 점검 방향이 완전히 다릅니다. 첫 번째는 클라이언트가 구독을 가져올 때 바로 오류 메시지를 띄우는 경우로, "구독 다운로드 실패", "구독 파싱 실패", "URL이 유효하지 않음" 등의 문구가 흔히 나타납니다. 이런 문제는 대개 클라이언트가 구독 링크를 요청하고 응답 내용을 받기 전이나 그 과정에서 발생합니다. 두 번째는 가져오기 과정에서 오류가 뜨지 않고 클라이언트도 "구독 업데이트 성공"이라고 표시하지만, 프록시 그룹이나 노드 목록이 텅 비어 있는 경우입니다. 이런 문제는 대개 응답 내용은 받았지만 파서가 그 안에서 유효한 노드 정보를 인식하지 못했을 때 발생합니다.

이 두 유형을 구분해서 보는 것이 매우 중요합니다. 전자는 네트워크 요청과 링크 자체를 먼저 확인해야 하고, 후자는 응답받은 데이터 형식과 필드 구조를 먼저 확인해야 합니다. 아래에서는 바깥에서 안쪽 순서로 5단계 점검 체크리스트를 제시하니, 순서대로 하나씩 배제해 나가고 단계를 건너뛰지 않는 것을 권장합니다.

1단계: 구독 링크 자체가 완전하고 사용 가능한지 확인

대부분의 구독 문제는 사실 원인이 단순합니다. 링크 자체에 문제가 있는 경우입니다. 다음 항목들을 하나씩 확인해 보세요.

  • 링크를 빠짐없이 복사했는지.구독 링크는 대체로 길고 긴 토큰 파라미터가 붙어 있어, 수동으로 복사할 때 끝부분 문자가 빠지거나 공백·줄바꿈 문자가 추가로 섞이기 쉽습니다. 구독 제공자가 제공하는 "원클릭 가져오기" 또는 "링크 복사" 버튼을 사용해 수동 선택을 피하는 것이 좋습니다.
  • 링크 프로토콜이 클라이언트 요구 사항과 맞는지.Clash 계열 클라이언트는 보통 구독 링크가 http:// 또는 https://로 시작해야 합니다. 제공자가 clash://install-config?url=... 같은 딥링크를 제공한다면, 그 안에서 실제 url 파라미터 값을 먼저 추출해 별도로 가져와야 하며, 전체를 그대로 붙여넣으면 안 됩니다.
  • 링크가 만료되었거나 폐기되었는지.일부 구독 서비스는 사용자가 기기를 변경하거나 키를 재설정하면 기존 링크를 무효화합니다. 이 경우 기존 링크는 여전히 "정상처럼 보이지만" 서버 측에서는 이미 응답을 거부하거나 빈 내용을 반환하고 있습니다.
  • 현재 사용 중인 네트워크에서 해당 링크에 직접 접근할 수 있는지.구독 도메인 자체가 프록시를 거쳐야 접근 가능한 네트워크 환경에 있는데 클라이언트가 아직 사용 가능한 노드에 연결되지 않은 상태라면, "프록시가 없어 구독을 가져올 수 없고, 구독이 없어 프록시를 구성할 수 없는" 순환적인 모순이 발생합니다. 이런 경우 보통 시스템 프록시를 일시적으로 끄거나 직접 연결 모드로 첫 구독 가져오기를 완료해야 합니다.
주의:구독 링크에 & 기호가 포함되어 있으면 일부 구버전 클라이언트 입력창에 붙여넣을 때 잘릴 수 있습니다. 붙여넣은 뒤 링크 끝부분이 제공자가 준 원본과 일치하는지 전체를 한 번 대조해 보는 것이 좋습니다.

2단계: 구독 응답 내용의 형식 확인

링크에 접근 가능함을 확인한 다음 단계는 서버가 반환하는 내용의 형식을 클라이언트가 올바르게 인식하는지 확인하는 것입니다. Clash와 Clash Meta(mihomo)가 지원하는 구독 응답 형식은 크게 두 가지입니다. 하나는 표준 proxies 필드가 포함된 YAML 설정이고, 다른 하나는 Base64로 인코딩된 노드 목록입니다(초기 클라이언트와의 호환을 위한 범용 구독 형식에서 흔히 사용됨). 응답 형식이 클라이언트의 파싱 기대치와 일치하지 않으면 "다운로드는 성공했지만 노드가 비어 있는" 전형적인 현상이 나타납니다.

명령줄 도구를 사용해 구독 응답의 원본 내용을 직접 확인하면 형식이 정상인지 빠르게 판단할 수 있습니다.

curl -A "clash-verge/v1.6.0" -L "https://example.invalid/sub/your-token" -o sub-raw.txt

다운로드가 끝나면 sub-raw.txt를 열어 다음 항목들을 중점적으로 확인합니다.

  1. 파일이 유효한 YAML인지, proxies: 필드가 포함되어 있는지, 들여쓰기가 통일되어 있는지 확인합니다(YAML은 들여쓰기에 매우 민감하여 탭과 공백을 혼용하면 파싱이 바로 중단됩니다).
  2. 내용이 무작위처럼 보이는 긴 문자열이라면 Base64 인코딩일 가능성이 높으며, 클라이언트가 이를 자동으로 인식하고 디코딩할 수 있어야 합니다. 클라이언트 버전이 오래되어 이 인코딩 방식을 지원하지 않으면 마찬가지로 노드가 비어 있는 것처럼 나타납니다.
  3. 응답 내용이 사실은 HTML 페이지(예: 로그인 페이지, 오류 페이지, 트래픽 초과 안내 페이지)인지 확인합니다. 이런 경우는 요청이 실제 구독 데이터를 받지 못하고 서버가 안내 페이지로 리다이렉트했음을 의미하며, 클라이언트는 당연히 HTML에서 노드를 파싱해 낼 수 없습니다.
판단 팁:원본 응답 내용에서 평문 형태의 server, port, type 필드를 바로 확인할 수 있다면 형식 자체는 대체로 정상이며, 문제는 이후 단계인 트래픽이나 클라이언트 호환성 쪽일 가능성이 높습니다.

3단계: 트래픽과 유효기간 소진 여부 점검

많은 구독 서비스는 트래픽이나 기간이 만료되면 곧바로 오류를 반환하는 대신, 빈 노드 목록을 반환하거나 응답을 안내 페이지로 리다이렉트합니다. 이는 "클라이언트가 업데이트 성공을 표시하지만 노드가 없는" 가장 흔한 원인 중 하나이기도 합니다. 판단 방법은 두 가지입니다.

  • 구독 제공자의 패널이나 클라이언트 전용 페이지에 로그인해 남은 트래픽과 만료 시간을 직접 확인하는 것이 가장 직접적이고 확실한 방법입니다.
  • 구독 응답 헤더의 Subscription-Userinfo 필드를 확인합니다. 이 필드에는 보통 upload, download, total, expire 값이 들어 있습니다(단위는 바이트와 Unix 타임스탬프). 일부 클라이언트는 이 값들을 구독 상세 페이지에 직접 표시해 줍니다. upload + downloadtotal에 근접하거나 초과했거나, expire 시간이 현재 시간보다 이전이라면 클라이언트 설정 문제가 아니라 트래픽 또는 유효기간 문제임을 확인할 수 있습니다.

이 단계 점검의 의미는 클라이언트를 반복해서 재설치하거나 설정을 다시 가져오는 데 시간을 낭비하지 않는 데 있습니다. 구독 자체가 이미 요금 미납 상태이거나 만료되었다면, 어떤 클라이언트 설정을 바꿔도 노드는 다시 나타나지 않습니다.

4단계: User-Agent 및 요청 헤더 제한 확인

일부 구독 서비스는 요청 헤더의 User-Agent(UA)로 요청 출처를 판단해, "정상적인 클라이언트"로 인식된 UA에만 완전한 노드 목록을 반환하고, 브라우저 UA나 알 수 없는 UA에는 간략한 안내 메시지, 빈 목록 또는 접근 거부를 반환합니다. 이는 구독 링크가 무단으로 크롤링·전파되는 것을 막는 흔한 방법입니다. 이는 또한 흔히 나타나는 현상도 설명해 줍니다. 동일한 구독 링크를 브라우저에서 직접 열면 내용이 비정상이거나 비어 있게 표시되지만, 클라이언트에서 가져오면 정상적으로 노드를 받아오는 경우인데, 이는 클라이언트가 요청을 보낼 때 사용하는 UA가 브라우저와 다르기 때문입니다.

UA 제한으로 인한 문제가 의심된다면 다음과 같이 점검할 수 있습니다.

  1. 클라이언트의 구독 요청 UA가 해당 구독 제공자 문서에 나열된 지원 UA인지 확인합니다(클라이언트마다 기본 UA가 다르며, 예를 들어 Clash Verge, Clash for Windows, mihomo 커널의 기본 식별자는 서로 완전히 일치하지 않을 수 있습니다).
  2. 클라이언트가 구독 요청 UA를 사용자가 지정할 수 있도록 지원한다면(일부 클라이언트는 구독 상세 페이지에서 이 옵션을 제공합니다), 제공자 문서에서 권장하는 UA 문자열로 변경해 봅니다.
  3. 사용자 지정 UA 파라미터를 포함한 명령줄 요청(앞서의 curl -A 예시처럼)으로 서로 다른 UA에서의 응답 결과를 각각 테스트하고 차이를 비교하면 UA 제한 여부를 확인할 수 있습니다.
주의:동일한 구독 링크에 대해 UA를 자주 바꿔가며 반복 테스트하면 서버가 이를 비정상적인 크롤링 행위로 판단해 속도 제한을 걸 수 있습니다. 매 테스트 사이에 일정한 간격을 두고 짧은 시간 안에 과도하게 요청하지 않는 것이 좋습니다.

5단계: 클라이언트 버전과 프로토콜 지원 범위 확인

구독 응답 형식이 올바르고 트래픽과 유효기간도 정상이며 UA도 차단되지 않았는데도 노드가 비어 있거나 일부 노드가 빠지는 경우가 있을 수 있습니다. 이때는 대개 클라이언트 버전과 프로토콜 지원 범위가 원인입니다. 흔한 사례는 다음과 같습니다.

  • 구독에 비교적 최신 프록시 프로토콜(예: 커널의 특정 최신 버전에서만 지원하는 전송 계층 기능)이 포함되어 있는데, 현재 클라이언트가 사용하는 커널 버전이 오래된 경우, 해당 프로토콜 노드를 파싱할 때 오류를 내지 않고 조용히 건너뛰어 노드 목록이 "일부 빠진" 채로 눈에 잘 띄지 않게 됩니다.
  • 구독에 사용자 정의된 proxy-groups 정책 그룹 유형이나 rule-providers 원격 규칙 세트 문법이 사용되어, 구버전 클라이언트의 파서가 해당 필드를 인식하지 못해 파싱 단계에서 전체적으로 실패하는 경우입니다.
  • 클라이언트가 선택한 커널 유형이 구독 요구 사항과 맞지 않는 경우입니다. 예를 들어 일부 고급 기능(더 완전한 규칙 문법, 일부 신규 프로토콜)은 Clash Meta(mihomo) 커널에서만 지원됩니다. 클라이언트가 여전히 이전의 오리지널 Clash 커널로 실행되고 있다면, 구독 내용 자체에 문제가 없어도 파싱 오류나 노드 누락이 발생할 수 있습니다.

이런 상황을 만나면 먼저 두 가지를 처리하는 것이 좋습니다. 첫째, 클라이언트와 내장 커널을 최신 안정 버전으로 업그레이드합니다. 둘째, 구독 제공자의 안내 문서를 확인해 해당 구독이 특정 커널이나 클라이언트 버전을 명확히 요구하는지 확인한 뒤, 현재 사용 중인 클라이언트와 하나씩 대조해 봅니다.

클라이언트 점검보다 구독 제공자에게 문의해야 하는 경우

위 5단계 점검은 클라이언트 측에서 해결 가능한 대부분의 상황을 다룹니다. 하지만 일부 경우는 본질적으로 클라이언트 문제가 아니어서 계속 로컬에서 점검해도 큰 의미가 없으며, 구독 제공자에게 직접 문의해 처리해야 합니다.

  1. 패널에 로그인해 계정의 트래픽과 유효기간이 모두 정상임을 확인했지만, 구독 링크가 계속 빈 내용이나 오류 페이지를 반환하며 오랜 시간이 지나도 복구되지 않는 경우.
  2. 동일한 구독 링크가 서로 다른 네트워크 환경, 서로 다른 클라이언트, 서로 다른 UA에서 모두 노드 정보를 가져오지 못해 로컬 환경 요인을 대부분 배제할 수 있는 경우.
  3. 구독 패널 자체에 노드 점검, 회선 조정, 서비스 이전 등의 공지가 표시되는 경우로, 이런 상황은 보통 제공자의 복구를 기다리거나 공지에 따라 새 구독 링크로 교체해야 합니다.
  4. 계정이 이상 행동으로 오판되어 접근이 제한되었다고 의심되는 경우로, 이때는 클라이언트 측에서 계속 재시도하기보다 제공자의 공식 고객센터 채널을 통해 상황을 설명해야 합니다.

클라이언트 측에서 스스로 점검할 수 있는 부분을 먼저 깨끗이 배제한 뒤 제공자에게 문의하면 소통이 더 효율적입니다. 링크 무결성, 응답 형식, 트래픽 상태, UA, 클라이언트 버전을 이미 확인했다는 점을 명확히 설명하면, 상대방이 기본 정보를 반복해서 확인할 필요 없이 문제를 더 빠르게 파악하는 데 도움이 됩니다.

클라이언트 다운로드