V2Ray 구독 형식 가이드: Base64 구독, 네이티브 JSON 설정, vmess:// 공유 링크 변환

Base64 구독, 네이티브 JSON, vmess/vless 공유 링크의 구조와 용도를 알아보고 v2rayN·v2rayNG에서 가져오고 변환하는 방법을 안내합니다.

이 글 미리보기

구독 주소, 구독 응답, 단일 노드 공유 링크, 코어 설정 파일은 서로 다릅니다. 형식에 맞는 가져오기 메뉴를 선택하세요. ‘구독 내용을 인식할 수 없음’, ‘JSON을 노드로 가져올 수 없음’ 오류를 겪거나 기기를 옮기려는 사용자를 위해 Base64 외부 인코딩을 확인하고 VMess와 VLESS 필드 차이를 살펴봅니다. 변환 후 유지되는 연결 매개변수와 별도로 옮겨야 하는 DNS·라우팅 설정도 정리했습니다.

1. 형식 구분하기: 구독 주소와 노드 설정은 다릅니다

V2Ray 구독은 정해진 코어 설정 파일 형식이 아닙니다. 흔히 말하는 ‘구독 링크’는 보통 HTTPS 주소이며, 클라이언트가 이 주소에 접속해 텍스트를 받아 노드 목록으로 파싱합니다. 응답은 공유 링크가 여러 줄로 나열된 형태일 수도 있고, 링크 목록 전체를 Base64로 인코딩한 형태일 수도 있습니다. 주소가 열렸다는 것은 응답을 받았다는 뜻일 뿐, 그 응답이 현재 클라이언트에서 사용할 수 있다는 뜻은 아닙니다.

대상식별 방법사용할 메뉴저장되는 범위
구독 주소https://로 시작하는 서비스 주소구독 그룹 설정원격 업데이트 소스
Base64 구독 본문디코딩하면 보통 여러 줄의 공유 링크가 나옵니다구독 업데이트 기능으로 파싱여러 노드의 매개변수
VMess 공유 링크vmess://와 인코딩된 데이터클립보드에서 가져오기보통 노드 하나
VLESS 공유 링크vless://와 사용자 정보 및 쿼리 매개변수클립보드에서 가져오기보통 노드 하나
코어 JSONinbounds, outbounds 등의 필드 포함사용자 지정 설정 메뉴연결, 인바운드, DNS, 라우팅 등의 설정

예를 들어 https://subscription.example.com/list?token=demo는 주소 형식만 보여 주는 예시이며 실제로 사용할 수 있는 구독 주소가 아닙니다. 이를 VLESS 서버 주소로 입력해서는 안 되며, 네이티브 JSON 내용을 구독 주소 입력란에 붙여 넣어서도 안 됩니다. 구독 주소의 토큰은 계정 권한과 연결된 경우가 많으므로, 문제를 확인할 때는 도메인만 가리지 말고 전체 경로와 쿼리 매개변수도 숨기세요.

2. Base64 구조 살펴보기: 구독 외부와 VMess 내부 구분하기

흔히 쓰이는 Base64 구독은 두 겹으로 구성됩니다. 외부에서 링크 목록 전체를 인코딩하고, 내부의 각 vmess:// 링크에도 Base64로 인코딩된 JSON이 들어갈 수 있습니다. 외부 인코딩을 풀면 노드 링크 목록이 나오며, 코어에서 바로 사용할 수 있는 전체 설정 파일이 나오는 것은 아닙니다. VLESS는 보통 URI 형식을 직접 사용하므로 VMess의 내부 디코딩 방식을 그대로 적용할 수 없습니다.

구독 응답 본문
  ↓ 본문 전체를 Base64로 디코딩
vmess://인코딩된 노드 JSON
vless://사용자 식별자@서버:포트?매개변수#메모
  ↓ vmess:// 뒤에 있는 페이로드만 추가로 디코딩
VMess 노드 필드: add, port, id, net, tls 등

