V2Ray 구독 형식 비교: Base64 구독, 네이티브 JSON 설정, 공유 링크 변환

Base64 구독, 네이티브 JSON 설정, vmess://·vless:// 공유 링크의 구조와 클라이언트별 호환성을 비교하고 형식 간 변환 방법을 안내합니다.

핵심 내용

구독 주소는 업데이트를 제공하고, Base64는 텍스트를 인코딩하며, 공유 링크는 단일 노드를 설명하고, 네이티브 JSON은 코어의 실행 설정을 담습니다. 구독을 받아도 가져올 수 없거나 JSON을 링크로 바꾼 뒤 라우팅 규칙이 사라지는 경우에 유용합니다. 먼저 입력 형식을 확인하고 프로토콜·전송 방식·보안 필드를 점검한 다음 클라이언트에서 가져와 검증하세요. 인코딩 변환과 설정 변환은 다릅니다.

1. 구독 주소, 응답 내용, 노드 형식

‘V2Ray 구독’은 모든 클라이언트가 공통으로 구현하는 파일 표준이 아닙니다. 일반적으로 구독은 클라이언트가 요청해 여러 노드를 가져온 뒤 구독 그룹에 저장하는 HTTPS 주소를 뜻합니다. 주소에 접근 토큰이 포함될 수 있으며, 실제로 가져올 수 있는지는 서버 응답 내용과 클라이언트의 파서 지원 여부에 달려 있습니다.

입력 유형일반적인 구조포함 범위사용 경로
구독 주소HTTPS URL콘텐츠 위치 및 접근 정보구독 그룹 설정
Base64 구독인코딩된 텍스트 한 덩어리일반적으로 공유 링크가 한 줄씩 나열됨구독 업데이트 또는 해당 형식을 지원하는 가져오기 도구
공유 링크vmess://、vless://단일 노드의 연결 정보클립보드 또는 QR 코드로 가져오기
네이티브 JSONinbounds, outbounds 등의 객체인바운드, 아웃바운드 및 선택적 DNS·라우팅 설정사용자 지정 설정 메뉴 또는 해당 코어에 직접 전달

일부 구독은 일반 텍스트 링크 목록을 반환하고, 요청 매개변수나 클라이언트 식별자에 따라 형식이 달라지는 경우도 있습니다. 따라서 확장자가 JSON이거나 브라우저에 알아보기 힘든 문자열이 표시된다는 사실만으로 호환성을 판단할 수 없습니다. 주소 이름만 보지 말고 실제 응답을 확인하세요. 로그인 페이지, 만료 안내, 오류 JSON이 반환되면 다시 인코딩해도 유효한 노드가 되지 않습니다.

2. Base64 구독과 VMess의 이중 인코딩 구조

일반적인 Base64 구독은 여러 공유 링크를 줄바꿈으로 구분하고, 전체 텍스트를 UTF-8에서 Base64로 인코딩한 뒤 응답 본문으로 반환합니다. 클라이언트는 바깥쪽 인코딩을 풀고 나서 각 줄의 노드를 파싱합니다. Base64 텍스트 앞에 vmess://만 붙이면 전체 목록을 하나의 VMess 노드로 잘못 처리하게 됩니다.

  1. 응답 본문을 가져와 HTML 페이지, 권한 오류, 빈 콘텐츠가 아닌지 먼저 확인합니다.
  2. 본문이 프로토콜 접두사로 시작하는 링크를 줄마다 담고 있다면 일반 텍스트 링크 목록으로 처리합니다.
  3. 본문이 Base64라면 바깥쪽 인코딩을 풀고 결과가 인식 가능한 공유 링크인지 확인합니다.
  4. 노드를 한 줄씩 파싱합니다. vmess://가 나오면 해당 규격에 따라 내부 페이로드도 디코딩합니다.

널리 쓰이는 VMess 공유 형식은 vmess:// 뒤에 Base64로 인코딩한 JSON을 붙이는 방식입니다. 이 JSON은 공유 링크용 필드만 담고 있으며 V2Fly 또는 Xray의 전체 설정이 아닙니다. 아래는 VMess 링크를 디코딩했을 때 나오는 객체입니다. v 값인 2는 공유 형식의 버전을 나타내며 코어 버전과는 관계없습니다.

{
  "v": "2",
  "ps": "테스트 노드",
  "add": "example.com",
  "port": "443",
  "id": "0f3a10d2-7f3b-4b58-a3f6-9a6fcbec8431",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "example.com",
  "path": "/ws",
  "tls": "tls",
  "sni": "example.com"
}

예시 도메인, UUID, 경로는 구조 설명용이며 실제 연결에 사용할 수 없습니다. aid: "0"은 최신 VMess AEAD에서 흔히 사용하는 설정이므로 예전 안내를 따라 64로 바꾸지 마세요. scy는 VMess 콘텐츠 암호화 옵션이고 tls는 전송 보안 옵션으로, 서로 다른 설정입니다. 생성기마다 숫자·문자열·확장 필드를 처리하는 방식이 다를 수 있습니다.

