Remote Desktop
Host PC를 웹 브라우저에서 원격 제어. WebSocket 기반 실시간 화면 스트리밍과 마우스/키보드 입력.
소개
Host PC(Windows)를 고정 위치에 두고, 웹 브라우저에서 원격으로 화면을 보고 제어할 수 있습니다. Host PC를 항상 켜둔 상태로 유지하여 VDI 연결과 CodeSync가 끊기지 않도록 합니다.
설치 불필요: 클라이언트는 브라우저만 있으면 됩니다. Chrome, Safari, Edge 모두 지원.
서비스 구조
Direct 모드 (같은 네트워크)
💻
Client
웹 브라우저
◀ WebSocket ▶
🖥
Host PC
:8290
Relay 모드 (다른 네트워크)
💻
Client
웹 브라우저
◀ WS ▶
☁
AKS Relay
FastAPI
◀ WS ▶
🖥
Host PC
outbound
구성 요소
| 구성 요소 | 역할 | 기술 |
|---|---|---|
| Server | 화면 캡처 + 입력 주입 + WebSocket | Python, mss (DXGI), ctypes SendInput |
| Client | 화면 표시 + 입력 전송 | HTML5 Canvas, WebSocket |
| Relay | 외부 네트워크 중계 (선택) | FastAPI WebSocket |
다운로드
Windows EXE
Windows 10/11 (ARM64 / x64)
설정 템플릿
remote-desktop.yaml
EXE 설치 (권장)
파일 다운로드
remote-desktop.exe와 remote-desktop.yaml.example을 다운로드합니다.폴더 배치
Host PC에 폴더를 만들고 파일을 복사합니다.
mkdir C:\remote-desktop
copy remote-desktop.exe C:\remote-desktop\
copy remote-desktop.yaml.example C:\remote-desktop\remote-desktop.yaml
설정 수정
remote-desktop.yaml의 password를 반드시 변경합니다.notepad C:\remote-desktop\remote-desktop.yaml
서버 실행
명령 프롬프트에서 실행합니다.
C:\remote-desktop\remote-desktop.exe serve -c C:\remote-desktop\remote-desktop.yaml
브라우저 접속
웹 브라우저에서
http://<Host-PC-IP>:8290 으로 접속합니다.설정
host: "0.0.0.0" # 바인드 주소
port: 8290 # 포트 번호
password: "Rdt@2026!Sec" # 접속 비밀번호 (반드시 변경!)
fps: 10 # 초당 프레임 (5~15 권장)
quality: 50 # JPEG 품질 (1~95, 낮을수록 빠름)
scale: 1.0 # 화면 축소 (0.5 = 절반)
monitor: 0 # 모니터 (0=전체)
capture_backend: "auto" # 캡처 백엔드 (auto/mss/bitblt/printwindow/camera)
camera_device: 0 # HDMI 캡처카드 장치 인덱스 (camera 시)
relay_url: "" # Relay 서버 URL (외부용)
relay_room: "" # 방 ID
성능 프리셋
| 프리셋 | fps | quality | scale | 대역폭 | 용도 |
|---|---|---|---|---|---|
| 기본 | 10 | 50 | 1.0 | ~1.3 MB/s | 일반 사용 |
| 저대역폭 | 5 | 30 | 0.75 | ~250 KB/s | 느린 네트워크 |
| 고화질 | 15 | 70 | 1.0 | ~3.7 MB/s | 상세 작업 |
방화벽 설정
Direct 모드에서는 Host PC의 포트를 열어야 합니다:
netsh advfirewall firewall add rule name="RemoteDesktop8290" dir=in action=allow protocol=TCP localport=8290
Relay 모드를 사용하면 인바운드 포트 오픈이 필요 없습니다. Host PC에서 AKS Relay로 outbound 연결만 합니다.
접속 방법
Direct 모드 (같은 네트워크)
Client와 Host PC가 같은 네트워크에 있을 때 직접 연결합니다.
Host PC에서 서버 실행
EXE 또는 Python으로 서버를 시작합니다.
웹 브라우저에서 접속
Chrome/Safari에서
http://<Host-PC-IP>:8290 으로 접속합니다.비밀번호 입력
설정된 비밀번호를 입력하면 원격 화면이 표시됩니다.
Relay 모드 (다른 네트워크 / 방화벽 환경)
외부 네트워크에서 AKS Relay 서버를 경유하여 접속합니다. Host PC에서 인바운드 포트를 열 필요가 없습니다.
Host PC 설정 (remote-desktop.yaml)
Relay 서버 주소와 방 ID를 설정합니다.
relay_url: "wss://codesync.4.230.72.248.nip.io/ws/relay"relay_room: "my-room"
Host PC에서 서버 실행
EXE 실행 시 자동으로 Relay에 outbound 연결합니다. 로그에
Relay 연결됨이 표시되면 성공입니다.웹 브라우저에서 Relay 접속
아래 URL로 접속합니다 (room 파라미터는 Host PC의
비밀번호 입력 후 원격 화면이 표시됩니다.
relay_room과 동일):https://codesync.4.230.72.248.nip.io/remote?room=my-room비밀번호 입력 후 원격 화면이 표시됩니다.
Relay 모드에서는 Host PC가 먼저 실행되어 Relay에 연결된 상태여야 합니다. 브라우저에서 먼저 접속하면 "Host PC 연결 대기 중..." 메시지가 표시됩니다.
조작법
| 동작 | 조작 | 설명 |
|---|---|---|
| 마우스 이동 | 화면 위 이동 | 원격 PC 마우스 커서 이동 |
| 클릭 | 좌/우/중 클릭 | 원격 PC에 전달 |
| 스크롤 | 휠 스크롤 | 원격 PC에 전달 |
| 키 입력 | 키보드 타이핑 | 모든 키가 원격 PC로 전달 |
| 전체화면 | Fullscreen 버튼 | 브라우저 전체화면 토글 |
| 1:1 모드 | Fit 버튼 | 화면 맞춤 / 원본 크기 토글 |
F5(새로고침), F11(전체화면), F12(개발자도구)는 브라우저가 처리합니다. 나머지 모든 키는 원격 PC로 전달됩니다.
실시간 설정
하단 컨트롤 바에서 서버 설정을 실시간으로 변경할 수 있습니다:
| 항목 | 범위 | 설명 |
|---|---|---|
| FPS | 5 / 10 / 15 / 20 / 30 | 초당 프레임 (높을수록 부드럽지만 대역폭 증가) |
| Quality | 10 ~ 95 | JPEG 압축 품질 (낮을수록 작고 빠름) |
| Scale | 50% / 75% / 100% | 화면 축소 (대역폭 절약) |
자동 시작 등록
Windows 작업 스케줄러로 로그인 시 자동 시작할 수 있습니다:
scripts\install_task.bat
# 관리 명령
schtasks /Query /TN RemoteDesktop # 상태 확인
schtasks /Run /TN RemoteDesktop # 즉시 실행
schtasks /Delete /TN RemoteDesktop /F # 제거
Relay 모드
다른 네트워크(외부)에서 접속할 때 AKS Relay 서버를 경유합니다. Host PC에서 outbound WebSocket만 사용하므로 인바운드 포트를 열 필요가 없습니다.
Host PC 설정
# remote-desktop.yaml
relay_url: "wss://codesync.4.230.72.248.nip.io/ws/relay"
relay_room: "my-room" # 방 ID (브라우저 접속 시 동일하게 사용)
relay_token: "" # 토큰 인증 (선택, 설정 시 브라우저에서도 동일 토큰 필요)
브라우저 접속 URL
# 기본 접속
https://codesync.4.230.72.248.nip.io/remote?room=my-room
# 토큰 인증 사용 시
https://codesync.4.230.72.248.nip.io/remote?room=my-room&token=your-token
동작 원리
웹 브라우저 ──wss──▶ AKS Relay ◀──wss── Host PC (EXE)
(Client) (중계 서버) (Host, outbound)
1. Host PC가 EXE 실행 → Relay에 자동 연결 (outbound)
2. 브라우저에서 같은 room으로 접속
3. Relay가 양방향 중계 (화면 스트리밍 + 입력 전달)
자동 재접속
Host PC의 Relay 연결이 끊기면 5초부터 최대 30초까지 지수 백오프로 자동 재접속합니다. 네트워크 일시 장애 시에도 수동 개입 없이 복구됩니다.
보안
| 보안 위협 | 대응 방법 |
|---|---|
| 방화벽 (인바운드 차단) | Relay 모드로 outbound만 사용 |
| AV/EDR (EXE 차단) | Python 직접 실행 fallback |
| DLP (화면 공유 감지) | JPEG 스트리밍은 일반 HTTP 트래픽 |
| 입력 차단 (키로거 방지) | SendInput은 Windows 표준 API |
| 무단 접속 | 비밀번호 인증 필수 |
비밀번호는 반드시 기본값에서 변경하세요. 공용 네트워크에서는 Relay + TLS(wss://)를 사용하세요.
트러블슈팅
| 증상 | 원인 | 해결 |
|---|---|---|
| 포트 접근 불가 | Windows 방화벽 | netsh 명령으로 포트 열기 |
| 화면이 검정 | 서비스 세션에서 실행 | 사용자 세션에서 실행 (schtasks) |
| 입력 안 됨 | 보안 SW 차단 | View-only 모드로 사용 |
| 연결 끊김 | 네트워크 불안정 | 자동 재접속 (3초 간격) |
| 느린 화면 | 높은 FPS/Quality | 하단 바에서 FPS 5, Quality 30 |
| VDI 창이 흰색 | 보안 SW(DLP) 화면 캡처 차단 | remote-desktop.exe diagnose로 진단. capture_backend: "printwindow" 시도. 근본 해결: IT 보안팀 화이트리스트 또는 HDMI 캡처카드 |
| camera 프레임 없음 | HDMI 캡처카드 미인식 또는 장치 인덱스 오류 | diagnose로 카메라 장치 목록 확인. camera_device 인덱스 변경. opencv-python 설치 확인 |