먼저 응답에 실제로 어떤 텍스트가 들어 있는지 확인한 뒤 디코딩 여부를 판단하세요. 본문이 이미 vmess:// 또는 vless://로 시작하면 줄마다 링크가 있는 형식으로 처리하면 됩니다. HTML 태그, 로그인 안내 또는 JSON 오류 메시지로 시작한다면 구독 요청, 권한 또는 서버 응답에 문제가 있을 가능성이 큽니다. 계속 디코딩해도 해결되지 않습니다.

  • 줄바꿈: 한 줄에 링크 하나를 온전히 저장하세요. 복사할 때 링크 중간에 줄바꿈을 넣거나 여러 링크를 한 줄에 이어 붙이지 마세요.
  • 문자: Base64URL은 일반 Base64의 +, / 대신 -, _를 사용하며, 결과에 따라 끝의 =가 생략되기도 합니다.
  • 텍스트: 중국어 메모는 UTF-8로 복원해야 합니다. 바이너리 결과를 일반 문자로 바로 표시하면 글자가 깨질 수 있습니다.
  • 디코딩 횟수: 링크 목록을 얻었다면 외부 디코딩을 멈추세요. 영문자와 숫자가 섞여 있다는 이유만으로 계속 디코딩하면 안 됩니다.

아래는 로컬의 빈 페이지에서 브라우저 개발자 도구로 실행할 수 있는 순수 JavaScript 함수입니다. 텍스트 인코딩과 디코딩만 보여 주며 네트워크 요청을 보내거나 클립보드를 자동으로 읽지 않습니다. 예시 텍스트로 왕복 변환 결과를 확인하세요. 실제 구독 정보를 다룰 때는 브라우저 확장 프로그램과 콘솔 기록에도 주의해야 합니다.

function encodeUtf8Base64(text) {
  const bytes = new TextEncoder().encode(text);
  let binary = "";
  for (const byte of bytes) binary += String.fromCharCode(byte);
  return btoa(binary);
}

