V2Ray 구독 파싱 오류 해결: 링크 형식·Base64 인코딩·유효기간 점검

구독을 가져온 뒤 목록이 비거나 파싱 오류가 표시되나요? 링크, 인코딩, 프로토콜 호환성, 구독 유효기간을 차례로 확인해 원인을 찾아보세요.

핵심 내용

v2rayN, v2rayNG, v2flyNG에서 ‘업데이트 실패’ 또는 ‘가져온 뒤 목록이 비어 있음’ 문제가 생겼을 때 확인할 항목을 정리했습니다. 먼저 다운로드 실패와 파싱 실패를 구분하고, 링크·응답 본문·Base64·노드 필드를 점검하세요. 마지막으로 노드 하나만 가져와 범위를 좁히면 구독 문제를 코어 또는 DNS 문제로 오인하는 일을 줄일 수 있습니다.

먼저 요청 실패·파싱 실패·연결 실패를 구분하세요

구독 업데이트는 여러 단계로 진행됩니다. 클라이언트가 구독 주소에 요청을 보내고, 서버가 내용을 반환하면, 클라이언트가 형식을 인식해 노드를 생성합니다. 이후 코어가 노드 설정을 바탕으로 연결을 수립합니다. 목록이 비었다는 사실만으로는 표시할 항목을 가져오지 못했다는 것만 알 수 있으며, 서버가 오프라인이라고 단정할 수는 없습니다. 특히 ‘업데이트 성공’으로 표시됐는데 노드가 없다면 그룹 필터, 빈 응답, 전체 항목 필터링도 원인일 수 있습니다.

증상우선 확인할 항목일단 하지 말아야 할 일
시간 초과, 도메인 이름 확인 실패구독 도메인, 현재 네트워크, 업데이트 시 프록시 사용 여부노드 프로토콜을 계속 바꾸기
응답은 받았지만 형식 오류가 표시됨응답 본문, 인코딩 방식, 클라이언트에서 지원하는 형식웹페이지 본문을 노드로 가져오기
업데이트 후 목록이 비어 있음응답 내용의 유무, 그룹 및 필터, 구독 권한기존 노드를 모두 즉시 삭제하기
노드는 표시되지만 연결에 실패함노드 매개변수, 코어 지원, 보안 계층, 서버 상태계속 Base64만 확인하기

현재 설정을 먼저 백업하고 업데이트 중 표시된 전체 메시지를 기록하세요. 사용할 수 있는 노드가 있다면 재시도할 때 기존 그룹을 삭제하지 마세요. 테스트 그룹을 새로 만들면 결과를 비교하기 쉽고, 비정상 업데이트가 일상적인 사용에 영향을 주는 것도 막을 수 있습니다.

링크 확인: 구독 주소와 단일 노드 공유 링크는 다릅니다

구독 주소는 보통 https://로 시작하는 리소스 주소입니다. 단일 노드 공유 링크는 vmess://, vless:// 또는 trojan://으로 시작할 수 있습니다. 구독 주소는 구독 그룹에 추가한 뒤 업데이트해야 하며, 단일 노드 링크는 클라이언트의 공유 링크 가져오기 기능을 사용해야 합니다. 노드 링크를 구독 주소 입력란에 넣으면 클라이언트가 거부하거나 요청 단계에서 실패할 수 있습니다.

  1. 주소 다시 복사

    서비스 제공자의 구독 페이지에서 전체 주소를 다시 복사한 뒤, 로컬 텍스트 편집기에 붙여 넣어 앞뒤를 확인하세요. 실수로 포함된 따옴표, 줄바꿈, 한글 문장부호는 제거하되 쿼리 매개변수는 임의로 삭제하지 마세요.

  2. 입력 메뉴 확인

    v2rayN에서 흔히 사용하는 경로는 ‘구독 그룹’ → ‘구독 그룹 설정’ → ‘추가’입니다. 메모와 주소를 입력한 뒤 저장하세요. 버전에 따라 메뉴 이름은 조금 다를 수 있습니다. 단일 노드 편집 창이 아닌 구독 그룹 편집 메뉴를 선택해야 합니다.

  3. 구독만 업데이트

    ‘구독 그룹’으로 돌아가 ‘현재 구독 업데이트(프록시 사용 안 함)’를 한 번 실행해 보세요. 화면에 ‘현재’ 대신 ‘선택한 항목’이라고 표시된다면 방금 추가한 테스트 그룹이 선택되어 있는지 먼저 확인하세요.

  4. 결과 기록

    업데이트 시간, 표시된 메시지 원문, 노드 수의 변화를 기록하세요. Android에서는 v2rayNG의 ‘구독 그룹 설정’에서 주소를 확인한 뒤, 메인 화면 메뉴의 ‘구독 업데이트’를 실행해 테스트할 수 있습니다.

