Go WebAssembly와 grdp로 만든 웹 기반 RDP 클라이언트
7 hours ago
1
- 브라우저만으로 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 참조가 함께 붙어 있음
-
Homepage
-
Tech blog
- Go WebAssembly와 grdp로 만든 웹 기반 RDP 클라이언트