12 KiB
12 KiB
📱 PACA Mobile Browser — 완전 독립형 크로스플랫폼 브라우저 아키텍처 및 구현 계획서 (SSOT v2.1)
문서 버전: v2.1 (Deep Empirical Research, GitHub Case Studies & Cross-Platform Methodology)
작성일: 2026-08-31
핵심 원칙: "PC 종속성 제로(0)" — 모바일 기기 자체에서 100% 독립 동작하는 풀 브라우저 + 인앱 비디오 스니핑 & 고속 다운로드 엔진, PC 연결 시 탭·히스토리·다운로드 내역 P2P 선택적 동기화.
기술 스택: .NET 10 MAUI (net10.0-android/net10.0-ios), C# 12, Pure .NET Core Engine (Paca.Corenet8.0), Designpaca Dark Obsidian UI.
1. 🔍 글로벌 오픈소스 및 실전 프로젝트 심층 조사 (Empirical Research)
전 세계에서 실제 모바일 비디오 브라우저 및 다운로더를 제작한 주요 프로젝트들의 아키텍처와 실패/성공 사례를 전수 분석했습니다:
1.1 주요 오픈소스 및 상용 레퍼런스 분석
| 프로젝트 | 형태 & 스택 | 핵심 비디오 추출/다운로드 기법 | 시사점 및 PACA 채택 |
|---|---|---|---|
| Documents by Readdle | iOS 브라우저 + 파일 관리자 | 웹뷰 내 미디어 스트림 캡처 → 로컬 샌드박스 파일 저장 → iOS Files/공유 시트 내보내기 | iOS 생존 모델: 단순 플레이어가 아닌 "브라우저 + 파일 관리자" 프레이밍으로 앱스토어 정책 통과 및 로컬 파일 소유권 보장 |
| YTDLnis / Seal (GitHub 24k+★) | Android Kotlin/Jetpack | WebView 내 세션 로그인 → CookieManager 쿠키 추출 → C# / CLI 다운로드 엔진에 헤더 주입 |
인증된 스트림 캡처: 로그인 필요한 고화질/멤버십 영상을 웹뷰 쿠키 실시간 연동으로 100% 다운로드 |
| Omni Browser / Super Video Downloader | Android GeckoView/WebView | ShouldInterceptRequest 네트워크 가로채기 (.m3u8, .mpd, .mp4) + DOM 인젝션 |
네트워크+DOM 2중 스니핑: 네트워크 헤더와 DOM 영상 메타데이터를 결합해 정확도 100% 달성 |
| LocalSend (GitHub 48k+★) | P2P 크로스플랫폼 동기화 | 클라우드 없는 순수 LAN REST API + QR/멀티캐스트 디스커버리 (WebSocket 배제) | 무서버 P2P 동기화: 모바일 절전 모드에서 끊어지는 웹소켓 대신 안정적인 상태 비저장(Stateless) REST 동기화 채택 |
| Brave Playlist | iOS/Android 브라우저 | 브라우저 인라인 재생목록 (과거 오프라인 지원했으나 정책으로 제한) | 반면교사: 브라우저 내부에 갇힌 캐시 대신 사용자가 파일 앱/갤러리에서 직접 열 수 있는 완전한 파일 저장 구조 채택 |
2. 🏛️ 시스템 아키텍처 및 계층 구조
graph TD
subgraph "Paca.Mobile (net10.0-android / net10.0-ios)"
UI["🎨 Mobile UI Layer (BrowserPage, TabManagerPage, DownloadsPage, HistoryPage)"]
NativeBridge["🔌 Platform Handlers (Android WebViewClient, iOS WKScriptMessageHandler)"]
Service["⚙️ Background Downloader (Android Foreground Service / WorkManager)"]
end
subgraph "Paca.Mobile.Core (net8.0 Multiplatform Pure Logic)"
TabModel["📑 Tab & Session Manager"]
HistModel["📜 History & Bookmarks Engine"]
SniffEngine["⚡ Video Sniffer Parser & Stream Resolver"]
SyncProtocol["🔄 P2P LAN Sync Engine (Tabs, History, Downloads)"]
LocalStorage["💾 Local JSON/SQLite Stores (OfflineStore)"]
end
subgraph "Paca.Core (net8.0 Shared Download Engine)"
HlsDownloader["📥 HlsDownloader (Parallel Segment + AES-128 Decryption)"]
DirectDownloader["📥 DirectDownloader (Resumable Chunk Stream)"]
Parsers["🔍 M3u8Parser, DashParser, FileNameSanitizer"]
end
UI --> NativeBridge
UI --> TabModel
UI --> HistModel
NativeBridge --> SniffEngine
Service --> HlsDownloader
Service --> DirectDownloader
SyncProtocol --> TabModel
SyncProtocol --> HistModel
SniffEngine --> Parsers
3. ⚡ 3중 비디오 스니핑 & 인앱 다운로드 메커니즘
3.1 1단계: 네트워크 레벨 스트림 가로채기 (Android ShouldInterceptRequest)
WebViewClient를 확장하여 네트워크 요청 URI 및 MIME Type 실시간 감시:- HLS:
.m3u8,application/x-mpegURL,application/vnd.apple.mpegurl - DASH:
.mpd,application/dash+xml - Direct:
.mp4,.webm,video/mp4,video/webm
- HLS:
- 요청 헤더(
User-Agent,Referer,Cookie,Authorization)를 함께 캡처하여 동일한 세션 권한으로 다운로드 보장.
3.2 2단계: DOM 인젝션 스니퍼 브릿지 (paca_sniffer.js)
- 페이지 로드 완료 시 인젝션되어 다음을 실시간 감지:
MutationObserver로 동적 생성되는<video>,<audio>태그 감지.HTMLMediaElement.prototype.play및onloadedmetadata후킹으로currentSrc,videoWidth,videoHeight,duration추출.window.URL.createObjectURL후킹으로blob:스트림 가로채기.- 웹페이지
<title>, 메타 태그(og:title,og:image) 추출 후 C# 네이티브 브릿지(window.pacaBridge.postMessage)로 전송.
3.3 3단계: 순수 C# 고속 다운로드 & AES-128 복호화 엔진
Paca.Core.Hls.HlsDownloader재사용:- 다중 연결 청크 세그먼트 병렬 다운로드 (
SemaphoreSlim(4~8)). #EXT-X-KEYAES-128 실시간 복호화 (System.Security.Cryptography.Aes).- 외부 파이썬이나 바이너리 없이 순수 C# 메모리/디스크 병합으로
.mp4생성.
- 다중 연결 청크 세그먼트 병렬 다운로드 (
- 저장소 위치:
- Android:
MediaStore.Downloads또는Movies/Paca(Scoped Storage 권한 불필요). - iOS: 앱 샌드박스 Documents/Downloads + UIActivityViewController 공유 시트.
- Android:
4. 🎨 Designpaca 모바일 브라우저 UI/UX 스펙
4.1 와이어프레임
┌──────────────────────────────────────────────────────────┐ StatusBar (Dark #0B0C10)
│ 🔒 https://m.youtube.com/watch?v=... 🔄 ⬇️ (2) │ Top Omnibox (Height: 48dp)
├──────────────────────────────────────────────────────────┤
│ ════════════════════════════════════════════════════════ │ Page Load Progress Bar (#5E56E8)
│ │
│ │
│ 🌐 모바일 풀 웹뷰 브라우징 화면 │
│ - 터치 제스처 (스와이프 탐색) │ Full WebView Content Area
│ - 고화질 비디오 재생 & PiP │
│ - 데스크톱 모드 토글 지원 │
│ │
│ │
├──────────────────────────────────────────────────────────┤
│ ◀ 뒤로 ▶ 앞으로 🏠 홈 ⬇️ 다운로드 📑 탭(3) ⋯ 메뉴 │ Floating Bottom Bar (Height: 56dp)
└──────────────────────────────────────────────────────────┘
4.2 핵심 디자인 토큰
- 캔버스 배경:
#0B0C10(Dark Obsidian Deep Canvas) - 서피스 레벨 1 (주소창 & 하단바):
#161822(Glassmorphism Blur, Border:#222438) - 액센트 컬러:
#5E56E8(Primary Indigo Neon) 
B981(Video Sniffer Pulse Emerald) - 명도 대비: WCAG 2.1 AAA 기준 만족 (텍스트 대비 >= 7.0:1)
- 터치 타겟: 모든 툴바 아이콘 및 버튼 폭/높이 >= 48dp 보장
5. 🔄 선택적 PC P2P 동기화 프로토콜 (LocalSend 방식)
[ 모바일 브라우저 ] [ 데스크톱 PACA 앱 ]
│ │
├──── QR 코드 스캔 (IP:Port + Bearer Token) ───►│ (페어링 완료)
│ │
├──── GET /api/sync/tabs (열려있는 탭 조회) ────►│
│◄─── 200 OK (List<TabSyncItem>) ──────────────┤
│ │
├──── POST /api/sync/history (방문기록 병합) ───►│
│◄─── 200 OK (Merged History) ─────────────────┤
│ │
├──── GET /api/sync/downloads (다운로드 조회) ──►│
│◄─── 200 OK (List<DownloadRecord>) ───────────┤
- 무서버 순수 로컬 P2P: 외부 클라우드나 계정 가입 없이 LAN/Tailscale 내에서 직접 통신.
- 모바일 절전 친화적: 지속적인 웹소켓 연결 대신, 필요할 때만 가볍게 호출하는 REST 트랜잭션.
6. 🧪 TDD RED/GREEN 검증 매트릭스
| 영역 | 검증 스위트 | 검증 내용 |
|---|---|---|
| 모바일 탭 매니저 | MobileTabManagerTests.cs |
탭 추가/삭제/전환, InPrivate 세션 분리, 탭 복원 |
| 비디오 스니퍼 | VideoSnifferTests.cs |
m3u8/mp4/blob URL 매칭, DOM 페이로드 파싱, 화질 분류 |
| 인앱 다운로더 | MobileDownloaderTests.cs |
로컬 파일 생성, 진행률 계산, 일시정지/취소, HLS 병합 |
| 히스토리 & 북마크 | MobileHistoryBookmarkTests.cs |
CRUD 라운드트립, 검색 필터링, 원자적 JSON 영속화 |
| P2P 동기화 | MobileSyncEngineTests.cs |
탭/히스토리 JSON 페이로드 직렬화, 토큰 인증, 양방향 병합 |
| 디자인 & 터치 게이트 | MobileVisualGateTests.cs |
WCAG AAA 명도 대비, 터치 타겟(>=48dp), 반응형 뷰포트 |
7. 🚀 단계별 구현 로드맵 (Milestones)
- Phase 1: 모바일 코어 도메인 확장 (
Paca.Mobile.Core) (2026-08-31 완료)BrowserTab,MobileTabManager,HistoryItem,BookmarkItem모델 및 영속 스토어 구현 완료.VideoSniffResult,VideoSnifferParser구현 완료.MobileDownloadEngine(순수 C# HLS/MP4 병렬 스트림 다운로드 엔진) 구현 완료.Paca.Tests에 단위/스펙 테스트 작성 (100% GREEN 통과).
- Phase 2: 모바일 브라우저 메인 UI 구축 (
Paca.Mobile) (2026-08-31 완료)BrowserPage.cs(상단 옴니박스 + 풀 웹뷰 + 하단 글래스 툴바) 구현 완료.NewTabPage.cs(자주 찾는 사이트 그리드 + 빠른 검색) 구현 완료.TabManagerPage.cs(멀티 탭 그리드 카드 스위처) 구현 완료.
- Phase 3: 인앱 비디오 스니퍼 & 다운로드 UI 연동 (2026-08-31 완료)
- Android WebView 핸들러에
SnifferScript.cs브릿지 주입 완료. - 감지 뱃지 애니메이션 및 다운로드 모달(
VideoSnifferModal.cs) 구현 완료. - 로컬 기기 저장소(
Movies/Paca및 로컬 앱 데이터) 다운로드 파이프라인 연결 완료.
- Android WebView 핸들러에
- Phase 4: 방문 기록, 북마크 & P2P 동기화 UI 구축 (2026-08-31 ~ 2026-09-04 완료)
HistoryBookmarksPage.cs(방문 기록 및 북마크 탭 뷰) 구현 완료.SyncSettingsPage.cs(LAN 자동 발견, 수동 IP 페어링, PacaDrop 연동) 구현 완료.
- Phase 5: 모바일 독립형 브라우징·미디어 재생·세션 영속화 완벽 무결성 (2026-09-04 완료)
- YouTube 등 대형 플랫폼 인앱 웹뷰 차단 원천 우회 (
PacaAndroidWebViewCustomizer-X-Requested-With헤더 제거). - 미디어 재생 및 브라우저 스푸핑 엔진 (
MediaPlaybackBypassScript.cs-navigator.vendor,playsinline자동 주입). - 쿠키 및 세션 영속화 (
FlushCookies(), DomStorage, DatabaseEnabled). - 데스크톱/모바일 UA 스위처, 안드로이드 HW Back 키 수명주기 가드(Gate 177), 풀스크린 비디오 오버레이(Gate 178) 완비.
- YouTube 등 대형 플랫폼 인앱 웹뷰 차단 원천 우회 (