Clash 구독 형식 완전 정리: YAML 설정, Base64 링크, 범용 구독 상호 변환 방법
받은 구독 링크를 클라이언트가 인식하지 못하나요? Clash YAML, Base64 노드 목록, 각 프로토콜 전용 형식의 차이를 먼저 구분하고, 구독 변환의 동작 원리, 주요 파라미터, 개인정보 주의사항까지 소개합니다.
받은 구독 링크를 클라이언트가 인식하지 못하나요? Clash YAML, Base64 노드 목록, 각 프로토콜 전용 형식의 차이를 먼저 구분하고, 구독 변환의 동작 원리, 주요 파라미터, 개인정보 주의사항까지 소개합니다.
구독 링크를 브라우저에 열어보면 반환되는 내용의 형태가 모두 같지는 않습니다. 대부분의 문제 해결은 반환된 게 정확히 어떤 형식인지 구분하지 않고 클라이언트가 "당연히 인식할 것"이라고 가정하는 데서 시작됩니다. 현재 유통되는 구독 내용은 크게 세 가지로 나뉘며, 처리 방식이 완전히 다릅니다.
판단 방법은 간단합니다. 브라우저나 curl로 구독 링크를 열어 반환된 내용의 첫 줄을 확인하세요. port:, mixed-port:, proxies: 같은 YAML 키-값 형태라면 Clash 네이티브 설정입니다. 줄바꿈 없이 영숫자와 등호로 끝나는 긴 문자열이라면 Base64일 가능성이 높습니다. 매 줄이 프로토콜 이름과 ://로 시작한다면 평문 노드 목록입니다.
팁: 많은 패널이 동시에 여러 형식의 구독 주소를 제공하며, 차이는 대개 URL 파라미터나 경로 접미사에서만 나타납니다(예: ?clash=1 또는 /clash). 인식되지 않는 구독을 만나면 먼저 패널 백엔드에 Clash 전용 링크가 이미 제공되고 있는지 확인하는 편이 수동 변환보다 훨씬 편리합니다.
Clash 코어가 바로 사용할 수 있는 구독의 기본 골격은 대략 다음과 같습니다.
port: 7890
socks-port: 7891
mode: rule
log-level: info
proxies:
- name: "hk-01"
type: ss
server: example.com
port: 443
cipher: aes-256-gcm
password: "your-password"
proxy-groups:
- name: "auto"
type: url-test
proxies:
- hk-01
url: "http://www.gstatic.com/generate_204"
interval: 300
rules:
- DOMAIN-SUFFIX,google.com,auto
- GEOIP,CN,DIRECT
- MATCH,auto
이 중 proxies는 노드 자체의 연결 파라미터를 기술하고, proxy-groups는 노드를 정책 그룹(자동 속도 테스트, 수동 선택, 로드 밸런싱 등)으로 묶으며, rules는 트래픽을 어떤 조건으로 어느 정책 그룹에 배분할지 결정합니다. 세 부분이 모두 필요하며, 구독으로 받은 YAML에 proxies만 있고 나머지 두 부분이 없다면 대부분의 클라이언트가 자동으로 기본 정책 그룹과 규칙을 추가하지만, 구체적인 동작은 클라이언트마다 다르므로 가져온 뒤 설정 뷰어를 열어 확인하는 것이 좋습니다.
Clash Meta(mihomo) 코어를 사용하는 경우 proxies 안에 tfo, smux, reality-opts 같은 확장 필드가 나타날 수 있습니다. 이는 원본 Clash가 인식하지 못하는 새로운 프로토콜 파라미터로, 원본 코어에 가져오면 바로 오류가 나거나 해당 노드를 건너뛰게 되며, 이는 "코어를 교체해야 하는지"를 판단하는 직접적인 신호이기도 합니다.
Base64 형식 구독은 본질적으로 "여러 공유 링크를 하나의 텍스트로 묶은 것"으로, 클라이언트가 한 번에 갱신을 가져올 수 있게 하는 방식일 뿐 암호화가 아니라 단순 인코딩입니다. 디코딩하면 일반적인 노드 링크는 대략 다음과 같은 구조입니다.
ss://[email protected]:443#hk-01
vmess://eyJ2IjoiMiIsInBzIjoiaGstMDIiLCJhZGQiOiJleGFtcGxlLmNvbSIsInBvcnQiOiI0NDMi...}
trojan://[email protected]:443?sni=example.com#hk-03
한 줄씩 변환하는 절차는 고정되어 있습니다.
단일 노드라면 수동으로 해도 문제없지만, 구독에는 보통 수십~수백 개의 노드가 들어 있어 하나씩 손으로 고치는 것은 현실적이지 않으며, 실제로는 거의 항상 구독 변환 서비스로 일괄 변환합니다. 다음 절에서 자세히 설명합니다.
Base64/평문 구독을 Clash가 인식할 수 있는 YAML로 변환하는 방법은 크게 두 가지로 나뉘며, 각각 장단점이 있습니다.
일부 안드로이드 클라이언트는 "새 설정 만들기" 또는 "구독 가져오기" 단계에 형식 감지 로직을 내장하고 있습니다. 링크를 붙여넣으면 클라이언트가 먼저 Clash YAML로 해석을 시도하고, 실패하면 자동으로 Base64로 디코딩한 뒤 한 줄씩 변환해 로컬 설정을 생성합니다. 이 방법은 제3자 서비스에 의존하지 않고 데이터가 전 과정 로컬에서 처리되어 개인정보 측면에서 가장 안전한 방식이지만, 변환 능력이 클라이언트 자체의 프로토콜 필드 지원 정도에 좌우되어 비교적 새로운 전송 계층 파라미터(예: 일부 hysteria2 위장 파라미터)를 만나면 변환이 불완전하거나 해당 노드를 그냥 버릴 수 있습니다.
다른 방식은 원본 구독 링크를 변환 서비스에 넘겨 서버 측에서 디코딩과 형식 재작성을 완료한 뒤, 생성된 Clash YAML 링크를 클라이언트에 구독시키는 것입니다. 이런 서비스는 보통 다음과 같은 커스텀 파라미터를 지원합니다.
이 방법의 장점은 변환 능력이 더 강력하고 템플릿을 재사용할 수 있어, 여러 구독 소스의 명명 규칙을 통일하거나 중복을 제거해야 하는 상황에 적합합니다. 대가는 원본 구독 링크(계정 신원 정보 포함)가 제3자 서버를 경유하게 되어 개인정보 노출 위험이 있다는 점입니다. 선택할 때는 해당 서비스가 로그 정책을 공개적으로 밝히고 있는지 확인해야 하며, 더 신중한 방법은 오픈소스 변환 서비스를 직접 구축해 중계 단계를 스스로 관리하는 것입니다.
주의: 구독 링크에는 보통 사용자 고유 식별자(토큰 또는 계정/비밀번호)가 포함되어 있어, 제3자 변환 서비스를 한 번 경유하면 계정 인증 정보가 해당 서비스에 노출되는 것과 같습니다. 변환 서비스의 배경을 알 수 없다면 클라이언트 내장 변환이나 로컬에 배포한 변환 도구를 우선 선택해, 구독 원문을 관리할 수 없는 제3자에게 넘기지 않도록 해야 합니다.
구독 변환이 성공적으로 가져와졌다고 해서 노드가 반드시 정상적으로 연결된다는 뜻은 아닙니다. 실제 사용에서 다음 몇 가지 상황이 비교적 자주 나타납니다.
변환 후 노드 수가 원본 구독보다 적다면, 보통 변환 서비스나 클라이언트가 특정 프로토콜 필드를 지원하지 않아 해당 노드 전체가 오류 없이 건너뛰어졌기 때문입니다. 확인 방법은 먼저 원본 Base64를 디코딩한 노드 총수를 보고, 생성된 YAML의 proxies 항목 수와 비교하는 것입니다. 실제로 줄었다면 빠진 노드의 프로토콜 종류가 비교적 드문 조합(예: 일부 실험적 전송 계층 조합)인지 확인하고, 변환 템플릿을 바꾸거나 해당 프로토콜을 지원하는 최신 코어 버전으로 업데이트하면 대부분 해결됩니다.
원격 규칙 템플릿(config 파라미터로 지정한 템플릿)을 사용한 경우, 정책 그룹의 노드 필터 조건은 노드 이름의 키워드 매칭으로 고정되어 있습니다. 새 노드 이름이 템플릿의 키워드 규칙과 맞지 않으면(예: 템플릿이 "HK|SG|JP"로 시작하는 노드만 걸러내는 경우) 해당 정책 그룹에 자동으로 편입되지 않습니다. 이럴 때는 템플릿 안의 필터 정규식을 확인하거나, 차라리 원격 템플릿을 제거하고 변환 서비스가 기본으로 제공하는 "모든 노드를 하나의 자동 속도 테스트 그룹에 넣는" 정책을 사용하면 됩니다.
일부 프로토콜(특히 Trojan과 VMess의 WebSocket+TLS 조합)은 SNI와 skip-cert-verify 필드에 비교적 민감합니다. 변환 서비스가 원본 링크의 sni나 allowInsecure 파라미터를 제대로 파싱하지 못하면 생성된 노드가 연결 타임아웃이나 핸드셰이크 실패를 겪게 됩니다. 이 경우 생성된 YAML을 수동으로 열어 원본 공유 링크의 파라미터와 대조하며 servername과 skip-cert-verify 필드를 보완하거나 수정하는 것이 좋습니다.
변환으로 생성된 구독 링크는 본질적으로 "실시간 프록시 요청"이어서, 클라이언트가 구독을 새로 고칠 때마다 변환 서비스가 원본 구독을 다시 가져와 다시 변환합니다. 원본 구독 자체에 갱신 빈도 제한(흔히 몇 시간에 한 번)이 걸려 있다면, 클라이언트가 너무 자주 새로 고치면 원본 패널이 비정상 요청으로 판단해 응답을 거부할 수 있고, 이는 변환 서비스가 빈 노드 목록을 반환하는 결과로 이어집니다. 클라이언트의 구독 갱신 간격은 6~12시간으로 설정하고, 수동으로 자주 새로고침 버튼을 누르지 않는 것이 좋습니다.
구독 형식 변환은 사소한 형식 변환 문제처럼 보이지만, 그 뒤에는 노드 정보가 여러 당사자 사이를 오가는 경로가 얽혀 있습니다. 각 단계에서 데이터가 누구의 서버를 거쳤는지, 어떤 형태로 노출되는지 파악하는 일은 단순히 "링크가 작동한다"는 것보다 시간을 들여 확인할 가치가 있습니다.