V2Ray 구독 링크 형식 가이드: Base64 구독 디코딩, JSON·공유 링크 변환

V2Ray 구독의 Base64·공유 링크·JSON 형식과 클라이언트별 가져오기를 알아보고, 디코딩 방법과 가져오기 오류 원인을 확인하세요.

핵심 내용

구독 주소는 데이터를 가져오고, Base64는 텍스트를 인코딩하며, 공유 링크는 개별 노드를, JSON은 커널 설정을 나타냅니다. ‘구독 목록이 비어 있음’, ‘JSON을 가져올 수 없음’ 또는 노드 이전 문제를 겪고 있다면 먼저 응답 형식을 확인하고 로컬에서 디코딩한 뒤 프로토콜, 전송 방식, TLS 항목을 점검하세요. 변환은 표현 형식만 바꿀 뿐, 누락된 서버 매개변수를 채우거나 커널 간 기능 호환성을 보장하지 않습니다.

1. 구독 주소, 공유 링크, JSON의 차이

‘V2Ray 구독’은 특정 파일 확장자를 뜻하지 않습니다. 클라이언트가 HTTPS 주소에 접속하면 Base64 텍스트, 줄 단위 공유 링크, JSON 또는 로그인 페이지가 반환될 수 있습니다. 주소가 .txt나 .json으로 끝나는지만 보고 형식을 판단하지 말고 실제 응답 본문을 확인하세요.

클라이언트에서 인식하는 구독 주소

권장

v2rayN, v2rayNG 또는 v2flyNG에서 노드 목록을 가져옵니다. 서비스 제공자가 반환하는 형식이 사용 중인 클라이언트와 호환되어야 합니다. 업데이트할 때 구독 그룹을 유지할 수 있어 노드를 매번 직접 복사할 필요가 없습니다.

적합한 용도: 정기 업데이트, 여러 기기에서 구독 그룹을 각각 관리

줄 단위 공유 링크

한 줄에 노드 하나를 나타내며, 흔히 vmess://, vless://로 시작합니다. 개별 노드 문제를 확인할 때 적합합니다. 여러 개를 한꺼번에 가져와도 보통 일회성 목록이므로 기존 구독의 자동 업데이트 설정은 이어지지 않습니다.

적합한 용도: 오프라인 이전, 특정 노드의 항목 확인

커널 전용 JSON

인바운드, 아웃바운드, DNS, 라우팅 규칙이 함께 들어갈 수 있습니다. 범용 노드 목록이 아니므로 보통 클라이언트의 사용자 지정 설정 메뉴에서 선택한 커널의 구성 형식에 맞춰 사용해야 합니다.

적합한 용도: DNS, 라우팅, 다중 아웃바운드 설정을 그대로 유지

클라이언트와 커널은 구분해서 살펴봐야 합니다. v2rayN은 데스크톱 클라이언트이며, v2rayNG는 Xray 커널을, v2flyNG는 V2Fly 커널을 사용합니다. 링크를 가져올 수 있다는 것은 클라이언트가 텍스트를 인식했다는 뜻일 뿐, 현재 커널이 링크에 선언된 모든 기능을 지원한다는 뜻은 아닙니다. 특히 REALITY나 특정 흐름 제어가 관련된 경우에는 Base64 인코딩·디코딩을 반복하기보다 커널을 확인하세요.

2. 디코딩 전에 구독 응답 형식부터 확인

신뢰할 수 있는 로컬 도구에서 응답을 확인할 때는 앞쪽 공백을 제거하고 처음 나타나는 내용을 살펴보세요. 구독 주소의 토큰은 계정 접근 권한과 연결될 수 있으므로 전체 URL, 응답 본문, QR 코드를 온라인 변환 사이트에 올리지 마세요. 브라우저에 CAPTCHA, 로그인 양식 또는 오류 페이지가 표시되면 먼저 접속 문제를 해결해야 합니다.