3. VLESS 링크의 쿼리 매개변수와 전송 필드

일반적인 VLESS 공유 링크는 URI 형식에 가깝습니다. UUID는 사용자 정보 영역에, 호스트와 포트는 주소 영역에, 전송 방식·보안·경로 등은 쿼리 매개변수에 들어갑니다. 메모는 # 뒤에 붙습니다. 아래는 VLESS + WebSocket + TLS 예시 링크입니다. %2Fws를 디코딩하면 /ws가 됩니다.

vless://[email protected]:443?encryption=none&security=tls&type=ws&host=example.com&path=%2Fws&sni=example.com#VLESS-WS-TLS

VMess 공유 필드

서버
add = example.com
원격 포트
port = 443
전송 방식 및 경로
net = ws、path = /ws
콘텐츠 암호화
scy = auto
전송 보안
tls = tls、sni = example.com

이 짧은 필드는 코어 설정에 맞게 변환해야 하며, 그대로 아웃바운드 객체로 사용할 수 없습니다.

VLESS 쿼리 매개변수

서버
example.com:443
전송 방식
type=ws
요청 경로
path=%2Fws
프로토콜 암호화 필드
encryption=none
전송 보안
security=tls、sni=example.com

VLESS 자체는 콘텐츠 암호화를 제공하지 않습니다. 이 예시에서는 TLS가 전송 보안을 담당합니다.

URI 매개변수의 특수 문자는 올바르게 이스케이프해야 합니다. 예를 들어 경로에 &가 있다면 %26으로 인코딩해야 합니다. 그렇지 않으면 다음 매개변수의 구분자로 처리됩니다. IPv6 호스트는 대괄호로 감싸야 합니다. 메모에 한글이 있다면 퍼센트 인코딩을 사용해야 클라이언트 간 전달이 원활합니다. 메모만 바꾸면 대개 연결에는 영향이 없지만 경로, SNI, Host를 바꾸면 실제 핸드셰이크에 영향을 줍니다.

4. 네이티브 JSON을 구독으로 바로 쓸 수 없는 이유

네이티브 설정은 코어를 실행하기 위한 것입니다. 여러 인바운드·아웃바운드와 DNS, 라우팅, 로그 설정을 포함할 수 있습니다. 아래는 구조를 설명하기 위한 VMess 설정입니다. 로컬 SOCKS 인바운드는 127.0.0.1:10808에서 대기하고, 원격 아웃바운드는 example.com:443에 연결합니다. 10808은 예시 로컬 포트이며 구독 주소의 포트가 아니고 모든 클라이언트가 고정으로 사용하는 값도 아닙니다.

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "local-socks",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "example.com",
            "port": 443,
            "users": [
              {
                "id": "0f3a10d2-7f3b-4b58-a3f6-9a6fcbec8431",
                "alterId": 0,
                "security": "auto"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "serverName": "example.com"
        },
        "wsSettings": {
          "path": "/ws",
          "headers": {
            "Host": "example.com"
          }
        }
      }
    }
  ]
}

여기서 settings.vnext에는 VMess 서버 정보가, streamSettings에는 전송 및 보안 정보가 들어갑니다. VLESS는 프로토콜 설정 구조가 다르므로 protocol을 vmess에서 vless로 바꾸는 것만으로는 충분하지 않습니다. Xray와 V2Fly는 설정 문법이 일부 겹치지만 확장 기능과 필드의 변화 양상은 다릅니다. JSON 문법이 올바르다고 해서 대상 코어에서 실행된다는 뜻은 아닙니다.

변환 범위: 노드 이전과 전체 설정 이전

노드만 이전
  • 프록시 아웃바운드에서 서버, 포트, UUID를 추출합니다.
  • WebSocket 경로와 Host, TLS의 SNI를 유지합니다.
  • 대상 클라이언트가 지원하는 공유 링크를 생성합니다.
  • DNS, 라우팅, 로컬 수신 포트는 대상 클라이언트에서 설정합니다.
전체 설정 이전
  • 아웃바운드 태그와 라우팅 참조 관계를 유지합니다.
  • DNS, 인바운드 수신 설정, 로그 설정을 확인합니다.
  • 대상 코어에서 지원하는 모든 필드를 확인합니다.
  • 사용자 지정 설정 메뉴를 사용하고 실제 실행 로그를 확인합니다.

일반 노드 공유 링크에는 전체 DNS 및 라우팅 규칙이 담기지 않습니다. 전체 설정을 링크로 바꿨다가 다시 가져오면 대부분 원본을 완벽하게 복원할 수 없습니다.

