V2Ray 구독 링크 형식 가이드: Base64, 네이티브 JSON, 공유 링크 변환 방법

V2Ray 구독의 Base64 목록, 네이티브 JSON, vmess:// 공유 링크 형식과 클라이언트별 인식 차이, 형식 변환 방법을 알아봅니다.

핵심 내용

구독 주소는 콘텐츠를 가져오는 경로이고, Base64는 인코딩 방식이며, 공유 링크는 개별 서버 정보를 담습니다. 네이티브 JSON에는 전체 실행 설정이 들어갈 수 있습니다. ‘업데이트는 성공했는데 서버가 보이지 않는 경우’, ‘JSON을 가져올 수 없는 경우’, 클라이언트를 옮기려는 경우에 적합합니다. 먼저 응답 형식을 파악하고 알맞은 가져오기 메뉴를 선택한 다음, 변환할 수 있는 항목과 별도로 보존해야 할 설정을 확인하세요.

1. 구독 주소, 응답 내용, 노드 프로토콜 구분하기

일반적으로 구독 링크는 HTTPS로 콘텐츠를 가져오는 주소를 말합니다. 클라이언트가 주소에 요청을 보내면 서버 목록이나 설정 텍스트를 받아 해석합니다. 주소에 액세스 토큰이 포함될 수 있지만, 그 자체가 VMess나 VLESS 프로토콜인 것은 아닙니다. URL의 확장자만으로 응답 형식을 판단할 수도 없습니다. 같은 주소라도 요청 매개변수나 클라이언트 식별 정보에 따라 다른 콘텐츠를 반환할 수 있습니다.

일반적인 목록의 기본 단위는 공유 링크입니다. 예를 들어 vmess:// 또는 vless://로 시작하는 텍스트가 이에 해당합니다. 링크 여러 개를 줄바꿈으로 나열해 그대로 반환하거나, 전체를 한 번에 Base64로 인코딩할 수 있습니다. JSON을 반환하는 경우도 있지만, JSON 파서로 읽을 수 있다는 사실은 문법이 유효하다는 뜻일 뿐입니다. 클라이언트가 이를 서버 목록으로 처리할지, 전체 설정으로 처리할지는 별개의 문제입니다.

형식확인할 특징주로 포함되는 내용사용할 가져오기 메뉴
일반 텍스트 공유 링크 목록각 줄이 프로토콜 접두사로 시작여러 서버의 연결 정보공유 링크 또는 클립보드 가져오기
Base64 목록디코딩하면 여러 줄의 공유 링크가 나옴일반 텍스트 목록과 같은 내용해당 형식을 지원하는 구독 업데이트
네이티브 설정 JSON일반적인 최상위 키: inbounds, outbounds인바운드, 아웃바운드, DNS, 라우팅 등의 설정사용자 지정 설정 또는 설정 파일 가져오기

2. Base64는 표현 방식만 바꾸며 프로토콜 기능은 바꾸지 않습니다

Base64는 바이트를 전달하기 편한 텍스트로 나타내는 방식이며, 기밀성을 제공하지 않습니다. 중국어 메모는 먼저 UTF-8 바이트로 변환한 다음 Base64로 인코딩해야 합니다. 반대로 디코딩할 때는 바이트를 복원한 뒤 UTF-8로 해석합니다. 중국어가 포함된 문자열에 브라우저의 btoa()를 바로 사용하면 오류가 발생하거나 결과가 잘못될 수 있습니다.

3 → 4
3바이트마다 4개 문자로 인코딩하며, 마지막 묶음에는 패딩이 붙을 수 있음
2단계
바깥쪽 목록과 안쪽 VMess 내용이 각각 인코딩될 수 있음
443
아래 TLS 예시의 포트이며, 형식 판별 기준은 아님

표준 Base64에는 +, / 문자가 자주 사용되며 끝에 =가 붙을 수 있습니다. URL 안전 변형에서는 앞의 두 문자를 -, _로 바꾸고 패딩을 생략하기도 합니다. 일부 클라이언트는 이런 차이를 지원하지만, 모든 가져오기 기능이 공백이나 잘린 텍스트, 불필요한 따옴표를 자동으로 수정한다고 가정해서는 안 됩니다.

요점: 한 번 디코딩한 뒤 가져오기 방식을 선택하세요

디코딩 결과가 여러 줄의 공유 링크라면 링크 목록 메뉴를 사용하세요. 인바운드, 아웃바운드, 라우팅이 포함된 객체라면 사용자 지정 설정 메뉴를 확인하세요. 인코딩 단계 수만으로 프로토콜 호환성을 판단할 수는 없습니다.