표시된 내용가능한 형식다음 단계
vmess:// 또는 vless://일반 텍스트 공유 링크 목록줄 단위로 가져오세요. 본문 전체를 다시 디코딩하지 마세요.
영문자와 숫자, 일부 기호가 길게 이어짐Base64로 인코딩된 목록일 수 있음로컬에서 한 번 디코딩한 뒤 프로토콜 접두사가 나타나는지 확인
{ 또는 [JSON일 수 있음먼저 구조를 파악해 API 응답, 노드 객체, 전체 설정을 구분
<!DOCTYPE html> 또는 <html웹페이지 또는 접속 차단 응답주소, 로그인 상태, 구독 만료 여부 확인

HTTP 상태 코드 200은 요청이 정상적으로 응답했다는 뜻일 뿐, 본문에 노드 정보가 들어 있다는 보장은 없습니다. JSON 형식이 유효하더라도 오류 코드와 안내 문구만 담겨 있을 수 있습니다. 내용을 먼저 확인하고 알맞은 가져오기 메뉴를 선택하는 편이 프록시를 바꾸거나 포트를 수정하는 것보다 효과적입니다.

3. Base64 구독을 줄 단위 공유 링크로 복원하기

일반적인 구독 생성 방식은 공유 링크 여러 개를 줄바꿈으로 연결한 뒤 전체 UTF-8 텍스트를 Base64로 인코딩하는 것입니다. 디코딩할 때는 반대 순서로 처리하면 됩니다. 표준 Base64의 +, /와 URL 안전 변형의 -, _를 구분하고, 끝의 = 패딩이 생략될 수도 있다는 점에 유의하세요.

3 → 4
3바이트를 Base64 문자 4개로 인코딩하고, 길이가 부족하면 패딩을 추가합니다.
443
이 문서 예시에서 사용하는 원격 TLS 포트
10808
일반적인 로컬 프록시 포트 예시입니다. 실제로는 클라이언트가 수신 대기하는 포트를 확인하세요.

아래는 로컬에서 확인할 수 있는 순수 JavaScript 함수입니다. 전달된 문자열만 처리하며 네트워크 요청을 보내지 않습니다. 직접 만든 오프라인 HTML 페이지에서 실행할 수 있습니다. 신뢰할 수 없는 웹페이지의 콘솔에 실제 구독 정보를 붙여넣지 마세요. UTF-8 디코딩을 해야 한글 노드 이름이 깨지지 않습니다.

function base64ToText(source) {
  const normalized = source
    .replace(/\s+/g, "")
    .replace(/-/g, "+")
    .replace(/_/g, "/");

  if (!/^[A-Za-z0-9+/]*={0,2}$/.test(normalized)) {
    throw new Error("Base64 문자 형식이 올바르지 않습니다");
  }

  const body = normalized.replace(/=+$/, "");
  if (body.length % 4 === 1) {
    throw new Error("Base64 길이가 올바르지 않습니다. 전체 내용이 복사되었는지 확인하세요");
  }

  const padded = body + "=".repeat((4 - body.length % 4) % 4);
  const bytes = Uint8Array.from(atob(padded), ch => ch.charCodeAt(0));
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

function textToBase64(text) {
  const bytes = new TextEncoder().encode(text);
  const binary = Array.from(bytes, byte => String.fromCharCode(byte)).join("");
  return btoa(binary);
}

// 로컬 확인 결과는 true입니다.
console.log(base64ToText(textToBase64("구독 형식 테스트")) === "구독 형식 테스트");
  1. 구독 응답 본문을 base64ToText에 전달하세요. HTTPS 구독 주소 자체를 전달하는 것이 아닙니다.
  2. 디코딩 결과를 줄바꿈으로 나눈 다음 빈 줄과 각 줄의 앞뒤 공백을 제거하세요. 각 링크 안의 문자는 빠짐없이 그대로 유지해야 합니다.
  3. 각 줄의 프로토콜 접두사를 확인하고 노드 하나를 먼저 가져와 테스트한 뒤 나머지를 일괄 처리하세요.
  4. 기존 형식의 Base64 목록을 다시 만들려면 줄 단위 링크 텍스트를 textToBase64(links.join("\n"))로 인코딩하세요. 이 작업만으로 접속 가능한 구독 URL이 생성되지는 않습니다.

외부 목록을 디코딩한 뒤에도 vmess:// 뒤에 Base64 문자열이 남을 수 있습니다. 이는 노드 하나에 적용되는 인코딩 형식이지 디코딩 실패가 아닙니다. 결과 전체를 무작정 반복해서 디코딩하지 말고 프로토콜에 따라 처리하세요.

4. VMess·VLESS 공유 링크와 JSON 항목 연결하기

일반적인 VMess 공유 형식은 vmess:// 뒤에 노드 JSON을 Base64로 인코딩해 붙입니다. 흔히 사용하는 키는 add, port, id, net, host, path, tls입니다. 이는 공유용 형식이지 커널에 바로 전달할 수 있는 전체 설정이 아닙니다. 여기서 v는 공유 형식의 버전을 뜻하며 커널 버전을 뜻하지 않습니다.

VLESS 공유 링크는 보통 URI 본문에 사용자 식별자, 주소, 포트를 넣고 전송 매개변수는 쿼리 문자열에 담습니다. 아래 예시는 예약된 도메인과 데모용 UUID를 사용하므로 항목 대응을 보여주는 용도로만 사용하며 실제 노드 접속에는 쓸 수 없습니다.

vless://[email protected]:443?encryption=none&security=tls&type=tcp&sni=edge.example.com#TLS-demo
공유 정보일반적인 JSON 설정 위치확인할 사항
주소와 포트settings.vnext[].address / port원격 포트와 로컬 수신 포트를 혼동하지 마세요.
사용자 UUIDsettings.vnext[].users[].id전체 값을 유지하고 메모를 사용자 식별자로 취급하지 마세요.
type=tcpstreamSettings.network현재 커널에서 지원하는 전송 이름을 사용하세요.
security=tlsstreamSettings.security프로토콜 인증 정보와 전송 유형을 각각 확인하세요.
snitlsSettings.serverName서버의 인증서 및 설정 요구사항과 일치하는지 확인하세요.
WebSocket의 host / pathwsSettings.headers.Host / pathSNI를 Host 대신 사용할 수 없습니다.

위 VLESS 예시는 아래 Xray 아웃바운드 조각에 대응할 수 있습니다. 이 설정에는 인바운드, DNS, 라우팅이 없으므로 그대로 실행할 수 있는 전체 구성이 아닙니다. 완성된 설정에 복사할 때는 알맞은 outbounds 배열에 넣고 현재 커널 문서에서 각 항목을 확인하세요.

{
  "tag": "proxy",
  "protocol": "vless",
  "settings": {
    "vnext": [
      {
        "address": "node.example.com",
        "port": 443,
        "users": [
          {
            "id": "00000000-0000-4000-8000-000000000001",
            "encryption": "none"
          }
        ]
      }
    ]
  },
  "streamSettings": {
    "network": "tcp",
    "security": "tls",
    "tlsSettings": {
      "serverName": "edge.example.com",
      "allowInsecure": false
    }
  }
}

5. JSON을 구독 형식으로 항상 손실 없이 되돌릴 수 없는 이유

공유 링크 하나는 주로 원격 연결 하나를 나타냅니다. 전체 JSON에는 여러 아웃바운드, 규칙 매칭, DNS 서버, 트래픽 스니핑, 로컬 수신 설정이 포함될 수 있습니다. 특정 아웃바운드에서 VLESS 링크 하나를 추출할 수 있더라도 그 링크로 전체 라우팅 정책을 복원할 수는 없습니다. 따라서 ‘JSON을 구독 형식으로 변환’하려면 노드만 추출하는 것인지 전체 실행 환경을 유지하는 것인지 먼저 정해야 합니다.

변환 방법: 노드 이전과 전체 설정 이전 구분하기

노드만 이전
  • outbounds에서 프록시 아웃바운드를 찾으세요. 직접 연결이나 차단 아웃바운드를 선택하지 마세요.
  • 프로토콜, 주소, 포트, 인증, 전송, TLS 매개변수를 추출하세요.
  • 현재 클라이언트에서 인식하는 공유 링크를 만들고 하나씩 가져와 테스트하세요.
  • 대상 클라이언트에서 DNS, 시스템 프록시, 분할 라우팅 규칙을 별도로 설정하세요.
전체 설정 유지
  • 기존 JSON을 백업하고 해당 커널과 정확한 버전을 기록하세요.
  • 파일 경로, 수신 주소, 포트 사용 여부를 확인하세요.
  • 클라이언트가 제공하는 사용자 지정 설정 메뉴를 사용하세요. 일반 구독으로 가져오면 안 됩니다.
  • 실행 후 로그를 확인하고 DNS와 라우팅이 예상대로 작동하는지 점검하세요.

정리하면 공유 링크는 노드 교환에 편리하고, JSON은 설정 구조를 유지하는 데 적합합니다. 외부에서 다시 인코딩해도 두 형식의 정보 차이는 해결되지 않습니다.

마찬가지로 Xray와 V2Fly의 JSON도 파일 이름만 바꾼다고 호환되지 않습니다. 특정 프로토콜 확장, 전송 항목, DNS 옵션에 차이가 있습니다. 지원되지 않는 항목을 삭제하면 설정 파싱은 성공해도 연결 동작이 달라질 수 있습니다. 먼저 서버 요구사항을 확인한 뒤 이전 여부를 결정하세요.

6. v2rayN과 Android 클라이언트에서 올바른 메뉴 선택하기

메뉴 이름은 버전에 따라 달라질 수 있습니다. 아래는 흔히 사용하는 중국어 메뉴를 기준으로 기능을 설명합니다. 기기에서 메뉴 이름이 다르면 ‘구독 그룹’, ‘클립보드에서 가져오기’, ‘사용자 지정 설정’에 해당하는 기능을 찾으세요. 구독 URL을 개별 공유 링크만 받는 입력란에 붙여넣거나 JSON 전체를 서버 주소란에 입력하지 마세요.

  1. v2rayN에서 정기 구독 추가: ‘구독 그룹’ → ‘구독 그룹 설정’으로 이동해 그룹을 추가하고 구독 주소를 입력하세요. 저장한 뒤 구독 메뉴에서 ‘프록시를 사용하지 않고 구독 업데이트’ 또는 이에 해당하는 항목을 선택하세요. 네트워크 연결에 프록시가 꼭 필요할 때는 ‘프록시를 통해 구독 업데이트’를 선택하세요.
  2. v2rayN에서 일회성 링크 가져오기: 줄 단위 공유 링크 전체를 복사한 뒤 ‘서버’ 메뉴에서 ‘클립보드에서 URL 일괄 가져오기’를 선택하세요. 가져온 후 전송 유형, TLS, SNI를 확인하고 활성 서버로 지정하세요.
  3. v2rayNG에서 구독 업데이트: ‘구독 그룹 설정’으로 이동해 그룹을 만들고 URL을 입력한 뒤 저장하세요. 목록으로 돌아와 ‘구독 업데이트’를 실행합니다. 클립보드에 복사한 노드는 추가 메뉴의 ‘클립보드에서 가져오기’를 사용하세요. 두 메뉴를 혼용하지 마세요.
  4. v2flyNG 호환성 확인: 구독 또는 공유 링크 가져오기 메뉴를 사용하기 전에 노드 설정이 V2Fly 커널에서 작동하는지 확인하세요. Xray 전용 기능이 필요한 노드는 서비스 제공자에게 호환되는 설정을 요청해야 하며 인코딩 변환으로 해결할 수 없습니다.

7. 구독 변환과 가져오기 실패: 자주 묻는 질문

디코딩했는데도 vmess:// 뒤에 긴 문자열이 남아요. 아직 다 풀리지 않은 건가요?

외부 구독 목록은 이미 디코딩된 상태입니다. 먼저 줄바꿈으로 노드를 나눈 다음 특정 vmess:// 뒤의 데이터만 따로 디코딩해 JSON을 파싱하세요. 목록 전체를 다시 Base64 디코더에 넣거나 VMess 공유 객체를 커널 설정으로 바로 사용하지 마세요.

JSON 파일이 열리는데 클라이언트에는 노드가 하나도 표시되지 않는 이유가 무엇인가요?

최상위 키를 먼저 확인하세요. inbounds, outbounds가 있다면 전체 커널 설정일 수 있으므로 사용자 지정 설정 메뉴에서 불러와야 합니다. 오류 코드와 설명만 들어 있다면 구독 접속 문제부터 해결하세요. JSON 문법이 올바른지와 구독 형식을 클라이언트가 지원하는지는 별개의 문제입니다.

복사한 링크를 가져올 수 없으면 무엇부터 확인해야 하나요?

메신저가 링크를 잘라냈는지, 쿼리 문자열의 &가 문자 그대로의 HTML 엔티티로 바뀌었는지, 전각 콜론이나 따옴표가 섞였는지 확인하세요. 완전한 링크 하나로 먼저 테스트해 노드 정보가 제대로 표시되는지 확인한 뒤 나머지를 가져오세요.

노드는 가져왔지만 연결되지 않습니다. 구독 형식을 바꿔야 하나요?

먼저 주소, 실제 서버 포트(예: 443), UUID, 전송 경로, SNI, 커널 지원 여부를 확인한 뒤 연결 로그를 살펴보세요. 10808 같은 로컬 수신 포트를 원격 포트에 입력하면 안 됩니다. 항목을 올바르게 가져왔다면 다시 인코딩해도 보통 연결 문제는 해결되지 않습니다.

온라인 도구에 구독 정보를 보내 JSON으로 변환해도 되나요?

가능하면 로컬 도구와 클라이언트의 내보내기 기능을 사용하세요. 구독 URL과 노드 인증 정보는 모두 민감한 정보로 취급해야 합니다. 이미 유출되었다면 서비스 관리 페이지에서 구독 토큰을 재설정하고 안내에 따라 노드 인증 정보도 변경한 뒤 각 기기에 저장된 주소를 업데이트하세요.

마지막 점검은 네 단계로 정리할 수 있습니다. 응답 본문 확인, 형식 단계 파악, 노드 항목 확인, 커널 작동 검증 순입니다. TLS, 아웃바운드, 라우팅 용어는 용어 가이드에서 확인하세요. 가져오기를 마쳤는데도 인터넷에 연결되지 않는다면 기술 자료를 참고해 로그와 네트워크 설정을 점검하세요.

V2Ray 클라이언트 다운로드