5. v2rayN, v2rayNG, v2flyNG의 가져오기 지원 범위

클라이언트는 구독을 파싱하고 노드를 관리하며, 코어는 실제 연결을 담당합니다. v2rayN은 지원되는 코어를 선택해 사용할 수 있는 데스크톱 클라이언트입니다. v2rayNG는 Xray 코어를 사용하는 안드로이드 클라이언트이고, v2flyNG는 V2Fly 코어를 사용하는 안드로이드 클라이언트입니다. 세 앱 모두 VMess 링크를 파싱한다고 해서 모든 VLESS·REALITY 링크나 전체 JSON 설정을 똑같이 지원하는 것은 아닙니다.

클라이언트일반적인 입력네이티브 설정 처리주요 확인 사항
v2rayN구독 주소 및 지원되는 노드 공유 링크사용자 지정 설정 메뉴에서 코어를 맞춰 사용가져오기 도구와 선택한 코어가 노드 필드를 모두 지원하는지
v2rayNG구독 주소, 클립보드 및 QR 코드로 가져오는 노드해당 버전에서 제공하는 사용자 지정 설정 기능 사용Xray 버전과 전송·보안 매개변수가 모두 갖춰졌는지
v2flyNG구독 주소 및 지원되는 노드 공유 링크현재 버전의 메뉴에서 V2Fly 설정 처리Xray 전용 설정을 V2Fly에 그대로 전달하지 않기

아래 단계는 v2rayN 7.x 중국어 인터페이스에서 흔히 쓰이는 메뉴를 기준으로 합니다. 세부 버전에 따라 메뉴 이름이 달라질 수 있습니다. 먼저 입력이 구독 주소인지 노드 텍스트인지 확인한 뒤 알맞은 메뉴를 선택하세요. 같은 가져오기 버튼을 계속 눌러 보는 것보다 효과적입니다.

  1. 입력 형식 확인

    HTTPS 구독 주소는 구독 그룹 메뉴에서, vmess:// 또는 vless://로 시작하는 텍스트는 노드 가져오기 메뉴에서 처리합니다. inbounds와 outbounds를 포함한 JSON은 전체 설정으로 취급해야 합니다.

  2. 구독 추가

    ‘구독 그룹’ → ‘구독 그룹 설정’에서 그룹을 추가하고 이름과 구독 주소를 입력합니다. 저장한 다음 ‘구독 그룹’ 메뉴에서 업데이트하세요. 네트워크 연결 상태에 따라 프록시를 사용하거나 사용하지 않는 업데이트 방식을 선택합니다.

  3. 단일 노드 가져오기

    전체 링크를 복사한 다음 ‘서버’ → ‘클립보드에서 URL 일괄 가져오기’에서 가져옵니다. 링크가 여러 개라면 한 줄에 하나씩 입력합니다. v2rayNG에서는 메인 화면의 ‘+’ → ‘클립보드에서 가져오기’를 선택하면 됩니다.

  4. 필드 확인

    노드 편집 창을 열어 서버, 원격 포트 443, UUID, 전송 방식, 경로, Host, SNI를 비교합니다. REALITY 노드는 노드 이름만 보지 말고 공개 키, short ID, 지문, Flow도 확인해야 합니다.

  5. 연결 확인

    노드를 선택해 테스트한 뒤 로그를 확인합니다. 지원하지 않는 프로토콜이나 필드가 표시되면 코어를 확인하고, 주소·인증서·핸드셰이크 오류가 표시되면 노드 설정을 확인합니다. 마지막으로 필요한 시스템 프록시나 TUN 모드를 활성화합니다.

6. 형식 간 변환: 업데이트 유지 또는 스냅샷 내보내기

공유 링크를 Base64 구독으로 바꾸는 것은 링크를 나열해 인코딩하는 작업이고, Base64 구독을 공유 링크로 바꾸는 것은 디코딩한 뒤 줄 단위로 나누는 작업입니다. 두 방법 모두 겉포장만 바꾸며 VMess를 VLESS로 바꾸거나 서버 매개변수를 자동으로 채우지는 않습니다. 구독 제공자가 노드를 바꿔도 로컬에 내보낸 파일은 업데이트되지 않습니다.

기존 구독 주소 유지

권장

대상 클라이언트가 기존 구독 형식을 지원한다면 구독 그룹에 바로 추가하세요. 서버에서 관리하는 노드 목록을 계속 받아 매번 파일을 복사할 필요가 없습니다. 두 클라이언트의 업데이트 시점이 다르면 목록이 잠시 다를 수 있습니다.

추천 용도: 일상적인 사용, 데스크톱과 안드로이드에서 같은 노드 소스 사용

공유 링크 스냅샷 내보내기