3. VMess 공유 JSON과 네이티브 설정은 구조가 다릅니다

클래식 VMess 공유 링크는 일반적으로 ‘vmess:// + Base64로 인코딩한 JSON’ 형식입니다. 아래는 공유 객체 형식을 설명하기 위한 예시이며, 실제로 연결할 수 있는 서버가 아니고 코어에서 실행할 설정 파일도 아닙니다. 도메인은 예시용으로 예약된 도메인을 사용하며, 포트 443은 TLS 환경을 설명하기 위한 값입니다.

{
  "v": "2",
  "ps": "형식 예시",
  "add": "example.invalid",
  "port": "443",
  "id": "123e4567-e89b-42d3-a456-426614174000",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "example.invalid",
  "path": "/edge",
  "tls": "tls",
  "sni": "example.invalid"
}

여기서 v는 공유 형식의 버전 표시이며 클라이언트 버전이 아닙니다. ps는 메모이고, add, port, id는 각각 주소, 포트, 사용자 식별 정보에 해당합니다. net은 전송 방식을 나타냅니다. 이 예시에서 host와 path는 WebSocket에 사용되고, sni는 TLS 서버 이름에 해당합니다. 각 항목의 역할은 서로 다르므로 값이 같다고 같은 필드로 취급하면 안 됩니다.

공유 객체의 필드네이티브 설정에서의 일반적인 위치변환 시 주의 사항
add、portoutbounds[].settings.vnext[]의 주소와 포트네이티브 설정의 포트는 보통 숫자여야 하므로 문자열을 그대로 복사하면 안 됩니다
id、scyVMess 아웃바운드 사용자 항목의 id, security필드 이름이 완전히 같지 않으므로 코어 설정 규격에 맞춰 매핑해야 합니다
net、pathstreamSettings 및 해당 전송 설정전송 유형이 일치할 때만 관련 필드를 해석합니다
tls、snistreamSettings.security 및 TLS 설정프로토콜 암호화 매개변수와 TLS 설정은 서로 다른 계층입니다

네이티브 JSON은 여러 아웃바운드를 동시에 정의하고 라우팅 규칙으로 출구를 선택할 수 있습니다. 그중 노드 하나를 내보내도 DNS, 분할 라우팅 규칙, 인바운드 수신 주소, 아웃바운드 체인이 함께 저장되지 않는 경우가 많습니다. 따라서 ‘네이티브 JSON을 공유 링크로 변환’하는 작업은 보통 연결 정보를 추출하는 것이며, 전체 설정을 되돌릴 수 있는 형태로 압축하는 것이 아닙니다.

4. 로컬에서 형식 변환하기: 텍스트를 처리한 뒤 설정의 의미를 변환하세요

‘공유 링크 목록을 Base64로 변환하기’와 ‘Base64를 목록으로 복원하기’는 인코딩 작업이므로 로컬에서 처리할 수 있습니다. 아래 JavaScript는 텍스트 처리 함수만 정의하며 네트워크 요청을 보내지 않습니다. 직접 만든 로컬 빈 페이지의 개발자 도구에서 실행할 수 있습니다. 낯선 웹사이트의 콘솔에 실제 구독 내용을 붙여 넣거나, 출처를 알 수 없는 변환 스크립트를 실행하지 마세요.

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