쿼리 문자열의 &, =, %는 토큰이나 매개변수일 수 있으므로 불필요해 보인다는 이유로 삭제하면 안 됩니다. 웹페이지 소스나 전달된 메시지에서 복사한 주소에 문자 그대로 &가 들어 있다면, 원래 복사 버튼에서 주소를 다시 가져오세요. HTML 이스케이프 문자열을 실제 주소로 착각하지 않도록 주의해야 합니다.

응답 내용부터 확인: HTTP 성공이 구독 유효성을 뜻하지는 않습니다

신뢰할 수 있는 로컬 환경에서 응답을 확인할 때는 상태 코드와 본문을 함께 살펴야 합니다. 브라우저에서 로그인 페이지가 열린다는 것은 웹사이트에 접속할 수 있다는 뜻일 뿐, 클라이언트가 필요로 하는 것은 인식 가능한 노드 데이터입니다. 웹페이지 인증, 로그인 리디렉션, 오류 안내가 포함된 응답은 상태 코드가 200이어도 파싱되지 않을 수 있습니다. 브라우저에는 로그인 쿠키가 있을 수도 있으므로 브라우저 접속 성공이 클라이언트 요청 성공을 의미하지는 않습니다.

200
요청에 성공해도 본문 형식 확인은 필요합니다
401
유효한 인증 정보가 없습니다
403
접근이 거부되었습니다. 권한이나 제한 사항을 확인하세요

요약: 본문을 확인한 다음 인코딩을 점검하세요

응답이 로그인 페이지, 접근 거부 메시지 또는 빈 내용이라면 다시 인코딩해도 유효한 노드를 만들 수 없습니다. 먼저 구독 접근 조건을 해결한 뒤 클라이언트에서 파싱을 테스트하세요.

Base64 점검: 인코딩 단계를 확인하고 문자를 무작정 추가하지 마세요

일반적인 구독 형식 중 하나는 여러 줄의 공유 링크 전체를 Base64로 인코딩하는 방식입니다. 공유 링크가 평문으로 반환되는 구독도 있습니다. VMess 공유 링크 자체에도 Base64로 인코딩된 JSON이 들어가는 경우가 많으므로, 구독을 한 번 디코딩한 뒤에도 vmess://가 보이는 것은 정상입니다. 디코딩 실패를 뜻하지 않습니다. 특정 형식을 지원하는지는 클라이언트의 구독 파서에 따라 달라집니다.

줄바꿈 허용 여부는 구현마다 다릅니다. 일부 구독 파서는 공백을 제거하지만, 엄격한 디코딩 기능은 그렇지 않을 수 있습니다. 먼저 원본을 저장하고 복사본으로 로컬에서 확인하세요. 노드 URI 안의 문자를 일괄 변경하거나 모든 =를 삭제하지 마세요. 복사 과정에서 내용이 잘렸다면 패딩을 추가해도 형식만 달라질 뿐 손실된 데이터를 복구할 수 없습니다.

illegal base64 data at input byte 0

원인: Go의 Base64 디코더가 입력 시작 부분에서 현재 문자 집합에 없는 문자를 만난 경우입니다. 예를 들어 꺾쇠괄호로 시작하는 웹페이지를 인코딩된 본문으로 처리하면 발생할 수 있습니다.

해결: 응답의 시작 부분과 원래 형식을 먼저 확인하세요. 웹페이지라면 요청 경로를 바로잡고 패딩을 더 넣지 마세요. 클라이언트에는 간략하게 ‘파싱 실패’로만 표시될 수 있습니다.

unexpected end of JSON input

원인: JSON 파서가 빈 내용이나 끝나지 않은 데이터를 읽은 경우입니다. VMess 공유 데이터 디코딩 후 필드를 파싱하는 과정에서도 발생할 수 있습니다.

해결: 전체 내용을 다시 가져와 디코딩 결과가 완전한지 확인하세요. 괄호를 직접 추가해 노드 설정을 추측하지 마세요.

프로토콜 호환성: 디코딩해도 노드를 만들지 못할 수 있습니다

구독 형식 호환성과 코어의 프로토콜 지원 여부는 서로 다른 문제입니다. 그래픽 클라이언트는 먼저 구독을 자체 노드 설정으로 변환한 뒤 코어에 전달합니다. v2rayNG는 Xray 코어를, v2flyNG는 V2Fly 코어를 사용합니다. v2rayN에서는 현재 실제로 선택된 코어를 확인해야 합니다. 두 클라이언트가 모두 VMess를 인식한다고 해서 전송 매개변수와 보안 계층 조합까지 완전히 똑같이 지원하는 것은 아닙니다.