function decodeUtf8Base64(text) {
  let value = text.trim().replace(/\s+/g, "")
    .replace(/-/g, "+").replace(/_/g, "/");
  if (value.length % 4 === 1) {
    throw new Error("Base64 길이가 올바르지 않습니다. 복사한 내용을 확인하세요");
  }
  value += "=".repeat((4 - value.length % 4) % 4);
  const bytes = Uint8Array.from(atob(value), ch => ch.charCodeAt(0));
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

const sample = "구독 형식 예시";
console.log(decodeUtf8Base64(encodeUtf8Base64(sample)) === sample);

3. 노드 필드 확인하기: VMess JSON과 VLESS URI

일반적인 VMess 공유 형식은 vmess:// 뒤에 인코딩된 노드 설명 JSON을 담습니다. 이는 클라이언트가 사용하는 공유 형식으로, Xray 또는 V2Ray 코어 JSON과는 다릅니다. 여기서 v는 공유 형식 식별자입니다. v: "2"는 클라이언트 버전을 뜻하지 않으며 특정 버전의 코어를 설치하라는 의미도 아닙니다.

{
  "v": "2",
  "ps": "VMess-WS-TLS 예시",
  "add": "node.example.com",
  "port": "443",
  "id": "11111111-2222-4333-8444-555555555555",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "edge.example.com",
  "path": "/ws",
  "tls": "tls",
  "sni": "edge.example.com"
}

위 JSON 전체를 UTF-8로 인코딩한 뒤 Base64로 변환하고 앞에 vmess://를 붙이면 이런 공유 형식을 만들 수 있습니다. 예시 도메인과 사용자 식별 정보는 설명용일 뿐 연결할 수 없습니다. 실제 노드의 주소, UUID, 전송 방식, TLS 설정은 서버 설정과 일치해야 합니다. 메모만 바꿔서는 사용할 수 없습니다.

VMess + WS + TLS

서버 포트
443
전송 필드
net: ws
요청 경로
/ws
HTTP Host
edge.example.com
TLS SNI
edge.example.com

Host는 WebSocket 요청에, SNI는 TLS 핸드셰이크에 사용됩니다. 예시에서 값이 같더라도 서로 바꿔 쓸 수 있다는 뜻은 아닙니다.

VLESS + TCP + TLS

서버 포트
443
전송 매개변수
type=tcp
프로토콜 매개변수
encryption=none
전송 보안
security=tls
TLS SNI
node.example.com

VLESS 프로토콜의 암호화 필드와 TLS는 서로 다른 계층에 해당합니다. 따라서 TLS 설정을 삭제해도 된다는 뜻이 아닙니다.

해당 VLESS 예시는 사용자 정보, 주소, 쿼리 매개변수, 조각 메모리로 구성됩니다. 공백이나 한글 메모리는 URI 퍼센트 인코딩을 적용해야 하며, IPv6 주소는 대괄호로 감싸야 합니다. 매개변수 순서는 대개 의미에 영향을 주지 않지만, 이름과 값은 임의로 바꾸면 안 됩니다.

vless://[email protected]:443?encryption=none&security=tls&sni=node.example.com&type=tcp#VLESS-TLS

4. v2rayN에서 가져오기: 구독 그룹을 만든 뒤 노드 업데이트

원격 구독은 구독 그룹에 추가하고, 공유 링크 한 개 또는 여러 개는 클립보드에서 가져오세요. 아래 경로는 v2rayN의 일반적인 중국어 인터페이스를 기준으로 설명합니다. 데스크톱 버전과 WPF 버전은 메뉴 위치가 다를 수 있으며, 업데이트 기능이 그룹의 마우스 오른쪽 버튼 메뉴에 있을 수도 있습니다. 실제 메뉴에 표시된 같은 이름의 기능을 사용하세요. 버튼 위치가 달라졌다고 사용자 지정 설정 메뉴로 대신 가져오지 마세요.

  1. 그룹 만들기

    「구독 그룹」→「구독 그룹 설정」을 열고 새 항목을 추가합니다. 메모를 입력하고 전체 HTTPS 구독 주소를 주소 입력란에 붙여 넣은 다음 저장하세요.

  2. 구독 업데이트

    「구독 그룹」으로 돌아가 「모든 구독 업데이트(프록시 사용 안 함)」를 선택합니다. 현재 네트워크에서 이미 작동하는 프록시를 통해야 구독에 접속할 수 있다면, 프록시를 사용하는 업데이트 항목을 선택하세요.

  3. 노드 확인

    업데이트 결과를 확인해 대상 그룹에 노드가 표시되는지 살펴봅니다. 노드 편집 창을 열어 프로토콜, 서버 주소, 포트, 전송 방식, TLS를 확인하세요. 메모가 같은지만으로 판단하면 안 됩니다.

  4. 서버 선택

    노드 목록에서 마우스 오른쪽 버튼을 눌러 「활성 서버로 설정」을 선택합니다. 구독을 업데이트해도 설정만 가져온 것이므로 현재 연결이 새 노드로 전환된 것은 아닙니다.

  5. 연결 확인

    클라이언트의 연결 테스트를 실행한 뒤 브라우저에서 확인할 사이트에 실제로 접속해 보세요. 실패하면 로그의 핸드셰이크, 인증, 이름 확인 오류부터 살펴보고 형식을 바로 다시 변환하지 마세요.

정적 공유 링크를 가져오려면 접두사를 포함한 전체 링크를 복사한 다음 「서버」→「클립보드에서 일괄 URL 가져오기」를 사용하세요. 일반적인 단축키는 Ctrl+V입니다. 여러 링크는 한 줄에 하나씩 입력하세요. 원격 주소 없이 Base64 본문만 있는 경우, 먼저 로컬에서 링크 목록으로 복원한 뒤 이 메뉴를 사용하면 오류를 찾기 쉽습니다.

  • 다시 업데이트하면 변경 사항이 덮어써집니다: 구독 노드는 원격에서 관리하므로 직접 수정한 내용이 다음 업데이트에서 바뀔 수 있습니다. 계속 유지해야 하는 수정 사항은 별도 항목으로 저장하세요.
  • 로컬 메뉴 경로를 그대로 적용하지 마세요: 예시 설정에서는 127.0.0.1:10808을 자주 사용하지만, 실제 수신 포트는 현재 클라이언트 설정에서 확인해야 합니다. 구독 노드의 443만으로 유추할 수 없습니다.
  • JSON은 전용 메뉴에서 가져오세요: 전체 코어 설정 파일은 「서버」 메뉴의 사용자 지정 설정 추가 기능을 사용합니다. 일반 노드 항목과 편집·내보내기 기능이 다를 수 있습니다.

5. v2rayNG에서 가져오기: 업데이트 소스와 정적 복사 구분하기

v2rayNG는 Android에서 Xray 코어를 사용하는 클라이언트입니다. 일반적으로 원격 구독은 오른쪽 위 메뉴에서 관리하고, 정적 링크는 메인 화면의 플러스 버튼으로 가져옵니다. 두 방법 모두 노드를 표시할 수 있지만 구독 소스를 유지하는 것은 전자뿐입니다. 데스크톱에서 내보낸 공유 링크를 복사해도 데스크톱의 업데이트 일정이나 그룹 관계가 자동으로 이어지지는 않습니다.

  1. 소스 추가

    오른쪽 위의 「⋮」→「구독 그룹 설정」을 열고 「+」를 누른 뒤 메모와 전체 구독 URL을 입력합니다. 저장한 다음 메인 화면으로 돌아가세요.

  2. 노드 가져오기

    「⋮」→「구독 업데이트」를 선택합니다. 버전에 따라 현재 그룹과 전체 그룹 업데이트가 제공된다면 대상 구독이 포함된 범위를 선택하고 업데이트 안내를 확인하세요.

  3. 정적 항목 가져오기

    공유 링크를 받았다면 먼저 전체 텍스트를 복사한 뒤 메인 화면에서 「+」→「클립보드에서 가져오기」를 누르세요. 구독 웹페이지의 로그인 안내까지 함께 복사하지 마세요.

  4. 연결 시작 및 확인

    대상 노드를 선택해 연결을 시작하고 시스템의 VPN 권한 요청을 확인합니다. 실제 연결 테스트를 실행한 뒤 사용 중인 앱으로 접속을 검증하세요. TCP 지연 시간만 표시된다고 프록시 요청이 성공한 것은 아닙니다.

두 기기에서 이전하기: 같은 소스를 사용하고 설정은 각각 확인

데스크톱: v2rayN
  • 원본 HTTPS 주소를 구독 그룹에 저장합니다.
  • 현재 코어가 노드에 필요한 프로토콜을 지원하는지 확인합니다.
  • 시스템 프록시, DNS, 라우팅 규칙은 별도로 설정합니다.
Android: v2rayNG
  • 노드 메모만 복사하지 말고 같은 구독 주소를 추가합니다.
  • 업데이트한 뒤 주요 매개변수와 노드 연결 가능 여부를 확인합니다.
  • VPN 권한과 앱별 프록시 적용 범위는 별도로 확인합니다.

같은 소스를 사용하면 관리하기 편하지만, 반환되는 목록은 계정, 요청 조건, 서버 정책에 따라 달라질 수 있습니다. 두 기기의 노드 목록과 설정은 자동으로 동기화되지 않습니다.

6. 형식 변환하기: 유지할 수 있는 정보를 먼저 확인

공유 링크와 Base64 링크 목록은 대개 텍스트를 포장하는 방식만 다릅니다. 반면 네이티브 JSON과 공유 링크는 일대일로 대응하지 않습니다. 전체 설정에는 여러 아웃바운드, 직접 연결·차단 규칙, DNS, 인바운드 수신 설정, 아웃바운드 선택 로직이 포함될 수 있습니다. 노드 링크 하나에는 보통 특정 프록시 아웃바운드의 연결 매개변수만 담기므로 전체 설정 백업을 대신할 수 없습니다.

원본 구독 주소 유지

권장

두 기기에 같은 원격 소스를 각각 추가하세요. 주소가 유지되면 원격에서 관리하는 노드 변경 사항을 계속 받을 수 있습니다. 여러 기기에서 사용할 수 있는지는 서비스 계정 정책을 따르세요.

적합한 경우: 여러 기기에서 지속적으로 업데이트하며 사용

노드 공유 링크 내보내기

노드의 마우스 오른쪽 버튼 메뉴나 공유 메뉴에서 공유 URL 내보내기, 링크 복사 등의 기능을 선택합니다. 대상 기기에 가져온 뒤 매개변수를 하나씩 확인하세요. 이 방식은 정적 노드 스냅샷을 만들 뿐 구독 토큰이나 자동 업데이트 관계는 포함하지 않습니다.

적합한 경우: 소수의 노드를 임시로 이전하거나 개별 연결 매개변수를 확인할 때

전체 코어 JSON 유지

사용자 지정 설정 메뉴를 이용해 이전한 뒤 코어 호환성, 로컬 경로, 수신 주소와 포트를 확인하세요. 클라이언트가 실행 중에 생성한 설정이 모든 플랫폼에서 사용할 수 있는 범용 백업이라고 간주하지 마세요.

적합한 경우: 여러 아웃바운드, DNS 또는 복잡한 라우팅 설정을 유지해야 할 때

링크 목록과 Base64 구독 본문 간 변환

  1. 대상 클라이언트에서 지원하는 전체 공유 링크를 모으고 한 줄에 하나씩 배치합니다. 채팅 기록에 포함된 따옴표, 번호, 설명 문구는 제거하세요.
  2. 전체 텍스트를 UTF-8로 변환한 다음 Base64로 인코딩하면 일반적인 Base64 구독 본문을 얻을 수 있습니다. 반대로는 한 번 디코딩해 줄마다 링크가 있는 형태로 복원합니다.
  3. 클라이언트에 가져오기 전에 첫 줄의 프로토콜 접두사, 전체 줄 수, 한글 메모가 올바른지 확인하세요. 인코딩에 성공해도 모든 노드에 연결할 수 있는 것은 아닙니다.
  4. URL을 통해 업데이트하려면 해당 본문을 실제로 반환하는 관리 가능한 HTTPS 서버도 필요합니다. Base64 텍스트를 만드는 것만으로 구독 주소가 생기지는 않습니다.

네이티브 JSON과 단일 노드 링크 간 변환

JSON에서 노드를 추출할 때는 먼저 outbounds에서 실제 VMess 또는 VLESS 아웃바운드를 찾은 다음, 사용하는 코어의 설정 구조에 따라 서버, 사용자 인증 정보, streamSettings를 확인합니다. 첫 번째 아웃바운드를 무조건 선택하지 마세요. 직접 연결일 수도 있고 다른 아웃바운드에 의존하는 체인 연결일 수도 있습니다. Xray와 V2Ray는 설정 기능이 다르고 버전별 필드도 완전히 같지 않습니다.

  • 링크를 JSON으로 변환: 먼저 클라이언트에서 링크를 가져온 뒤 클라이언트가 실행 설정을 생성하도록 하는 것이 좋습니다. 이렇게 하면 단독 아웃바운드 조각만 출력하는 대신 로컬 인바운드, DNS, 라우팅 설정이 반영됩니다.
  • JSON을 링크로 변환: 해당 아웃바운드의 매개변수만으로 링크를 구성할 수 있을 때 내보내세요. 사용자 지정 설정을 가져온 경우 클라이언트에서 일반적인 단일 노드 공유 기능을 제공하지 않을 수 있습니다.
  • 링크에 담기지 않는 설정: 인바운드 수신, 도메인별 라우팅, DNS 정책, 규칙 순서, 체인 아웃바운드 관계는 일반 공유 링크로 옮겨지지 않는 경우가 많습니다.
  • 변환 후 재확인: 주소, 포트, UUID, 전송 방식, 경로, Host, SNI, TLS 또는 REALITY 매개변수를 비교한 뒤 연결 테스트를 진행하세요.

7. 가져오기 실패 해결하기: 응답·파싱·연결 단계별 확인

먼저 오류가 발생한 단계를 확인하세요. 구독 업데이트 오류는 요청 자체가 실패했을 수 있습니다. ‘가져온 항목이 0개’라면 지원하지 않는 텍스트 형식일 수 있습니다. 노드는 표시되지만 접속할 수 없다면 연결 매개변수와 프록시 적용 범위를 확인해야 합니다. 이 문제들을 한데 섞으면 실제 원인은 해결하지 못한 채 인코딩을 반복하거나 코어만 바꾸게 됩니다.

증상우선 확인할 항목해결 방법
업데이트 응답이 401 또는 403구독 토큰, 권한 상태, 접근 조건서비스 제공업체에서 유효한 주소를 다시 받고 Base64 내용은 수정하지 않습니다.
본문이 HTML로 시작함로그인 페이지, 리디렉션 페이지, 요청 차단 페이지최종 응답과 구독 메뉴를 확인합니다. 페이지 소스를 노드로 가져오지 마세요.
Base64 디코딩 실패복사 중 잘림, 문자 형식 차이, 패딩 누락전체 내용인지 확인하고 Base64URL을 표준화한 뒤 UTF-8로 디코딩합니다.
업데이트는 성공했지만 가져온 항목이 0개반환된 내용이 지원되는 링크 목록인지 확인디코딩한 뒤 프로토콜 접두사를 확인하고 서버의 출력 형식을 점검합니다.
노드는 표시되지만 핸드셰이크 실패TLS, SNI, 시스템 시간, 전송 매개변수노드 필드로 돌아가 항목별로 비교합니다. 형식 문제와 연결 문제를 혼동하지 마세요.
연결은 되지만 일부 앱에서 작동하지 않음시스템 프록시, VPN, 앱별 규칙로컬에서 트래픽을 가로채는 범위를 확인하고 구독을 다시 인코딩하지 마세요.
구독을 업데이트했는데 노드 수가 달라진 이유는 무엇인가요?

서버에서 노드 구성을 변경했거나 클라이언트가 지원하지 않는 항목 또는 중복 항목을 걸러냈을 수 있습니다. 먼저 업데이트 로그와 실제 응답 구조를 확인한 뒤 프로토콜 지원 여부를 비교하세요. 노드 수가 다르다는 이유만으로 변환 중 누락됐다고 단정하지 마세요. 자동 관리되는 구독 그룹에 이전 노드를 수동으로 다시 추가해서도 안 됩니다.

JSON 파싱은 성공했는데 클라이언트가 거부하는 이유는 무엇인가요?

JSON 문법이 올바르다는 사실만 확인된 것입니다. VMess 공유 JSON, 구독 API의 JSON 오류 응답, 코어 설정 파일은 모두 문법상 파싱될 수 있지만 용도는 서로 다릅니다. 설정 구조, 프로토콜 기능, 가져오기 메뉴도 확인해야 합니다. 네이티브 설정 파일은 사용자 지정 설정 메뉴에서 확인하세요.

공유 링크만 백업해도 DNS와 라우팅 규칙을 복원할 수 있나요?

대부분 불가능합니다. 공유 링크에는 주로 노드 연결 매개변수가 저장됩니다. 이전하기 전에 클라이언트의 DNS, 시스템 프록시, 라우팅 모드, 사용자 지정 규칙도 기록하고 전체 설정은 별도로 저장하세요. 가져온 뒤에는 먼저 노드 하나로 연결을 확인한 다음 라우팅 설정을 복원해야 노드 문제와 규칙 문제를 구분하기 쉽습니다.

v2rayN 다운로드