# grdpwasm - 웹 기반 RDP 클라이언트

> Clean Markdown view of GeekNews topic #28899. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=28899](https://news.hada.io/topic?id=28899)
- GeekNews Markdown: [https://news.hada.io/topic/28899.md](https://news.hada.io/topic/28899.md)
- Type: GN+
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2026-04-26T11:22:48+09:00
- Updated: 2026-04-26T11:22:48+09:00
- Original source: [github.com/nakagami](https://github.com/nakagami/grdpwasm)
- Points: 1
- Comments: 1

## Topic Body

- 브라우저만으로 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](https://github.com/nakagami/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](https://github.com/nakagami/grdp/blob/master/LICENSE) 참조가 함께 붙어 있음

## Comments



### Comment 56320

- Author: neo
- Created: 2026-04-26T11:22:50+09:00
- Points: 1

###### [Hacker News 의견들](https://news.ycombinator.com/item?id=47900440) 
- 꽤 멋져 보임. **세션 기록**과 **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/rustdesk/rustdesk>)  
  [https://github.com/thedepartmentofexternalservices/teraguchi](<https://github.com/thedepartmentofexternalservices/teraguchi>)  
  [https://kyber.tech/](<https://kyber.tech/>)
  - 참고로 **DCV**는 EC2에서는 무료고, 다른 환경에서도 라이선스 없을 때 경고가 아주 약한 편임

- 흥미로워 보이긴 하는데 가장 중요한 기능이 언급되지 않은 게 의외임. **클립보드 공유**가 실제로 얼마나 잘 되나 궁금함
  - Windows를 딱히 좋아하진 않지만, **RDP 3단 중첩 세션**을 넘나들며 파일 복사/붙여넣기 될 때마다 여전히 마법처럼 느껴짐
  - 우리도 커스텀 **RDP 클라이언트**를 만들고 있어서 이런 종류 구현 경험이 좀 있음. 비슷한 방식으로 구현했음  
    클립보드 공유, 공유 드라이브를 통한 업로드/다운로드는 **FreeRDP** 기능이라 비교적 바로 활용 가능함  
    그리고 **세션 녹화**는 PAM 환경에서는 타협 불가임  
    [1] [https://adaptive.live](<https://adaptive.live>)

- **데스크톱 스케일링**, 멀티모니터 지원, 파일 전송, 드라이브 리디렉션, 주변기기 리디렉션도 다 중요함

- **CyberArk PAM**에서 받은 RDP 파일을 열 때도 이게 동작하는지 궁금함

- 브라우저 탭 안에서 **Alt-Tab**을 RDP 클라이언트가 가로챌 수 있는지도 궁금함  
  예전에 Guacamole의 브라우저 RDP에서 가장 큰 문제가 그거였음

- 기술적으로는 흥미롭지만, 거의 모든 플랫폼에 **native RDP 클라이언트**가 이미 있어서 굳이 왜 필요한지는 잘 모르겠음
  - 브라우저에서 되면 로컬 머신에 아무것도 설치할 필요가 없음. 예전에 회사에서 꼼짝없이 큐비클에 앉아 있던 시절, 집 컴퓨터 접속하려고 **Apache Guacamole**를 자주 썼음  
    [https://guacamole.apache.org/](<https://guacamole.apache.org/>)
  - 기여자 1명, 커밋 1개, 새 프로젝트라서 좀 **vibe-coding** 느낌이 남
  - 브라우저는 **샌드박스**고 네이티브 클라이언트는 대개 그렇지 않아서 장점이 분명함. 이식성과 임베드 용이성도 있고, 트래픽을 들여다보거나 **MITM**하기도 더 단순함
  - native RDP/RDG에는 괜찮은 **MFA** 선택지가 많지 않음. 브라우저로 올리면 **OAuth**나 패스키 같은 걸로 전체를 감쌀 수 있음
  - **BMC 칩**에 붙은 원격 데스크톱의 웹 클라이언트 용도로도 쓸 수 있을 듯함
