VMess와 VLESS는 모두 V2Ray 생태계의 전송 프로토콜이며, 차이는 인증 필드, 내장 암호화 여부, 암복호화 오버헤드, 클라이언트 코어 요구 사항 네 가지에 집중됩니다. 이 글은 이 네 가지를 항목별로 비교하고, 직접 서버를 구축하는 경우와 남의 구독을 사용하는 경우 각각의 선택 기준을 제시합니다.
인증: 같은 UUID, VMess는 alterId가 하나 더
두 프로토콜 모두 UUID로 사용자 신원을 식별합니다. 서버는 clients 배열에 UUID 문자열을 고정해 두고, 클라이언트 설정의 id는 문자 단위로 정확히 일치해야 하며 한 글자만 달라도 인증에 실패합니다. 이 점만 보면 VMess와 VLESS는 차이가 없습니다.
차이는 VMess 초기에 추가된 alterId 필드에서 나옵니다. UUID에서 파생한 임시 식별자 묶음을 타임스탬프와 함께 사용해 재전송 공격을 막는 방식이며, 예전 기본값은 64였습니다. 대신 클라이언트와 서버의 시간 차이를 90초 이내로 유지해야 해서, 시스템 시간이 틀어지거나 시간대가 다른 환경에서는 연결이 안 되는 일이 잦았습니다.
| 비교 항목 | VMess | VLESS |
|---|---|---|
| 신원 필드 | UUID + alterId(구버전) | UUID만 |
| 재전송 방어 방식 | alterId 파생 식별자 + 타임스탬프, AEAD 이후에는 프로토콜 자체에서 보장 | 전송 계층에 위임 |
| 시간 동기화 요구 사항 | alterId > 0이면 서버와 시간 차이 90초 이내 | 없음 |
| 최신 버전 설정 | alterId에 0 입력 | 해당 필드 없음 |
2022년 1월에 공개된 V2Ray v4.35에서 alterId는 폐기 예정으로 표시되었고, v5에서는 필드 자체가 제거되었습니다. 지금 v2rayN 6.x에서 VMess 노드를 새로 만들면 alterId 기본값이 0이고 AEAD 인증을 사용하므로 타임스탬프를 검사하지 않습니다. 양쪽 모두 0으로 맞추면 이 차이는 사실상 사라집니다.
VLESS는 설계 단계부터 alterId가 없었고, 재전송 방어는 전송 계층에 맡기며 서버가 세션 상태를 유지할 필요도 없고 프로토콜 헤더도 더 짧습니다. 그래서 첫 번째 항목은 한 문장으로 정리됩니다. 최신 버전에서는 둘 다 똑같이 단순하고, alterId가 0이 아닌 예전 노드를 만났을 때만 시간 동기화를 신경 쓰면 됩니다.
전송 계층 의존성: VLESS는 이중 암호화를 하지 않음
VMess 프로토콜에는 자체 암호화 계층이 있습니다. TLS를 적용하지 않아도 VMess 트래픽 자체가 암호화되며, 설정의 security 필드에 auto, aes-128-gcm, chacha20-poly1305, none을 넣을 수 있습니다. 덕분에 TCP로 그대로 돌릴 수 있고, TLS에 의존하지 않는 mKCP 같은 전송 방식과도 조합할 수 있습니다.
VLESS는 반대입니다. 프로토콜 자체는 인증과 전달만 담당하고 바이트 하나도 암호화하지 않으며, 설정에는 "encryption": "none"이 고정으로 들어가고 페이로드는 평문 그대로 전송 계층에 넘깁니다. TCP로 그대로 돌리는 VLESS는 평문 전송과 같으므로 실제 배포에서는 반드시 TLS, XTLS 또는 REALITY를 적용해야 합니다.
{
"outbounds": [{
"protocol": "vless",
"settings": {
"vnext": [{
"address": "node.example.com",
"port": 443,
"users": [{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"encryption": "none",
"flow": "xtls-rprx-vision"
}]
}]
},
"streamSettings": {
"network": "tcp",
"security": "reality"
}
}] // VLESS 아웃바운드: 암호화는 REALITY 전송 계층에 맡김
}
주의
노드 정보에 TLS, REALITY, XTLS 문구가 없다면 전송 계층이 안전한지 먼저 확인하세요. VLESS 자체는 암호화를 보장하지 않습니다.
자주 쓰이는 VLESS 배포 조합은 세 가지입니다:
- VLESS + TCP + TLS: 443 포트, 가장 단순한 구성, 자체 도메인과 인증서 필요
- VLESS + XTLS Vision + REALITY: Xray 코어에서 지원, 도메인과 인증서를 직접 준비할 필요 없음
- VLESS + WebSocket + TLS: CDN 중계를 쓸 때 사용하며, VMess의 같은 조합과 구조가 동일
REALITY와 XTLS Vision은 현재 VLESS에만 구현되어 있고 VMess에는 없습니다. 노드 정보에 flow: xtls-rprx-vision 또는 security: reality가 보인다면 그것은 반드시 VLESS입니다.
암호화 오버헤드: 2계층과 1계층의 실제 차이
차이를 CPU 오버헤드로 환산하면 더 직관적입니다. VMess가 TLS를 쓸 때는 암복호화가 두 번 일어납니다. 바깥 TLS에서 한 번, 프로토콜 내부에서 한 번입니다. VLESS는 바깥 TLS 한 번뿐입니다. 암복호화는 매번 CPU 사이클을 소모하므로 연결 수가 많을수록 차이가 커집니다.
이 차이가 체감되는 기기는 무엇일까요? 데스크톱의 최신 프로세서에서는 사실상 측정이 어렵습니다. 단일 코어 저사양 서버나 오래된 스마트폰, 공유기에서는 VLESS가 아낀 한 계층이 연결 수와 처리량으로 나타납니다.
결론: 프로토콜을 바꾸기 전에 기기를 먼저 보자
데스크톱과 정상적인 네트워크 환경에서는 VMess와 VLESS의 속도 차이가 측정 오차 범위 안입니다. 기기 성능이 빠듯하거나 동시 연결 수가 많을 때만 VLESS가 아끼는 한 계층을 교체 이유로 삼을 만합니다.
클라이언트 호환성: 코어 버전이 VLESS 사용 가능 여부를 결정
VLESS를 쓸 수 있는지는 클라이언트에 내장된 코어 버전에 달려 있습니다. v2rayN 6.x는 기본적으로 Xray 코어를 사용해 VMess와 VLESS를 모두 지원하고, v2rayNG도 Xray 코어 기반입니다. v2flyNG는 v2fly 코어를 사용하며 v4.27부터 VLESS를 지원하지만 REALITY는 지원하지 않습니다.
Xray 코어
권장v2rayN 6.x의 기본 코어이자 v2rayNG가 사용하는 코어. VLESS와 XTLS Vision, REALITY를 모두 지원하고 VMess도 완전히 호환합니다.
적합: 클라이언트를 새로 설치하거나 REALITY 노드를 쓸 때
v2fly 코어
v2flyNG가 사용합니다. v4.27부터 VLESS를 지원하지만 REALITY는 지원 대상이 아니며, VMess와 WebSocket 호환성은 안정적입니다.
적합: VMess와 WebSocket만 쓰는 기존 노드
버전 번호는 넘을 수 없는 기준입니다. V2Ray 코어 v4.26 이하에서는 vless:// 링크를 인식하지 못하므로, 구독에 VLESS 노드가 섞여 있으면 가져오기 자체가 실패합니다. 확인 방법: v2rayN 메인 화면에서 '설정' → '매개변수 설정' → 'Core: 기본 설정'으로 들어가면 되고, Xray 코어 버전은 1.x, v2fly 코어는 4.x 또는 5.x입니다.
공유 링크의 접두사로도 구분할 수 있습니다. vmess:// 뒤에는 base64로 인코딩된 JSON이 오고, vless://는 vless://uuid@주소:포트?파라미터#메모 형태의 URI 쿼리 문자열입니다. 한 구독 안에 두 링크를 함께 담아도 클라이언트가 접두사별로 따로 파싱하므로 노드 목록에 항목이 몇 개 더 늘어날 뿐입니다.
결론: 프로토콜은 서버를 따라간다
노드가 어떤 프로토콜을 쓰는지는 서버에서 이미 정해져 있고, 클라이언트가 고를 수 있는 것은 코어와 전송 방식뿐입니다. VMess 노드를 받았다면 그대로 쓰면 되고, '최신'을 위해 굳이 변환할 필요는 없습니다.
언제 신경 써야 할까
네 가지 비교 항목을 일상 사용에 대입해 보면, 프로토콜 차이를 실제로 신경 써야 하는 상황은 세 가지뿐입니다.
상황별 선택: 새로 배포할 때는 VLESS, 기존 노드는 그대로
직접 서버 구축
- Xray 코어 + VLESS + REALITY
- 포트 443, flow에 xtls-rprx-vision 입력
- 도메인과 인증서를 직접 준비할 필요 없음
남의 구독 사용
- 서버가 주는 프로토콜을 그대로 사용
- VMess 노드를 VLESS로 바꿀 필요 없음
- alterId는 항상 0 입력
프로토콜은 서버에서 정해지므로 클라이언트가 바꿀 수 없고, 한 구독에 두 종류 노드가 섞여 있어도 서로 영향을 주지 않습니다.
나머지 두 가지는 판단이 더 간단합니다. 기기 성능이 빠듯하면 암복호화가 한 계층 적은 VLESS를 우선하고, CDN 중계가 필요하거나 구형 클라이언트를 함께 지원해야 하면 VMess + WebSocket + TLS의 적용 범위가 더 넓습니다.
구독에 vmess://와 vless:// 링크가 함께 있으면 충돌하나요?
충돌하지 않습니다. 클라이언트가 링크 접두사별로 따로 파싱하므로 한 구독 안에 두 종류 노드가 공존할 수 있고, 노드 목록에 항목이 몇 개 더 늘어날 뿐입니다.
VLESS 노드에 연결이 안 되고 로그에 invalid user가 뜨는 이유는 무엇인가요?
UUID 불일치입니다. 클라이언트의 id와 서버 clients에 적힌 UUID가 문자 단위로 같은지 확인하거나, 구독을 다시 업데이트하세요.
VMess의 alterId는 결국 얼마를 넣어야 하나요?
최신 버전에서는 항상 0입니다. v2rayN 6.x에서 노드를 새로 만들면 기본값이 0이고, 구독에서 0이 아닌 값이 내려온다면 서버 코어가 오래된 것이므로 양쪽을 같게 맞추면 됩니다.
VLESS로 바꾸면 더 빨라지나요?
속도를 결정하는 것은 프로토콜이 아니라 대부분 회선 품질입니다. VLESS는 암복호화 한 계층을 아껴 저사양 기기에서 체감 차이가 있지만, 데스크톱과 정상 네트워크에서는 차이가 거의 없습니다.
프로토콜은 서버와 클라이언트 사이의 약속이며, 아무 때나 바꿀 수 있는 스위치가 아닙니다. 이 네 가지 차이만 구분해도 일상적인 노드 사용과 연결 문제 해결에는 충분합니다.
v2rayN 다운로드
Windows, macOS, Linux 데스크톱 버전과 v2rayNG 안드로이드 버전은 다운로드 페이지에서 받을 수 있습니다.