점검 항목확인할 내용일반적인 영향
서버 포트1~65535 사이의 정수여야 합니다. 443은 흔히 사용되는 값일 뿐 고정값은 아닙니다.값이 없거나 범위를 벗어나면 가져오지 못할 수 있습니다
인증 정보VMess와 VLESS는 UUID를 확인하고, 다른 프로토콜은 해당 형식의 비밀번호를 확인합니다인증 정보가 잘못돼도 가져오기는 성공하고 인증에 실패할 수 있습니다
전송 매개변수전송 방식, WebSocket 경로, Host 등이 서버 설정과 일치해야 합니다지원되지 않는 필드는 누락될 수 있으며, 값이 틀리면 연결에 실패합니다
보안 계층TLS의 serverName, REALITY의 공개 키·shortId 및 관련 설정클라이언트 파서와 코어 모두 지원해야 합니다

REALITY는 보안 계층 방식이지 독립적인 아웃바운드 프로토콜이 아닙니다. 노드 이름만 ‘REALITY’로 바꿔 호환이 끝났다고 생각하지 마세요. 서비스 제공자가 클라이언트별 구독 주소를 제공한다면 현재 클라이언트에 맞는 형식을 선택하세요. 구조화된 설정 파일을 공유 링크 목록으로 간주해 가져와서도 안 됩니다.

  1. 테스트 그룹에 기존 구독을 그대로 둔 채, 서비스 제공자가 제공한 완전한 공유 링크 하나를 별도로 가져와 보세요.
  2. 단일 노드는 가져올 수 있지만 전체 구독은 실패한다면 외부 인코딩, 구독 응답 형식, 내용 잘림 여부를 우선 확인하세요.
  3. 특정 유형의 노드만 사라진다면 해당 프로토콜과 전송 필드의 지원 여부를 확인하세요. 억지로 가져오기 위해 필수 매개변수를 삭제하지 마세요.
  4. 노드는 표시되지만 코어를 시작할 때 오류가 발생한다면 코어 설정 로그를 확인하세요. ‘설정 미지원’과 ‘네트워크 연결 실패’를 구분해야 합니다.

구독 유효기간 및 업데이트 경로: 마지막으로 조건을 통제해 재확인하세요

구독 링크가 만료됐다고 해서 노드 연결도 반드시 끊기는 것은 아닙니다. 토큰을 초기화하면 기존 링크는 바로 사용할 수 없게 될 수 있지만, 이전에 캐시된 노드는 계속 표시될 수 있습니다. 요금제가 만료되면 빈 목록, 안내 문구, 접근 거부 등으로 응답할 수 있으며, 구체적인 동작은 서비스 제공자에 따라 다릅니다. 같은 구형 링크를 반복해서 가져오기보다 계정 유효기간, 남은 이용 권한, 최신 주소를 확인하는 편이 낫습니다.

구독 요청이 거치는 네트워크 경로도 따로 확인해야 합니다. ‘프록시를 통해 업데이트’하려면 현재 프록시가 정상 작동해야 합니다. 사용 중인 노드가 작동하지 않으면 업데이트가 순환 의존에 빠질 수 있습니다. 반대로 직접 연결로 구독 도메인에 접속할 수 없고 정상 작동이 확인된 노드가 있다면 프록시 업데이트를 시도할 수 있습니다. 어떤 조건이 영향을 주는지 확인하려면 한 번에 하나씩만 바꾸세요.

요약: 실패한 단계에 맞춰 정보를 전달하세요

문제가 계속되면 클라이언트 이름과 버전, 업데이트 시간, 요청 상태, 민감 정보를 가린 오류 내용을 서비스 제공자에게 전달하세요. 직접 연결과 프록시 업데이트 결과의 차이도 설명하되, 전체 구독 토큰이나 노드 인증 정보는 보내지 마세요.

재확인에 성공한 뒤에는 노드 필드가 완전한지, 코어가 시작되는지, 실제 연결이 정상인지 확인하세요. 각 단계는 각각 ‘구독 파싱 가능’, ‘설정 실행 가능’, ‘회선 연결 가능’을 검증합니다. 업데이트 성공 메시지만 보고 점검을 마치지 마세요. 가져오기 절차를 확인하려면 구독 사용 가이드를 참고하세요. 형식 변환이 필요하다면 신뢰할 수 없는 서비스에 접속 인증 정보를 넘기지 않도록 구독 변환 시 주의사항을 먼저 읽어보세요.

v2rayN 다운로드플랫폼에 맞는 클라이언트 선택