원격 제어 프로그램에서 최근 연결 기록의 시각 기준을 나누고, 자기 PC로의 접속을 막도록 정리했다. 온라인 상태는 하트비트 시각을 쓰고, 자기 PC인지는 별도의 해시 식별값으로 판별했다.

두 정보는 기준 시각이 달라야 했다
관리 화면에는 현장 PC의 온라인 표시와 마지막 연결 시각이 나온다. 최근 원격 연결한 PC 다섯 대를 보여 주는 목록도 별도로 있다.
온라인 표시는 현재 PC 상태를 묻고, 최근 목록은 실제 원격 연결 이력을 묻는다. 뜻이 다른데도 기준 시각이 섞일 수 있는 구조여서 집계를 분리했다.
온라인은 상태 확인, 최근 목록은 연결 성공
- 온라인 표시와 마지막 연결 시각은 하트비트·pong 확인 시각을 유지한다.
- 최근 연결 5대는 성공한 원격 연결의 connected_at 시각으로만 집계한다.
- 연결에 실패한 시도는 성공한 세션이 아니므로 최근 목록에서 제외한다.
기준을 전환하면서 과거 성공 세션의 연결 시각도 한 차례 반영했다. 최근 연결 목록을 위한 일회성 backfill이다.
기록용 시각은 인덱스를 걸고, 값이 뒤로 가지 않게 단조 증가하도록 맞췄다. 기존 기록은 지우지 않고 그대로 보존했다.

자기 PC 연결은 이름이나 IP로 판단하지 않았다
자기 PC로 원격 접속하면 내 화면이 화면 안에 다시 보이는 거울 같은 모습이 나타날 수 있다. 이런 상황을 피하려면 요청 PC와 대상 PC가 같은 장비인지 구별해야 했다.
PC 이름은 여러 장비에서 같을 수 있고, 한 네트워크의 PC는 공인 IP도 공유할 수 있다. 따라서 이름과 공인 IP만 같다는 이유로 별도 PC의 접속을 막지 않았다.
원본 대신 용도를 구분한 해시 식별값을 썼다
에이전트에 PC 고유값을 기반으로 한 새 식별값을 추가했다. 고유값에 용도 구분값을 포함하고 SHA-256으로 해시한 결과를 비교에 사용했다.
아래 코드는 설계를 설명하기 위한 개념 예시이며 실제 구현 코드는 아니다. 입력값과 용도 구분 문자열도 설명을 위해 다르게 적었다.
// 개념 예시: PC 고유값을 용도 구분값과 함께 해시해 비교용 식별값을 만든다
const crypto = require('crypto');
function selfCheckId(rawPcValue) {
return crypto.createHash('sha256')
.update('example-self-check:v1\0') // 용도 구분(domain separation)
.update(rawPcValue)
.digest('hex');
}
// 원격 세션 요청: 요청한 PC와 대상 PC의 식별값이 같으면 거절
function isSelfConnection(requesterId, targetId) {
return Boolean(requesterId) && requesterId === targetId;
}
용도 구분값은 동일한 원본값을 다른 용도로 처리할 때 식별 결과를 구별하는 데 쓴다. 원본 식별값과 인증 키는 노출하지 않도록 했다.
관리 화면과 뷰어는 이 로컬 식별값을 헤더로 보낸다. 다만 같은 관리 서버의 origin과 경로로 가는 요청에만 붙이게 했다. 다른 주소로 식별값이 새 나가지 않게 하려는 장치다.

구형 에이전트는 새 식별값 대신 같은 Windows 계정의 기존 설치 식별값을 쓴다. 기존 방식을 이용해 이전 에이전트와의 호환도 유지했다.
관리 화면과 서버 요청에서 함께 차단했다
관리 화면에서만 접속을 막으면 서버로 들어오는 다른 요청 경로까지 다루기 어렵다. 자기 PC 판별을 화면과 서버 요청에 나누어 적용했다.
- 관리 화면에서 자기 PC로 원격 접속을 시도하는 경우
- 관리 서버에서 원격 세션을 생성하려는 경우
- 원격 접속 중 추가 모니터 화면을 요청하는 경우
화면에서만 막으면 다른 경로로 들어오는 요청을 놓친다. 그래서 서버의 세션 생성에서도 한 번 더 확인한다. 추가 모니터 창 구조는 멀티 모니터 원격 뷰어 정리 글에 따로 적었다.

커밋 메시지에는 이 작업의 자동 테스트로 서버 410개, 관리 화면 18개, 뷰어 130개, 합계 558개 통과가 기록돼 있다. 이 숫자는 테스트 통과 기록일 뿐이고, 실기기에서 모든 접속 경로를 직접 검증했다는 뜻은 아니다. 실제 자기 PC 접속이 몇 번 있었는지를 뜻하는 숫자도 아니다.
이번 작업에서 정리한 원칙
- 온라인 표시와 최근 원격 연결 기록은 서로 다른 기준 시각을 사용한다.
- 자기 PC 판별에는 이름이나 공인 IP 대신 별도 식별값을 사용한다.
- 식별 헤더는 같은 관리 서버의 지정된 origin과 경로에만 보낸다.
참고한 공식 문서는 MDN의 동일 출처 정책 설명이다. 추가 모니터 화면의 구조는 멀티 모니터 원격 뷰어 정리 글에서 확인할 수 있다.
'프로젝트 > 원격 제어 프로그램' 카테고리의 다른 글
| AcquireNextFrame 타임아웃, 예외로 잡으려다 반환값을 놓쳤다 (0) | 2026.10.22 |
|---|---|
| 배포 버전 현재 상태 문서를 세우고, 과거 릴리스·업데이트 기록은 보존했다 (0) | 2026.10.19 |
| 하트비트 pong마다 SQLite에 쓰던 구조, PC 증가에 대비해 5초 병합으로 바꿨다 (0) | 2026.10.18 |
| 비동기 GPU 인코딩에서 peer가 바뀌던 문제, 프레임에 소유자를 심다 (0) | 2026.10.18 |
| 멀티 모니터 원격 뷰어, 창 하나를 전제로 짠 세션·수명 구조 풀기 (0) | 2026.10.17 |