먼저 받은 자료가 구독 URL인지, 공유 링크 목록인지, 전체 코어 설정 파일인지 확인한 뒤 알맞은 메뉴로 가져오세요. 디코딩했는데 왜 링크가 보이는지, JSON을 왜 구독으로 바로 쓸 수 없는지 궁금한 분들을 위해 v2rayN의 구독 그룹과 클립보드 가져오기를 설명합니다. Base64 인코딩·디코딩, 노드 내보내기, JSON 변환의 범위와 로컬 처리 및 오류 해결 방법도 안내합니다.
세 가지 형식의 차이: 구독은 배포, JSON은 실행
먼저 ‘가져오는 주소’와 ‘응답 내용’을 구분해야 합니다. 구독 주소는 보통 접근 토큰이 포함된 HTTPS URL이며, 클라이언트가 접속해야 노드 데이터를 가져올 수 있습니다. Base64는 흔히 구독 응답 본문을 표현하는 형식일 뿐, 프록시 프로토콜도 아니고 모든 구독이 같은 방식으로 인코딩된다는 뜻도 아닙니다. 구독 주소 자체를 Base64로 디코딩해도 보통 노드 정보는 나오지 않습니다.
| 구분 | 일반적인 구조 | 가져오기 용도 |
|---|---|---|
| Base64로 인코딩된 구독 본문 | 공유 링크 여러 개를 줄바꿈으로 나열한 뒤 전체를 인코딩 | 구독 업데이트로 노드 여러 개 가져오기 |
| 공유 링크 | vmess:// 또는 vless:// 등의 프로토콜 접두어 | 클립보드에서 노드 정보 가져오기 |
| JSON 설정 파일 | inbounds, outbounds, routing 등의 필드 | 해당 설정을 지원하는 코어에서 실행 |
공유 링크는 주소, 포트, 인증 정보, 전송 방식, TLS 설정 등 원격 연결 하나에 필요한 정보를 주로 담습니다. 전체 JSON 설정에는 로컬 리스너, DNS, 라우팅 규칙, 여러 아웃바운드도 포함될 수 있습니다. 따라서 노드를 공유 링크로 내보낼 수 있다고 해서 전체 실행 설정까지 링크 하나에 담을 수 있는 것은 아닙니다.
Base64 디코딩: 바깥 형식을 풀고 프로토콜 확인하기
기존 Base64 구독은 두 겹으로 이루어졌다고 보면 됩니다. 링크 목록 전체를 바깥에서 인코딩하고, 안쪽의 각 줄은 각자 공유 형식을 따릅니다. 바깥 인코딩을 풀었을 때 vmess://가 나오는 것은 정상입니다. 모든 링크에 같은 디코딩 방식을 적용하지 마세요.
- VMess 공유 형식:
vmess://뒤에는 Base64로 인코딩된 JSON이 오며, 흔히add,port,id,net,tls필드가 포함됩니다. - VLESS 공유 형식:
vless://뒤에는 URI가 이어집니다. 인증 정보, 호스트, 포트는 본문에 있고 전송 설정은 쿼리 문자열에 들어갑니다. JSON 전체를 Base64로 인코딩한 형식이 아닙니다. - 이름과 문자 인코딩: 한글 메모를 올바르게 처리하려면 UTF-8을 사용해야 합니다. URI의 퍼센트 인코딩과 Base64는 서로 다른 규칙입니다.
- 인코딩 변형: 일부 데이터는 URL 안전 문자
-,_를 사용하거나 끝의=를 생략합니다. 디코딩 전에 입력 형식을 정규화해야 합니다.
아래 JavaScript는 로컬에서 UTF-8 문자열을 인코딩하고 디코딩하는 방법만 보여 줍니다. 노드를 입력하면 6IqC54K5로 인코딩됩니다. 이는 문자 인코딩 테스트용이며 실제 접속 가능한 노드가 아닙니다. 실제 구독 데이터를 처리할 때는 신뢰할 수 있는 로컬 환경에서만 작업하고, 토큰이 포함된 내용을 온라인 변환 서비스에 입력하지 마세요.
function decodeBase64Utf8(input) {
let value = input.trim().replace(/\s+/g, "")
.replace(/-/g, "+").replace(/_/g, "/");
value = value.padEnd(Math.ceil(value.length / 4) * 4, "=");
const bytes = Uint8Array.from(atob(value), char => char.charCodeAt(0));
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}
function encodeBase64Utf8(text) {
const bytes = new TextEncoder().encode(text);
let binary = "";
for (const byte of bytes) binary += String.fromCharCode(byte);
return btoa(binary);
}
console.log(encodeBase64Utf8("노드")); // 6IqC54K5
console.log(decodeBase64Utf8("6IqC54K5")); // 노드
디코딩에 성공했다는 것은 인코딩된 내용을 읽을 수 있다는 뜻일 뿐입니다. 결과가 로그인 페이지, 만료 안내 또는 다른 HTML이라면 유효한 노드 목록을 가져온 것이 아닙니다. 계속 인코딩하거나 확장자를 바꿔도 구독은 복구되지 않습니다. 구독 주소와 접근 권한을 다시 확인하세요.
v2rayN에서 가져오기: 구독 주소와 클립보드 구분하기
노드를 계속 업데이트하려면 구독 그룹을 추가하고, 공유 링크를 한두 개만 받았다면 클립보드 가져오기를 사용하세요. 아래는 v2rayN 중국어 인터페이스의 메뉴 이름을 기준으로 설명합니다. 데스크톱 버전에 따라 버튼 위치와 괄호·띄어쓰기가 다를 수 있으니 실제 메뉴를 확인하세요.
입력 내용 확인
HTTPS 주소는 구독 그룹에 등록하고,
vmess://또는vless://로 시작하는 내용은 노드로 가져옵니다. 전체 JSON을 구독 주소 입력란에 붙여 넣지 마세요.구독 그룹 추가
‘구독 그룹’ → ‘구독 그룹 설정’을 열고 새 그룹을 추가한 뒤, 이름과 구독 주소를 입력하고 저장하세요. 주소의 쿼리 매개변수와 접근 토큰은 모두 그대로 보존해야 합니다.
구독 업데이트
‘구독 그룹’ 메뉴에서 ‘모든 구독 업데이트(프록시 미사용)’를 선택하세요. 직접 연결에 실패하고 사용할 수 있는 프록시 연결이 있다면 ‘모든 구독 업데이트(프록시 사용)’를 시도한 뒤 업데이트 로그를 확인하세요.
공유 링크 가져오기
공유 링크는 전체 텍스트를 복사한 다음 ‘서버’ → ‘클립보드에서 일괄 URL 가져오기’를 선택하세요. 링크가 여러 개라면 한 줄에 하나씩 배치합니다. 일반적인 데스크톱 화면에서는
Ctrl+V로 클립보드에서 가져올 수도 있습니다.설정 확인
가져온 노드의 편집 창을 열고 주소, 포트, 전송 프로토콜, TLS 설정을 확인하세요. 가져오기에 성공해도 연결이 된다는 뜻은 아닙니다. 코어 로그에서 지원하지 않는 필드나 핸드셰이크 실패가 있는지 확인하세요.
Android 클라이언트에서도 가져오기 메뉴를 구분해야 합니다. v2rayNG는 Xray 코어를, v2flyNG는 v2fly 코어를 사용합니다. 같은 링크 목록을 읽을 수 있어도 두 클라이언트가 모든 전송 매개변수를 지원한다는 뜻은 아닙니다. 특히 VLESS와 REALITY 조합은 Base64 외부 형식을 계속 바꾸기보다 사용할 클라이언트와 코어의 지원 여부를 먼저 확인하세요.
공유 링크와 JSON 설정: 변환 가능한 항목과 손실되는 정보
공유 링크를 JSON으로 바꾸는 작업은 텍스트에 중괄호를 씌우는 것이 아니라 필드를 매핑하는 과정입니다. 클라이언트가 링크를 읽어 노드 항목을 만든 다음 선택한 코어에 맞춰 실행 설정을 생성합니다. 반대로 내보낼 때는 보통 특정 아웃바운드의 연결 정보만 추출할 수 있으며, DNS·라우팅·로컬 리스너 전체를 자동으로 포함할 수는 없습니다.
원본 구독 유지
권장구독 주소를 저장하고 구독 그룹으로 업데이트하면 원격 노드 변경 사항을 계속 받을 수 있습니다. 구독 토큰은 접근 인증 정보처럼 안전하게 보관하세요.
추천 대상: 여러 노드를 관리하며 계속 업데이트해야 하는 경우
공유 링크 내보내기
노드 목록에서 항목을 선택한 다음 마우스 오른쪽 버튼 메뉴의 공유 URL 내보내기 항목을 사용해 클립보드에 복사하세요. 내보낸 링크는 노드의 현재 상태만 담으며 원본 구독의 업데이트 연결은 포함하지 않습니다.
추천 대상: 소수 노드를 임시로 옮기거나 연결 필드를 확인할 경우
전체 JSON 보존
여러 아웃바운드, 라우팅 태그, DNS 설정을 보존해 해당 코어에서 읽도록 하세요. 다른 코어에서 사용하기 전에는 필드의 의미가 같은지 확인해야 합니다. 파일 이름만 바꾸는 것으로는 충분하지 않습니다.
추천 대상: 사용자 지정 라우팅이나 고정된 로컬 인바운드 설정이 필요한 경우
변환 전에 전체 설정 백업하기
노드 연결만 옮기려면 공유 링크를 내보내면 됩니다. DNS와 라우팅까지 보존하려면 JSON 설정을 별도로 저장하고, 대상 코어가 각 필드를 지원하는지 확인하세요. 링크 내보내기를 설정 백업 대신 사용하지 마세요.
아래 설정은 구조 설명을 위한 예시입니다. 127.0.0.1:10808에서 수신하는 SOCKS 인바운드와 직접 연결 아웃바운드만 포함하며, 원격 프록시 서버는 없습니다. 프록시 노드로 가져오면 안 됩니다. 이처럼 전체 JSON에는 VMess나 VLESS 링크로 변환할 대상이 아예 없을 수도 있습니다.
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "local-socks",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
}
]
}
전체 설정을 실제로 불러와야 한다면 v2rayN의 ‘서버’ → ‘사용자 지정 설정 서버 추가’와 같은 전용 메뉴를 사용하고, 화면 안내에 따라 설정 파일과 해당 코어를 선택하세요. 사용자 지정 설정의 리스닝 포트가 기존 인스턴스와 충돌할 수 있습니다. 로그에 주소가 이미 사용 중이라고 나오면 노드 인증 정보를 바꾸지 말고 충돌하는 인스턴스를 중지하거나 포트를 변경하세요.
링크 목록을 구독 본문으로 다시 인코딩하기
공유 링크를 여러 개 내보냈다면 한 줄에 링크 하나씩 배치해 텍스트를 만들고, UTF-8 텍스트 전체를 Base64로 인코딩할 수 있습니다. 이렇게 하면 기존 구독 본문 형식은 만들 수 있지만 자동 업데이트되는 구독 주소까지 생성되지는 않습니다. 해당 본문을 제공하려면 신뢰할 수 있는 HTTPS 서버가 필요합니다.
- 각 링크의 프로토콜 접두어, 쿼리 매개변수, 메모를 그대로 보존하세요. 중복처럼 보이는 TLS나 전송 필드를 임의로 삭제하지 마세요.
- 줄바꿈 문자
\n로 링크를 연결하세요. 글머리 기호, 따옴표, JSON 배열 괄호, 표 구분 기호는 넣지 마세요. - 전체 텍스트를 한 번만 인코딩하세요. 각 공유 링크를 개별적으로 인코딩한 뒤 다시 합치면 인식할 수 없는 목록이 됩니다.
- 로컬에서 한 번 디코딩해 원문이 줄 단위로 복원되는지 확인한 다음 대상 클라이언트에서 가져오기를 테스트하세요. 성공 메시지만 보지 말고 노드 개수와 주요 필드도 확인해야 합니다.
전체 JSON에서 링크를 여러 개 추출할 때는 여러 아웃바운드, 태그 참조, 전송 필드 매핑도 처리해야 합니다. 대상 공유 형식으로 표현할 수 없는 필드는 별도로 기록하세요. 변환 도구가 링크를 출력했다는 사실은 일부 직렬화가 완료되었다는 뜻일 뿐, 원래 설정과 동일하게 작동한다는 보장은 아닙니다.
가져오기 오류 해결: 내용부터 확인하고 코어 점검하기
디코딩했는데 왜 여전히 vmess://가 보이나요?
구독의 외부 인코딩이 이미 풀렸다는 뜻입니다. 링크를 줄 단위로 복사한 뒤 ‘서버’ → ‘클립보드에서 일괄 URL 가져오기’를 선택하세요. VMess 필드를 확인하려면 해당 링크 접두어 뒤의 부분만 따로 디코딩하세요. 접두어를 포함한 전체 줄을 디코딩하면 안 됩니다.
가져오기에 성공했다고 나오는데 노드가 몇 개 빠졌어요.
먼저 디코딩 결과에서 비어 있지 않은 링크 줄의 수와 실제로 가져온 노드 수를 비교한 다음, 실패한 줄의 프로토콜 접두어와 필드를 확인하세요. 중복, 형식 오류, 프로토콜 미지원 등의 이유로 일부 항목이 추가되지 않을 수 있습니다. 노드 수가 줄었다는 이유만으로 구독이 손상됐다고 판단하지 마세요.
JSON 파일은 열리는데 왜 클라이언트가 받아들이지 않나요?
JSON 파서가 읽을 수 있다는 것은 문법이 유효하다는 뜻일 뿐입니다. 최상위에 inbounds와 outbounds가 있는지 확인한 다음, 사용자 지정 설정 메뉴와 맞는 코어를 사용했는지 점검하세요. VMess 공유 데이터의 add, id 필드만으로는 전체 실행 설정을 구성할 수 없습니다.
구독 업데이트에서 403 오류가 나거나 시간이 초과되면 어떻게 해야 하나요?
403 오류는 보통 권한, 토큰 또는 서버 접근 정책을 확인해야 합니다. 시간 초과라면 네트워크 연결과 DNS 확인부터 시작하세요. 원래 주소의 모든 매개변수를 보존하고, 사용할 수 있는 노드가 있다면 ‘모든 구독 업데이트(프록시 사용)’를 시도하세요. 응답이 실제 오류 페이지라면 해당 페이지를 다시 인코딩해도 소용없습니다.
오류 해결은 순서를 지키세요. 먼저 구독 요청으로 유효한 본문을 받았는지 확인하고, 다음으로 공유 링크를 파싱할 수 있는지 확인한 뒤, 마지막으로 실행 코어와 연결 매개변수를 점검합니다. ‘다운로드 실패’, ‘형식 미지원’, ‘연결 실패’를 구분해 기록하면 잘못된 단계에서 변환을 반복하지 않을 수 있습니다.