Go WebAssembly와 grdp로 구축된 웹 기반 RDP 클라이언트
Source: Hacker News
grdpwasm
Go WebAssembly와 grdp로 만든 웹 기반 RDP 클라이언트입니다.
플러그인 없이 브라우저에서 바로 Windows 원격 데스크톱 서버에 연결할 수 있습니다.
Architecture
Browser (WASM) ──WebSocket──► proxy (Go) ──TCP──► RDP Server
브라우저는 원시 TCP 소켓을 열 수 없기 때문에, 가벼운 Go 프록시 서버가 브라우저의 WebSocket 연결을 RDP 서버의 TCP 포트와 연결해 줍니다.
Requirements
- Go 1.24 이상
- 접근 가능한 RDP 서버 (Windows 또는 RDP 호환 호스트)
Build
git clone https://github.com/nakagami/grdpwasm.git
cd grdpwasm
make all
make all 은 다음을 생성합니다:
| Output | Description |
|---|---|
static/main.wasm | 브라우저에서 실행되는 Go WASM 바이너리 |
static/wasm_exec.js | Go 런타임 JS 지원 파일 |
proxy/proxy | WebSocket‑to‑TCP 프록시 + 정적 파일 서버 |
Run
make serve
# 또는 동일하게:
./proxy/proxy -listen :8080 -static static
그 후 브라우저에서 http://localhost:8080 을 엽니다.
Proxy options
| Flag | Default | Description |
|---|---|---|
-listen | :8080 | 수신할 주소와 포트 |
-static | static | 정적 파일을 제공할 디렉터리 |
Usage
- 브라우저에서
http://localhost:8080을 엽니다. - 연결 양식을 작성합니다:
- Host – RDP 서버의 호스트명 또는 IP 주소
- Port – RDP 포트 (기본값
3389) - Domain – Windows 도메인 (로컬 계정은 비워 둡니다)
- User – 사용자 이름
- Password – 비밀번호
- Width / Height – 초기 데스크톱 해상도
- Connect 를 클릭합니다.
- 원격 데스크톱이 캔버스에 표시됩니다. 키보드 포커스를 잡으려면 캔버스를 클릭합니다.
- Disconnect 를 클릭해 세션을 종료합니다.
Keyboard & Mouse
표준 키보드 입력은 모두 RDP 스캔 코드로 원격 데스크톱에 전달됩니다.
마우스 이동, 버튼 클릭, 스크롤 휠도 완전히 지원됩니다.
Note: 키보드 이벤트가 전달되려면 브라우저 탭이 포커스를 가져야 합니다. 키가 반응하지 않을 경우 캔버스 영역을 클릭하세요.
Audio
원격 오디오는 RDPSND를 통해 스트리밍되며, 브라우저의 Web Audio API를 사용해 재생됩니다 (PCM 44100 Hz, 스테레오, 16‑bit 부호 있는 리틀‑엔디언).
Security notes
프록시는 모든 출처(origin)로부터의 연결을 허용합니다. 신뢰할 수 있는 네트워크에서만 실행하거나, 인터넷에 노출하기 전에 인증을 추가하십시오.
자격 증명은 브라우저에서 프록시로 WebSocket을 통해 전송됩니다. 신뢰할 수 없는 네트워크에서 접근할 경우 HTTPS/WSS를 사용하세요 (예: nginx 또는 Caddy와 같은 TLS 종료 역방향 프록시 뒤에 프록시를 배치).
Development
이 저장소에는 ./grdp/ 아래에 grdp의 로컬 포크가 포함되어 있으며, 하나의 추가 사항이 있습니다: RdpClient에 Dialer 필드가 있어 호출자가 사용자 정의 net.Conn 팩토리를 주입할 수 있습니다. 이를 통해 WASM 빌드가 TCP 대신 WebSocket으로 연결됩니다.
make wasm # WASM 바이너리만 재빌드
make proxy # 프록시 서버만 재빌드
make wasm_exec # 로컬 Go 툴체인에서 wasm_exec.js를 갱신
make clean # 모든 빌드 산출물 삭제
License
GPLv3 — 자세한 내용은 grdp LICENSE 를 참고하십시오.