노드 몇 개만 옮길 때는 클라이언트의 공유 또는 내보내기 기능을 사용한 뒤 대상 기기에서 가져옵니다. 내보낸 후 전송 및 보안 필드를 하나씩 확인하세요. 인식되지 않는 확장 매개변수는 다시 내보낼 때 사라질 수 있습니다.

추천 용도: 단일 노드 이전, 특정 링크 파싱 문제 확인

네이티브 JSON 이전

라우팅, DNS, 여러 아웃바운드를 유지해야 한다면 먼저 공유 링크로 바꾸지 말고 전체 설정이 대상 코어와 호환되는지 확인하세요. 로컬 포트가 클라이언트의 기존 수신 포트와 충돌하지 않는지도 점검해야 합니다.

추천 용도: 전체 설정을 보유하고 코어 실행 세부 사항을 직접 관리할 때

로컬 인코딩 예제: 먼저 UTF-8 바이트 처리하기

아래는 일반 Base64의 인코딩·디코딩 과정을 이해하기 위한 네이티브 JavaScript 함수입니다. 네트워크 요청을 보내지 않으며 노드를 파싱하거나 네이티브 설정을 생성하지도 않습니다. 유효성을 확인한 링크 목록을 입력하세요. 운영 환경의 구독 내용을 낯선 웹사이트 콘솔에 붙여넣지 마세요.

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

function decodeList(encoded) {
  let normalized = encoded.trim()
    .replace(/\s+/g, "")
    .replace(/-/g, "+")
    .replace(/_/g, "/");
  normalized += "=".repeat((4 - normalized.length % 4) % 4);
  const binary = atob(normalized);
  const bytes = Uint8Array.from(binary, char =>
    char.charCodeAt(0)
  );
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

7. 형식 변환 및 구독 가져오기 FAQ

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

먼저 로컬에서 응답의 시작 부분을 확인하세요. HTML, 만료 안내, 오류 객체가 표시되면 구독 권한을 확인합니다. Base64라면 디코딩한 뒤 각 줄에 프로토콜 링크가 있는지 확인하세요. 전체 JSON이 반환된다면 호환되는 사용자 지정 설정 메뉴를 사용하거나 해당 클라이언트가 지원하는 구독 형식을 제공업체에 요청하세요.

JSON을 인코딩했는데도 가져올 수 없는 이유는 무엇인가요?

Base64는 내부 구조를 바꾸지 않습니다. outbounds를 포함한 설정 객체는 인코딩해도 여전히 설정 객체이며 링크 목록으로 바뀌지 않습니다. 먼저 프록시 아웃바운드에서 서버·사용자·전송·보안 필드를 추출하고, 해당 필드를 지원하는 도구나 클라이언트로 공유 링크를 내보내세요.

가져오기는 성공했는데 연결되지 않는 이유는 무엇인가요?

가져오기에 성공했다는 것은 파서가 텍스트를 읽었다는 뜻일 뿐입니다. 노드 편집 창에서 원격 포트, UUID, WebSocket 경로, SNI를 확인하고 로그에 인증서·핸드셰이크·지원되지 않는 필드 오류가 있는지 살펴보세요. 로컬 SOCKS 포트인 10808을 원격 서버 포트에 입력하지 마세요.

기기를 바꾼 뒤 기존 라우팅 규칙은 어디에서 찾을 수 있나요?

일반 노드 링크에는 보통 노드 연결 정보만 포함됩니다. 대상 클라이언트의 라우팅 설정에서 규칙을 다시 구성하거나 호환되는 전체 사용자 지정 설정을 이전하세요. 아웃바운드 태그와 라우팅 참조가 일치하는지 확인해야 합니다. 서버 주소와 UUID만 옮겨서는 전체 라우팅 규칙을 복원할 수 없습니다.

구독 주소를 다른 사람에게 보냈는데 메모를 바꾸면 괜찮을까요?

노드 메모를 바꿔도 접근 권한은 취소되지 않습니다. 구독 제공업체의 관리 메뉴에서 구독 토큰이나 주소를 재설정한 다음 클라이언트의 구독 그룹에서 기존 주소를 새 주소로 바꾸고 업데이트하세요. 노드 인증 정보까지 노출됐다면 서버 관리자에게 해당 정보도 변경해 달라고 요청해야 합니다.

마지막으로 세 단계에 따라 확인하세요. 먼저 응답 내용을 확인하고, 다음으로 클라이언트가 파싱할 수 있는지 살핀 뒤, 마지막으로 코어가 연결할 수 있는지 점검합니다. 클라이언트 버전, 선택한 코어, 노드 전송 방식, 오류 로그를 기록하면 Base64 인코딩을 반복하는 것보다 문제를 쉽게 찾을 수 있습니다. 기본 설정은 빠른 시작 가이드를, 프로토콜 및 보안 필드는 프로토콜 상세 안내를 참고하세요.

v2rayN 다운로드