구독 URL은 설정을 가져오는 경로이고, Base64는 텍스트 인코딩 방식이며, 공유 링크는 개별 노드를 나타냅니다. 네이티브 JSON은 코어의 전체 실행 설정을 담을 수 있습니다. ‘구독 파싱 실패’, ‘JSON 가져오기 실패’ 문제를 해결하거나 노드를 이전하려는 사용자를 위해 실제 응답 확인부터 필드 분석, 로컬 변환과 연결 점검까지 설명합니다.
1. 구독 URL, Base64, JSON은 서로 다른 개념입니다
클라이언트에 입력하는 구독 주소는 보통 HTTPS URL입니다. 클라이언트가 주소에 접속해야 노드 목록이나 설정 내용을 받아옵니다. URL 끝에 .json이 있는지로 형식을 판단할 수는 없습니다. 같은 API도 요청 매개변수나 클라이언트 식별 정보에 따라 다른 내용을 반환할 수 있습니다. 문제를 확인할 때는 파일명이 아니라 실제 응답을 살펴보세요.
일반적인 Base64 구독은 여러 공유 링크를 줄마다 나열한 뒤 전체 UTF-8 텍스트를 Base64로 인코딩합니다. 노드 프로토콜을 바꾸는 것도, 내용을 보호하는 것도 아닙니다. 내용을 확보한 사람은 서버 주소와 인증 정보를 복원할 수 있으므로 구독 URL 자체를 자격 증명처럼 안전하게 보관해야 합니다.
클라이언트 호환 링크 목록 구독
권장여러 노드를 관리할 때 적합합니다. 내용은 평문 링크 목록일 수도 있고, 바깥에 Base64 인코딩이 한 겹 더 적용될 수도 있습니다. 클라이언트가 파싱하면 노드 항목이 생성됩니다.
추천 용도: 노드 정기 업데이트, 여러 기기에 각각 가져오기
단일 vmess:// 또는 vless:// 링크
하나의 연결 설정을 나타내므로 임시 공유나 개별 항목 점검에 적합합니다. 일반적으로 DNS, 인바운드, 라우팅 규칙 전체를 포함하지 않으며 이후 변경 사항을 자동으로 가져오지도 않습니다.
추천 용도: 수동 가져오기, 노드 필드 비교, 단일 노드 이전
코어 네이티브 JSON 설정
inbounds, outbounds, routing, dns를 포함할 수 있습니다. 대상 코어와 버전이 해당 필드를 지원하는지 확인해야 하며, 일반 노드 구독처럼 가져오면 안 됩니다.
추천 용도: 고정 배포, 사용자 지정 라우팅, 전체 실행 설정 보존
판단 순서: 먼저 내용을 확인한 다음 가져오기 방법을 선택하세요
디코딩 후 줄마다 공유 링크가 나오면 노드 또는 구독 가져오기를 사용하세요. inbounds와 outbounds가 포함된 객체라면 사용자 지정 설정으로 확인해야 합니다. 둘 다 JSON이 나온다는 이유만으로 같은 가져오기 메뉴를 사용하지 마세요.
2. vmess://: 바깥쪽 Base64와 안쪽 노드 JSON
일반적인 VMess 공유 링크는 vmess:// 뒤에 Base64 문자열이 붙습니다. 이를 디코딩하면 노드 설명 객체가 나옵니다. 아래는 디코딩한 예시입니다. 도메인과 UUID는 구조 설명용이므로 실제 연결에 사용할 수 없습니다. v의 값인 "2"는 공유 형식의 버전이지 코어 버전이 아닙니다.
{
"v": "2",
"ps": "예시 VMess WS",
"add": "node.example.net",
"port": "443",
"id": "e7c3a416-5c9e-4f2b-9d81-73d14a9b8620",
"aid": "0",
"scy": "auto",
"net": "ws",
"type": "none",
"host": "node.example.net",
"path": "/gateway",
"tls": "tls",
"sni": "node.example.net"
}
| 필드 | 의미 | 확인할 점 |
|---|---|---|
add / port | 서버 주소 및 포트 | 예시 포트는 443입니다. 전체 HTTPS URL을 주소 입력란에 넣으면 안 됩니다. |
id | 사용자 UUID | 서버 설정과 일치해야 합니다. 앞뒤 공백에 주의하세요. |
aid | 구형 alterId 매개변수 | 최근 배포 환경에서는 보통 0을 사용합니다. 문제 해결을 위해 임의로 구형 값으로 바꾸지 마세요. |
scy | VMess 콘텐츠 암호화 옵션 | auto는 외부 TLS와 다릅니다. 두 설정은 서로 다른 계층에 적용됩니다. |
net / path | 전송 방식 및 경로 | 전송 방식은 WebSocket입니다. /gateway 경로는 서버 설정과 일치해야 합니다. |
host / sni | WebSocket Host 및 TLS 서버 이름 | 용도가 서로 다릅니다. 예시에서 값이 같더라도 임의로 바꿔 쓰면 안 됩니다. |
ps | 표시 이름 | 표시 이름을 바꿔도 인증 실패나 핸드셰이크 오류는 해결되지 않습니다. |
여기 있는 JSON은 코어에서 바로 실행할 수 있는 설정이 아닙니다. 전체 outbounds 계층이 없고, 필드 이름도 공유 형식에 맞춰 축약되어 있습니다. 네이티브 설정으로 변환하려면 add를 서버 주소에 매핑하고, 사용자 정보를 해당 프로토콜의 사용자 배열에 넣은 뒤 전송 방식과 TLS 설정을 각각 구성해야 합니다.
3. vless://: UUID, 쿼리 매개변수, 표시 이름 구분하기
VLESS 공유 링크는 일반적으로 전체 JSON을 Base64로 감싸지 않고 URI 형식을 사용합니다. 아래는 VLESS over TCP + TLS 교육용 예시입니다. REALITY를 사용하지 않으며 Vision 흐름 제어도 설정하지 않았습니다.
vless://[email protected]:443?encryption=none&security=tls&type=tcp&sni=node.example.net#VLESS%20TLS%20Example
vless://뒤에서@앞까지가 UUID이고,@뒤에는 서버 주소와 포트가 옵니다. URI에 IPv6 주소를 넣을 때는 대괄호로 감싸야 합니다.encryption=none은 VLESS 자체가 이 계층에서 콘텐츠를 암호화하지 않는다는 뜻입니다. 이 예시에서는security=tls를 사용해 TLS로 연결을 보호합니다.type=tcp는 전송 유형을 지정하고,sni는 TLS 서버 이름을 지정합니다. 클라이언트와 코어 버전에 따라 전송 유형의 표시 방식이 다를 수 있습니다.#뒤에는 표시 이름이 오며,%20은 공백을 뜻합니다. 표시 이름은 서버 인증에 사용되지 않습니다.flow=xtls-rprx-vision은 서버, 전송 방식 조합, 코어가 모두 지원할 때만 사용할 수 있습니다. 모든 VLESS 링크에 추가해야 하는 매개변수는 아닙니다.
REALITY 노드라면 링크의 security=reality, pbk, sid, fp, sni를 각각 확인하세요. 이 매개변수는 UUID나 서버 주소만으로 알아낼 수 없으며, ‘VMess를 VLESS로 변환’한다고 자동으로 채워지지도 않습니다. 클라이언트가 최종 생성하는 코어 필드는 해당 버전을 기준으로 확인해야 합니다.
변환의 한계: 재인코딩은 프로토콜 변경이 아닙니다
기존 공유 링크를 Base64 구독으로 묶거나 확인된 매개변수를 JSON으로 정리할 수는 있습니다. 하지만 접두사를 vmess에서 vless로 바꾼다고 서버가 VLESS를 사용하게 되는 것은 아닙니다. 프로토콜을 바꾸려면 서버에서 해당 프로토콜에 맞는 인바운드와 인증 정보를 제공해야 합니다.
4. 로컬에서 Base64 구독 디코딩 및 재인코딩하기
구독에는 액세스 토큰과 유효한 UUID가 포함될 수 있습니다. 실제 내용을 다룰 때는 로컬 텍스트 도구나 빈 페이지에서 실행하는 브라우저 개발자 도구를 우선 사용하고, 출처가 불분명한 변환 사이트에 업로드하지 마세요. 아래 함수는 전달한 문자열만 변환하며 네트워크 요청을 보내지 않습니다. 구독 URL을 붙여 넣을 필요도 없습니다.
function decodeBase64Utf8(input) {
let text = input.trim().replace(/\s+/g, "")
.replace(/-/g, "+").replace(/_/g, "/");
text += "=".repeat((4 - text.length % 4) % 4);
const bytes = Uint8Array.from(atob(text), ch => ch.charCodeAt(0));
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}
function encodeBase64Utf8(input) {
const bytes = new TextEncoder().encode(input);
let binary = "";
for (const byte of bytes) binary += String.fromCharCode(byte);
return btoa(binary);
}
const demoLink =
"vless://[email protected]:443" +
"?encryption=none&security=tls&type=tcp&sni=node.example.net#Example";
const subscription = encodeBase64Utf8(demoLink + "\n");
console.log(subscription);
console.log(decodeBase64Utf8(subscription));
이 코드는 일반적인 Base64URL 문자 치환을 지원하며 끝에 필요한 패딩을 채웁니다. 중국어 표시 이름도 올바르게 처리하도록 UTF-8 변환을 사용합니다. 중국어에 btoa()를 직접 적용하면 오류가 날 수 있습니다. 실행 전에 코드를 이해하고, 실제 자격 증명을 공용 기기의 콘솔 기록에 남기지 마세요.
- 구독 응답 본문을 받으면 먼저
vmess://또는vless://로 시작하는지 확인하세요. 이미 평문 링크라면 바깥쪽을 다시 디코딩할 필요가 없습니다. - 내용이 Base64라면 한 번 디코딩한 뒤 줄바꿈을 기준으로 나누세요. 빈 줄은 제거하되 URI 안의 유효한 문자나 대소문자를 구분하는 경로는 바꾸지 마세요.
- 각
vmess://링크에서 접두사를 제거한 뒤 디코딩 함수를 개별적으로 호출하고,JSON.parse()로 객체 구조를 확인하세요. - 목록 구독으로 다시 만들려면 완전한 공유 링크를 줄바꿈으로 연결한 다음 인코딩 함수를 호출하세요. 화면에 표시되는 노드 이름은 인코딩하지 마세요.
응답이 <!DOCTYPE html>로 시작하면 로그인 상태, 만료된 주소 여부, API가 오류 페이지를 반환했는지부터 확인하세요. 디코딩 결과가 올바른 JSON이더라도 오류 메시지인지, 노드 배열인지, 전체 코어 설정인지 추가로 살펴봐야 합니다. Base64 디코딩에 성공했다는 것은 인코딩을 되돌릴 수 있다는 뜻일 뿐, 연결할 수 있다는 뜻은 아닙니다.
5. 공유 링크를 Xray 네이티브 JSON으로 정리하기
앞서 본 VLESS TLS 예시를 최소 실행 설정으로 정리해 계층 구조를 살펴보겠습니다. 로컬 127.0.0.1:10808을 SOCKS 인바운드로 사용하고, 예시 도메인의 443 포트로 연결합니다. 이 주소에서는 실제 서비스를 이용할 수 없으므로 필드 비교용으로만 사용하세요. 실제 실행 전에는 서버에서 제공한 매개변수로 바꿔야 합니다.
{
"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": "vless",
"settings": {
"vnext": [
{
"address": "node.example.net",
"port": 443,
"users": [
{
"id": "e7c3a416-5c9e-4f2b-9d81-73d14a9b8620",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"serverName": "node.example.net",
"allowInsecure": false
}
}
}
]
}
이 예시에는 routing을 따로 작성하지 않아 첫 번째 아웃바운드가 기본으로 요청을 처리합니다. 분할 라우팅 규칙이나 시스템 프록시 설정도 포함되어 있지 않습니다. SOCKS 포트를 열어도 시스템의 모든 앱이 자동으로 이를 사용하는 것은 아닙니다. 데스크톱 클라이언트가 이미 10808을 사용 중이라면 중복 실행을 중단하거나 포트를 변경하세요.
변환 방법: 노드 이전과 전체 설정 이전 구분하기
노드 이전: 공유 링크 또는 목록 구독
- 주소, 포트, UUID, 전송 방식, 보안 매개변수를 유지합니다.
- 클라이언트가 로컬 인바운드와 실행 설정을 생성합니다.
- 대상 클라이언트에서 DNS와 routing을 따로 확인합니다.
전체 배포: 네이티브 JSON
- inbounds의 리슨 주소와 포트 사용 여부를 확인합니다.
- 아웃바운드 태그, 라우팅 참조, 외부 파일 의존성을 확인합니다.
- 해당 코어로 설정을 검증한 다음 실행을 테스트합니다.
전체 JSON에서 공유 링크를 내보내면 DNS, 라우팅, 여러 아웃바운드 선택, 로컬 리슨 설정은 보통 링크에 함께 보존되지 않습니다.
‘네이티브 JSON’이라고 해서 모든 코어에서 사용할 수 있는 것은 아닙니다. Xray와 V2Fly는 일부 설정 구조를 공유하지만 프로토콜 기능과 필드 변경 사항이 완전히 일치하지는 않습니다. 예를 들어 REALITY가 포함된 Xray 설정은 파일 이름만 바꿔 V2Fly에서 사용할 수 없습니다. 변환 도구는 입력 형식, 출력 코어, 지원하는 매개변수 범위를 명확히 해야 합니다.
6. v2rayN 가져오기: 구독 URL과 클립보드 링크는 별도로 처리
아래 내용은 v2rayN 7.x 중국어 인터페이스의 일반적인 메뉴를 기준으로 합니다. 세부 버전에 따라 메뉴 이름의 문장 부호나 위치가 다를 수 있습니다. 먼저 입력할 내용이 HTTPS 구독 URL인지, 단일 공유 링크인지, 전체 설정 파일인지 확인한 뒤 가져오기 메뉴를 선택하세요. 웹 주소를 노드 가져오기 창에 붙여 넣으면 ‘유효한 내용이 없습니다’와 같은 오류가 흔히 발생합니다.
- 구독 URL 추가:「구독 그룹」→「구독 그룹 설정」을 열고 새 그룹을 만듭니다. 이름과 제공업체가 안내한 구독 URL을 입력하고 저장한 뒤 해당 그룹을 선택하세요.
- 노드 목록 가져오기:「구독 그룹」메뉴에서 현재 구독 업데이트를 선택하세요. 직접 연결할 수 있다면 프록시를 사용하지 않는 업데이트를 먼저 시도하고, 직접 연결이 시간 초과되지만 기존 프록시를 사용할 수 있다면 프록시를 통한 업데이트를 선택하세요.
- 단일 링크 가져오기: 완전한
vmess://또는vless://링크를 복사한 뒤 「서버」→「클립보드에서 URL 일괄 가져오기」를 사용하세요. 링크가 여러 개라면 한 줄에 하나씩 넣고 각 링크 전체를 유지해야 합니다. - 전체 설정 가져오기: 서버 메뉴에서 사용자 지정 설정 가져오기 항목을 찾아 로컬 JSON 파일을 선택하고 사용할 코어를 지정하세요. 설정이 일반 노드처럼 자동 분리되어 항목별로 편집될 것이라고 기대하지 마세요.
- 실제 실행 확인: 노드를 활성화하고 다시 불러온 뒤 로그에서 설정 파싱 오류, 포트 충돌, TLS 핸드셰이크 오류를 확인하세요. 그런 다음 실제 웹 요청을 보내 봅니다.
수동으로 가져온 노드는 대개 현재 시점의 스냅샷입니다. 제공업체가 나중에 주소나 UUID를 바꿔도 복사해 둔 링크는 자동으로 갱신되지 않습니다. 반면 구독을 업데이트하면 해당 그룹의 노드가 덮어써질 수 있습니다. 수동 변경을 오래 보관하려면 구독 항목과 섞이지 않도록 별도 그룹을 사용하세요.
7. 구독 파싱 및 형식 변환 관련 자주 묻는 질문
Base64 디코딩은 되는데 v2rayN에서 가져오기에 실패하는 이유는 무엇인가요?
먼저 디코딩 결과가 실제로 줄마다 공유 링크인지 확인하세요. HTML, 오류 메시지, 네이티브 설정 객체라면 알맞은 가져오기 메뉴를 사용해야 합니다. 링크 목록이라면 한 개만 먼저 가져오고 접두사, 줄바꿈, UUID를 확인해 문제 범위를 좁히세요.
JSON 파일을 구했는데 구독으로 바로 다시 인코딩할 수 있나요?
인코딩만으로 형식을 변환할 수는 없습니다. 파일이 전체 코어 설정이라면 먼저 아웃바운드 하나를 선택한 뒤 공유 형식에 맞춰 프로토콜, 서버, 사용자, 전송 매개변수를 추출하고 링크를 만들어야 합니다. 파일 전체를 Base64로 인코딩해도 클라이언트가 기대하는 노드 목록이 되는 경우는 거의 없습니다.
구독 업데이트가 시간 초과되면 구독 형식이 잘못된 건가요?
시간 초과는 우선 구독을 가져오는 단계의 문제입니다. 구독 URL이 완전한지, 도메인 이름이 확인되는지, 현재 네트워크에서 접속할 수 있는지 점검하세요. 사용 가능한 노드가 이미 있다면 프록시를 통한 업데이트도 시도해 볼 수 있습니다. 응답을 받은 뒤 파싱 오류가 발생할 때 Base64와 노드 형식을 확인하면 됩니다.
가져오기는 성공했지만 웹 페이지가 열리지 않습니다. 어떤 매개변수를 바꿔야 하나요?
먼저 활성 노드와 시스템 프록시 상태를 확인한 다음 로그를 살펴보세요. 연결이 거부되면 주소와 443 등 서버 포트를 우선 확인하고, TLS 오류라면 SNI, 인증서, 시스템 시간을 확인하세요. 인증 실패는 UUID를 확인해야 합니다. 인증서 검증을 건너뛰는 설정으로 올바른 TLS 설정을 대신하지 마세요.
중국어 표시 이름이 깨져 보이면 노드 연결에도 문제가 생기나요?
표시 이름은 보통 연결에 영향을 주지 않습니다. 다만 글자가 깨졌다면 변환 과정에서 UTF-8이 올바르게 처리되지 않았을 수 있습니다. VMess JSON은 UTF-8로 만든 뒤 Base64로 인코딩하고, VLESS의 표시 이름과 쿼리 매개변수는 URI 규칙에 따라 인코딩해야 합니다. 콜론, 물음표, 구분 기호의 구조적 의미가 사라지지 않도록 링크 전체를 반복해서 인코딩하지 마세요.
변환 후에는 내용 파싱, 필드 대응, 코어 실행, 요청 처리 순서로 확인하세요. 원본 구독이나 설정을 비교용으로 보관하고 복사본만 수정하세요. 자세한 필드 구조는 설정 전체 안내에서, 프로토콜 이름과 전송 용어는 용어집에서 확인할 수 있습니다.