grdpwasm - 웹 기반 RDP 클라이언트
(github.com/nakagami)- 브라우저만으로 Windows 원격 데스크톱에 접속할 수 있는 웹 기반 RDP 클라이언트이며, 아무 plugin 없이 동작함
- 브라우저의 Go WebAssembly와 서버 측 WebSocket-to-TCP 프록시를 분리해, 브라우저가 직접 열 수 없는 RDP TCP 연결을 대신 처리함
- 연결은
Browser -> WebSocket -> proxy -> TCP -> RDP Server흐름으로 이어지며, 접속 후 원격 화면이 canvas에 표시되고 키보드·마우스 입력을 전달함 - 입력 장치는 RDP scan codes 기반 키보드와 이동·클릭·휠을 포함한 마우스를 지원하고, 원격 오디오는 RDPSND로 받아 Web Audio API로 재생함
- 모든 origin을 허용하는 프록시 구조라서 신뢰할 수 있는 네트워크에서만 실행하거나, 외부 노출 전 HTTPS/WSS와 인증 계층을 함께 둬야 함
프로젝트 개요
- 브라우저에서 plugin 없이 Windows 원격 데스크톱에 접속하는 웹 기반 RDP 클라이언트로 동작함
- 구현은 Go WebAssembly와 grdp 조합으로 이뤄지며, 브라우저 실행부와 프록시 중계부가 분리된 구조를 가짐
- 브라우저가 raw TCP 소켓을 직접 열 수 없어서, WebSocket 연결을 RDP 서버의 TCP 포트로 이어 주는 경량 Go 프록시가 함께 필요함
아키텍처와 동작 방식
- 전체 경로는
Browser (WASM) -> WebSocket -> proxy (Go) -> TCP -> RDP Server순서로 이어짐 - 브라우저에서는 WASM 바이너리가 실행되고, 프록시는 WebSocket-to-TCP 브리지와 정적 파일 서버 역할을 함께 맡음
make all결과물은 브라우저에서 실행되는static/main.wasm, Go 런타임 지원 파일static/wasm_exec.js, 프록시 서버proxy/proxy로 나뉨- 이 구조 덕분에 브라우저 쪽은 표준 웹 기술로 접속을 처리하고, RDP 서버와의 실제 TCP 통신은 프록시가 맡게 됨
사용 흐름과 사용자 인터페이스
- 브라우저에서
http://localhost:8080을 열고 연결 폼에 Host, Port, Domain, User, Password, Width, Height 값을 입력한 뒤 Connect를 누르면 세션이 시작됨 - Port 기본값은
3389이며, Domain은 로컬 계정을 쓸 때 비워둘 수 있음 - 연결이 완료되면 원격 데스크톱이 canvas에 표시되고, 키보드 입력을 받으려면 canvas를 클릭해야 함
- Disconnect를 누르면 세션이 종료됨
입력 장치와 오디오 지원
- 표준 키보드 입력은 모두 RDP scan codes를 통해 원격 데스크톱으로 전달됨
- 마우스는 이동, 버튼 클릭, 스크롤 휠까지 지원함
- 브라우저 탭이 포커스를 가져야 키보드 이벤트가 전달되며, 키 입력이 멈추면 canvas 영역을 다시 클릭해야 함
- 원격 오디오는 RDPSND로 스트리밍되며, 브라우저에서는 Web Audio API로 재생됨
- 오디오 형식은 PCM 44100 Hz, stereo, 16-bit signed little-endian으로 명시됨
운영 조건과 보안 주의점
- 요구 사항은 Go 1.24 이상과 접근 가능한 RDP 서버 하나이며, 대상 서버는 Windows 또는 RDP 호환 호스트면 됨
- 프록시는 모든 origin의 연결을 허용하므로 신뢰할 수 있는 네트워크에서만 실행하거나, 인터넷에 노출하기 전에 인증 계층을 추가해야 함
- 자격 증명은 브라우저에서 프록시로 WebSocket을 통해 전달되므로, 신뢰할 수 없는 네트워크에서는 HTTPS/WSS 사용이 필요함
- README는 TLS 종료형 reverse proxy로 nginx나 Caddy를 두는 방식도 적어 둠
실행 형태와 부가 정보
- 실행은
make serve또는./proxy/proxy -listen :8080 -static static형태로 가능함 - 프록시 옵션은
-listen으로 수신 주소와 포트를,-static으로 정적 파일 디렉터리를 지정함 - 개발용 타깃은 WASM만 다시 빌드하는
make wasm, 프록시만 다시 빌드하는make proxy,wasm_exec.js를 갱신하는make wasm_exec, 산출물을 지우는make clean으로 나뉨 - 라이선스는 GPLv3이며 grdp LICENSE 참조가 함께 붙어 있음
Hacker News 의견들
-
꽤 멋져 보임. 세션 기록과 SSO 인증 지원까지 들어가면 RDP 점프호스트로 바로 쓸 수 있겠음
Azure Bastion으로 비슷하게 써봤는데, 테넌트에 설정된 인증 방식으로 Azure 포털에 로그인한 뒤 브라우저에서 VM으로 RDP 접속하고, VM 쪽 로컬 계정으로 로그인하면 됨. 파일과 클립보드 처리도 꽤 잘 되고 브라우저 안에서 콘솔 세션도 지원함
Windows/RDP 쪽은 안 써봐서 되는지 모르겠지만, GCP의 브라우저 SSH는 지금까지 본 것 중 가장 잘 만든 편이었음
Linux에서도 때로는 xrdp가 다른 대안보다 낫다고 느꼈음
이게 해결하는 큰 가치 중 하나는 VM/서버의 관리 인터페이스 분리임. 웹 서버의 관리 서비스가 HTTP 서비스와 같은 IP/도메인/인터페이스에 있지 않게 하는 것만으로도 보안이 크게 나아짐- 이 용도로는 Apache Guacamole에 우리 OIDC 프록시를 붙여서 쓰고 있음
-
브라우저 RDP에서 클립보드가 은근한 악몽임. 와이어 프로토콜 협상 자체는 잘 되지만, 브라우저 쪽 Clipboard API는 권한과 사용자 제스처 요구사항에 묶여 있음
읽기 쪽은 대부분 브라우저가 거의 매번 사용자에게 확인을 요구함. 그래서 페이지 내부에 별도 클립보드 버퍼를 만들거나, 아니면 RDP 안으로 붙여넣기는 매끄럽게 되지만 RDP 밖으로 복사해 나올 때는 매번 클릭을 감수해야 함
어느 쪽도 사람들이 웹 RDP 클라이언트에 기대하는 동작과는 거리가 있음. native mstsc와 같은 수준이라고 보기 전에 Chrome과 Firefox에서 어떻게 다르게 동작하는지 꼭 확인해봐야 함- 그건 꼭 그렇진 않은 듯함. Google Docs, Office 365, Notion은 반복적으로 권한을 요구하지 않고 동작함
-
HP가 Anyware / Teradici / PCoIP를 접으면서 대안을 찾는 사람이 꽤 많아졌음. 고해상도 멀티모니터, 60fps, 고비트 심도 재생, Wacom 태블릿 지원, 그리고 3개 OS 전부 지원하는 쪽이 특히 필요함
돈 내고 쓰는 쪽으론 Parsec와 DCV가 있고, 오픈소스 시도들이 반가움. rustdesk, kyber, teraguchi 같은 프로젝트가 있어서 커뮤니티에는 고성능 오픈소스 옵션이 꼭 필요해 보임
https://github.com/rustdesk/rustdesk
https://github.com/thedepartmentofexternalservices/teraguchi
https://kyber.tech/- 참고로 DCV는 EC2에서는 무료고, 다른 환경에서도 라이선스 없을 때 경고가 아주 약한 편임
-
흥미로워 보이긴 하는데 가장 중요한 기능이 언급되지 않은 게 의외임. 클립보드 공유가 실제로 얼마나 잘 되나 궁금함
- Windows를 딱히 좋아하진 않지만, RDP 3단 중첩 세션을 넘나들며 파일 복사/붙여넣기 될 때마다 여전히 마법처럼 느껴짐
- 우리도 커스텀 RDP 클라이언트를 만들고 있어서 이런 종류 구현 경험이 좀 있음. 비슷한 방식으로 구현했음
클립보드 공유, 공유 드라이브를 통한 업로드/다운로드는 FreeRDP 기능이라 비교적 바로 활용 가능함
그리고 세션 녹화는 PAM 환경에서는 타협 불가임
[1] https://adaptive.live
-
데스크톱 스케일링, 멀티모니터 지원, 파일 전송, 드라이브 리디렉션, 주변기기 리디렉션도 다 중요함
-
CyberArk PAM에서 받은 RDP 파일을 열 때도 이게 동작하는지 궁금함
-
브라우저 탭 안에서 Alt-Tab을 RDP 클라이언트가 가로챌 수 있는지도 궁금함
예전에 Guacamole의 브라우저 RDP에서 가장 큰 문제가 그거였음 -
기술적으로는 흥미롭지만, 거의 모든 플랫폼에 native RDP 클라이언트가 이미 있어서 굳이 왜 필요한지는 잘 모르겠음
- 브라우저에서 되면 로컬 머신에 아무것도 설치할 필요가 없음. 예전에 회사에서 꼼짝없이 큐비클에 앉아 있던 시절, 집 컴퓨터 접속하려고 Apache Guacamole를 자주 썼음
https://guacamole.apache.org/ - 기여자 1명, 커밋 1개, 새 프로젝트라서 좀 vibe-coding 느낌이 남
- 브라우저는 샌드박스고 네이티브 클라이언트는 대개 그렇지 않아서 장점이 분명함. 이식성과 임베드 용이성도 있고, 트래픽을 들여다보거나 MITM하기도 더 단순함
- native RDP/RDG에는 괜찮은 MFA 선택지가 많지 않음. 브라우저로 올리면 OAuth나 패스키 같은 걸로 전체를 감쌀 수 있음
- BMC 칩에 붙은 원격 데스크톱의 웹 클라이언트 용도로도 쓸 수 있을 듯함
- 브라우저에서 되면 로컬 머신에 아무것도 설치할 필요가 없음. 예전에 회사에서 꼼짝없이 큐비클에 앉아 있던 시절, 집 컴퓨터 접속하려고 Apache Guacamole를 자주 썼음