목차 열기
04. 마우스 궤적 합성
공격 에이전트가 방어 시스템과 가장 첨예하게 맞부딪히는 지점이 마우스 궤적입니다. 어떤 원칙을 잡느냐에 따라 탐지 회피 수준과 수행 속도가 결정됩니다.
설계 철학 — 형태와 속도의 분리
핵심 원칙
| 속성 | 전략 | 이유 |
|---|---|---|
| 형태 (직선성·손떨림) | 수집된 인간 샘플 분포에서 샘플링 + 가우시안 변동 | 동일 시그니처 형성 방지, 통계 기반 탐지 회피 |
| 속도 (평균 속도·머뭇거림) | "티켓팅 장인" 페르소나 고정값 | 인간 분포 상위 극단 → 경쟁 우위 확보 |
"티켓팅 장인" 페르소나 정의
어디를 클릭할지 이미 알고 있고 망설임 없이 그쪽으로 직행하는 숙련자
| 특성 | 값 (범위) |
|---|---|
| 평균 이동 속도 | 2.0 ~ 2.8 px/ms |
| 클릭 전 머뭇거림 | 8 ~ 20 ms |
| 경로 직선성 | 인간 상위 분포 (0.93~0.98 근처) |
| 손떨림 수직 표준편차 | 0.5 ~ 2.0 px |
왜 평균 인간을 그대로 모사하지 않는가
| 선택지 | 문제 |
|---|---|
| 평균 인간 분포 그대로 | 티켓팅에서 너무 느림 → 공격 자체가 무의미 |
| 한 사람 패턴 완전 고정 | 동일 시그니처 → 통계 기반 탐지에 취약 |
| 형태는 다양·속도는 고정 | 탐지 회피 + 경쟁력 둘 다 달성 |
6단 합성 파이프라인
매 클릭마다 시작점과 끝점을 받아 6단계를 거쳐 마우스 이동 경로를 생성합니다.
[1] 샘플링 인간 궤적 샘플 모음에서 균등 랜덤 선택
↓
[2] 미세 변동 직선성·떨림에 가우시안 변동 주입
↓
[3] 속도 덮어쓰기 원본 속도 폐기, 장인 페르소나 고정값 교체
↓
[4] 곡선 생성 비대칭 제어점 두 개로 3차 베지어(Cubic Bezier) 곡선
↓
[5] 떨림 주입 경로 수직 방향으로만 N(0, σ) 가우시안 노이즈
↓
[6] 역계산 검증 실측 직선성·떨림 역계산 + 감사 로그 기록
단계별 세부
1단 — 샘플링
| 항목 | 내용 |
|---|---|
| 입력 | 수집 샘플 뱅크 (50+ 개) |
| 방식 | 균등 랜덤으로 1개 선택 |
| 출력 | 직선성·떨림 값 쌍 |
| 의미 | 이번 클릭의 "캐릭터" 결정 |
2단 — 미세 변동 주입 (Gaussian jitter)
| 항목 | 값 |
|---|---|
| 직선성에 더할 변동 표준편차 | σ ≈ 0.015 |
| 떨림에 더할 변동 표준편차 | σ ≈ 0.35 px |
| 클램핑 범위 (직선성) | 0.55 ~ 1.0 |
| 클램핑 범위 (떨림) | 0 ~ 25 px |
의미 — 같은 샘플을 뽑아도 매번 미묘하게 다른 캐릭터로 변주됩니다.
3단 — 속도·머뭇거림 덮어쓰기
- 원본 샘플의 속도·머뭇거림 값은 버리고, 장인 페르소나 고정값으로 교체
- 이 단계가 "속도 분리"를 실현하는 핵심
4단 — 곡선 생성 (Cubic Bezier with asymmetric control points)
| 항목 | 계산식 |
|---|---|
| 이동 벡터 | (dx, dy) = end - start |
| 이동 거리 | dist = sqrt(dx² + dy²) |
| 곡률 진폭 | amp = dist · sqrt(max(0, 1/linearity − 1)) · 0.45 |
| 진폭 상한 | min(220, dist · 0.65) |
| 곡선 방향 | 50:50 확률 무작위 |
제어점 배치
| 제어점 | 위치 | 오프셋 |
|---|---|---|
| p1 | 시작점에서 이동 벡터의 30% 지점 | amp · (0.95 ± 0.15) 수직 + 진행방향 -18~18 px |
| p2 | 시작점에서 이동 벡터의 70% 지점 | amp · 0.70 · (1 ± 0.15) 수직 + 독립 진행방향 오프셋 |
의미 — 비대칭 제어점으로 자연스러운 S자형 곡선 생성. 각 제어점마다 미세 랜덤이 들어가서 매번 모양이 다릅니다.
5단 — 포인트별 떨림 주입
| 항목 | 값 |
|---|---|
| 포인트 수 | 14 ~ 110 (이동 시간 / dt_ms) |
| 기본 dt_ms | 10 ms |
| 떨림 방향 | 경로와 수직 방향으로만 |
| 떨림 분포 | N(0, σ) — σ는 2단에서 결정된 값 |
왜 수직 방향으로만 주입하나
| 이유 | 설명 |
|---|---|
| 생물학적 관찰 근거 | 사람의 손떨림은 목표 진행 방향과 수직인 축에서 주로 관찰됨 |
| 적중 정확성 유지 | 진행 방향 노이즈는 타이밍·착지점을 흐트러뜨림, 수직은 경로 모양만 흔듦 |
6단 — 역계산 검증
생성된 좌표 시퀀스
↓
실측 직선성·떨림 재계산
↓
감사 로그에 { 목표값, 실측값 } 함께 기록
용도 — 합성이 의도대로 됐는지 사후 확인. 실측값이 목표 분포 범위를 벗어나면 합성기 튜닝 필요.
포인트 간 타이밍
| 값 | 근거 |
|---|---|
| 0.3 ~ 0.9 ms (비균일) | 고성능 게이밍 마우스 폴링 주기(0.125 |
장거리 이동 최적화 — 숙련자 사전 위치 선점 모델
구역·좌석 버튼까지 수백 픽셀 이동 시 전 구간 곡선 합성은 누적 지연을 유발합니다. 이를 해결하기 위해 사전 위치 선점 모델을 적용합니다.
┌─────────────────────────────────────────────────┐
│ [1] 버튼 출현 전부터 타깃 예상 위치 근처로 │
│ 마우스 미리 이동 │
│ ↓ │
│ [2] 실제 버튼이 DOM에 나타남 │
│ ↓ │
│ [3] 짧은 보정 이동으로 클릭 │
└─────────────────────────────────────────────────┘
비유 — e-sports 프로의 pre-aim, 숙련 타이피스트의 홈 포지션과 같은 원리. 사람이 실제로 숙련된 상태에서 하는 행동을 모델링한 것입니다.
인간 샘플 수집
수집 방식
| 항목 | 내용 |
|---|---|
| 도구 | 브라우저에 스크립트 주입해 실제 사용자 마우스 이벤트 기록 |
| 수집 이벤트 | 이동, 누르기, 놓기 |
| 목표 규모 | 50개 이상 다양한 거리·방향 커버 |
| 수집 지침 | 일부러 "장인처럼 직선적이고 빠르게" 클릭 → 타깃 페르소나 분포 확보 |
| 저장 포맷 | 구조화된 샘플 파일 (궤적별 특성 지표) |
추출하는 특성 지표
| 지표 | 계산 방식 |
|---|---|
| 총 이동 거리 | 인접 포인트 간 유클리드 거리의 합 |
| 직선 거리 | 첫 포인트와 마지막 포인트의 유클리드 거리 |
| 직선성 | 직선 거리 / 총 이동 거리 |
| 평균 속도 | 총 이동 거리 / 소요 시간 |
| 경로 비율 | 총 이동 거리 / 직선 거리 |
| 머뭇거림 | 인접 세그먼트 이동 거리 ≤ 3 px 또는 속도 ≤ 30 px/s 구간 시간 누적 |
| 손떨림 표준편차 | 시작-끝점 선분에 대한 중간 포인트들의 수직 거리 표준편차 |
검증
실제 에이전트가 생성한 궤적이 수집 샘플 분포와 일치하는지 사후 검증합니다.
| 검증 항목 | 방식 |
|---|---|
| 직선성 분포 | 수집 샘플 p5~p95 범위 안에 에이전트 로그가 들어오는지 확인 |
| 떨림 분포 | 동일 방식으로 떨림 표준편차 검증 |
| 전체 분포 일치 | Kolmogorov-Smirnov 스타일 분포 일치 검증 |
기록되는 이벤트
| 이벤트 | 내용 |
|---|---|
TRAJ_SYNTH | 합성 완료 시점. 목표 지표(linearity, tremor)와 실측 지표 비교 |
참조
- 03-open-at-sync — 정각 타이밍 동기화
- 08-audit-evidence — 감사 로그 포맷