function decodeUtf8Base64(input) {
  let text = input.trim()
    .replace(/\s+/g, "")
    .replace(/-/g, "+")
    .replace(/_/g, "/");

  if (!/^[A-Za-z0-9+/]*={0,2}$/.test(text)) {
    throw new Error("예상한 Base64 텍스트가 아닙니다");
  }

  if (text.length % 4 === 1) {
    throw new Error("길이가 올바르지 않습니다. 복사한 내용이 온전한지 확인하세요");
  }

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

function packShareList(links) {
  return encodeUtf8Base64(links.join("\n"));
}

function makeClassicVmessLink(shareObject) {
  return "vmess://" + encodeUtf8Base64(JSON.stringify(shareObject));
}

// UTF-8 왕복만 확인하며 실제 구독 인증 정보는 사용하지 않습니다.
const sample = "중국어 메모\n두 번째 줄";
console.assert(
  decodeUtf8Base64(encodeUtf8Base64(sample)) === sample
);
  1. 목록 복원: 응답 텍스트에 decodeUtf8Base64()를 적용한 뒤, 출력이 실제로 줄마다 공유 링크로 구성되어 있는지 확인하세요. 이 함수는 프로토콜을 자동으로 판별하거나 손상된 내용을 수정하지 않습니다.
  2. 목록 인코딩: 완전한 URI를 각각 배열에 넣고 packShareList()에 전달하세요. 줄바꿈은 항목 구분자이므로 여러 URI를 구분 없이 이어 붙이면 안 됩니다.
  3. VMess 링크 생성: 입력 객체가 클래식 VMess 공유 필드에 이미 맞는 경우에만 makeClassicVmessLink()를 사용하세요. 임의의 네이티브 설정을 올바른 노드 링크로 자동 변환하는 함수가 아닙니다.
  4. 결과 확인: 먼저 클라이언트에 테스트 항목으로 가져온 뒤 주소, 포트, UUID, 전송 방식, TLS, 서버 이름을 하나씩 대조하고 연결을 테스트하세요.

네이티브 설정을 공유 링크로 제대로 변환하려면 의미를 이해하는 변환기가 필요합니다. 내보낼 아웃바운드를 정하고 프로토콜과 전송 방식을 판별한 다음 필드를 매핑하고, 대상 공유 형식이 모든 매개변수를 표현할 수 있는지 확인해야 합니다. 표현할 수 없는 필드가 있다면 변환을 중단하거나 누락 항목을 기록하세요. 일부 설정을 조용히 버린 뒤 변환에 성공했다고 표시해서는 안 됩니다.

5. 클라이언트 3종별 가져오기 메뉴 선택하기

먼저 용도에 따라 선택하세요. 계속 업데이트할 서버 목록에는 구독을, 노드 하나를 임시로 옮길 때는 공유 링크를 사용합니다. DNS, 라우팅, 아웃바운드를 직접 제어해야 한다면 네이티브 JSON을 고려하세요. 가져오기와 관리는 클라이언트 인터페이스가 담당하고 프로토콜 실행은 코어가 담당하므로, 두 구성 요소의 호환 범위를 각각 확인해야 합니다.

구독 메뉴

추천

구독 주소를 저장하면 클라이언트가 정기적으로 또는 수동으로 서버 목록을 가져옵니다. 업데이트하기 편리하지만, 서버에서 반환하는 형식을 현재 가져오기 기능이 인식해야 합니다.

적합한 용도: 서버 목록이 자주 바뀌어 지속적으로 관리해야 하는 경우

공유 링크 메뉴

클립보드에서 URI 하나 또는 여러 개를 가져옵니다. 매개변수를 확인하기 좋지만, 기존 구독과의 업데이트 관계는 보통 유지되지 않습니다.

적합한 용도: 임시 테스트, 단일 노드 이전, 형식 문제 해결

사용자 지정 설정 메뉴

클라이언트에서 제공하는 사용자 지정 설정 기능으로 네이티브 JSON을 불러옵니다. 설정이 실제 코어와 호환되어야 하며, 라우팅과 DNS 처리 방식도 별도로 확인해야 합니다.

적합한 용도: 전체 설정이 이미 있으며 고급 아웃바운드와 라우팅을 유지해야 하는 경우

v2rayN은 데스크톱용입니다. v2rayNG는 Xray 코어를 사용하는 안드로이드 클라이언트이고, v2flyNG는 v2fly 코어를 사용하는 안드로이드 클라이언트입니다. VMess 공유 링크는 흔히 사용하는 교환 방식이지만, 지원되는 전송 방식과 확장 매개변수는 버전에 따라 달라집니다. 특히 Xray용 확장 설정을 v2fly 코어가 바로 실행할 수 있다고 가정하면 안 됩니다.

  1. 기존 설정 보존

    현재 정상적으로 작동하는 항목과 원본 응답을 먼저 보관하세요. 문제 해결은 별도의 구독 그룹에서 진행하고, 서버 목록을 먼저 전부 지우지 마세요.

  2. 데스크톱에서 구독 추가

    v2rayN의 일반적인 경로는 ‘구독 그룹’ → ‘구독 그룹 설정’ → ‘추가’입니다. 메모와 주소를 입력해 저장한 뒤 ‘구독 그룹’ 메뉴에서 업데이트하세요. 플랫폼과 버전에 따라 버튼 이름이 조금 다를 수 있습니다.

  3. 안드로이드에서 구독 추가

    v2rayNG의 일반적인 경로는 오른쪽 위 메뉴 ‘⋮’ → ‘구독 그룹 설정’ → ‘+’입니다. 저장한 뒤 메인 화면으로 돌아가 ‘⋮’ → ‘구독 업데이트’를 눌러 항목을 가져오세요. 구독 URL을 서버 주소 입력란에 넣지 마세요.

  4. 링크 하나로 비교하기

    v2rayN의 ‘서버’ 메뉴에서 클립보드 가져오기를 선택하세요. v2rayNG에서는 보통 메인 화면의 ‘+’ → ‘클립보드에서 가져오기’를 사용합니다. 같은 공유 링크로 테스트하면 구독 가져오기 문제와 노드 파싱 문제를 구분할 수 있습니다.

  5. 코어 확인

    v2flyNG에서는 구독 설정이나 클립보드 가져오기 메뉴를 사용하고, 해당 매개변수를 v2fly가 지원하는지 확인하세요. 네이티브 JSON은 구독 주소 입력란에 붙여 넣지 말고, 해당 버전에서 제공하는 사용자 지정 설정 메뉴로 불러와야 합니다.

6. 가져오기 실패 시 요청·파싱·실행 단계별로 확인하기

업데이트 완료 메시지는 어떤 업데이트 절차가 끝났다는 의미일 뿐, 모든 항목이 정상적으로 파싱됐다는 뜻은 아닙니다. 반대로 항목이 목록에 표시되어도 전송 및 TLS 매개변수가 올바르다고 볼 수는 없습니다. 인코딩을 계속 바꾸기보다 오류가 발생한 단계를 먼저 파악하세요.

증상우선 확인할 항목다음 단계
구독 요청 실패주소가 완전한지, 토큰이 만료되지 않았는지, 401 또는 403 응답이 반환됐는지서비스 제공업체의 권한 상태를 확인하세요. 인코딩 변환으로 권한 제한을 우회하려 하지 마세요.
200 응답이지만 항목이 없음응답이 로그인 페이지, 오류 JSON 또는 호환되지 않는 형식인지본문 형식을 확인한 뒤 올바른 가져오기 메뉴를 선택하세요.
Base64 디코딩 오류텍스트가 잘렸는지, 따옴표가 섞였는지, 해당 변형을 지원하는지원문을 다시 복사하고 길이와 실제 응답 내용을 확인하세요.
JSON 파싱은 되지만 가져오기는 실패공유 객체, 설정 파일, API 오류 객체를 혼동하지 않았는지최상위 키와 클라이언트가 기대하는 구조를 확인하세요.
항목은 있지만 연결 실패포트, UUID, 전송 방식, TLS, SNI, 경로원본 설정과 항목별로 대조한 뒤 네트워크에 연결할 수 있는지 확인하세요.
네이티브 JSON 전체를 Base64로 인코딩하면 범용 구독이 되나요?

아니요. 인코딩은 데이터 구조를 바꾸지 않습니다. 디코딩해도 네이티브 설정 그대로이며, 클라이언트가 공유 링크 목록만 지원한다면 목록으로 파싱할 수 없습니다. 해당 설정을 지원하는 메뉴를 사용하거나, 표현 가능한 노드 매개변수만 선별해 추출하세요.

공유 링크를 가져온 뒤 기존 분할 라우팅 규칙이 사라지는 이유는 무엇인가요?

공유 링크는 보통 노드 하나만 설명하며 전체 라우팅 설정은 포함하지 않습니다. 클라이언트의 기존 분할 라우팅 설정과 네이티브 설정의 규칙은 관리 계층이 다를 수도 있습니다. 이전하기 전에 DNS, 라우팅, 인바운드, 기타 아웃바운드 설정을 각각 저장하세요.

구독을 업데이트하면 수동으로 수정한 매개변수가 되돌아가는 이유는 무엇인가요?

구독 항목은 원격 콘텐츠를 기준으로 관리되는 경우가 많아 업데이트할 때 로컬 항목을 다시 만들거나 덮어쓸 수 있습니다. 계속 보존할 수정 사항은 별도 설정으로 저장하고, 원래 구독의 변경 사항을 자동으로 반영하지 않는다는 점을 기억하세요.

요점: 변환 편의성보다 필드 보존이 우선입니다

서비스 제공업체가 명시적으로 지원하는 구독 형식을 우선 사용하세요. 이전이 꼭 필요하다면 노드 하나로 변환 결과를 먼저 검증하고, 라우팅과 DNS는 별도로 저장하세요. 정상 작동을 확인한 뒤에 일괄 처리하면 됩니다.

v2rayN 다운로드지원 플랫폼 및 설치 파일 보기