Tauri v2로 데스크톱 앱 만들기 — 3MB짜리 시크릿 매니저
Electron 대신 Tauri v2를 선택한 이유와, Rust 백엔드로 AES-256 암호화를 구현한 과정을 정리했습니다.
왜 Tauri인가
Electron은 훌륭하지만, 시크릿 매니저에는 과했다. Chromium 런타임을 포함하면 설치 파일이 150MB를 넘는다. 사용자가 API 키 몇 개를 저장하려고 150MB를 다운로드하는 건 말이 안 된다.
Tauri v2는 시스템 WebView를 사용한다. 결과적으로 KeyBox의 설치 파일은 3MB다.
후보 비교
세 가지 옵션을 두고 비교했다.
| 후보 | 설치 크기 | 장점 | 단점 |
|---|---|---|---|
| Electron | ~150 MB | 생태계 압도적, 호환성 검증됨 | 무겁다 |
| Tauri v2 | ~3 MB | 가볍고 안전, Rust 백엔드 | 플러그인 생태계 작음 |
| 네이티브(C# WPF) | ~50 MB | OS 통합 깊음 | Windows 전용, 학습 곡선 |
오프라인 보안 도구는 “설치 파일 크기 = 신뢰도”에 가깝다는 판단이었다. 사용자가 다운로드 버튼을 누르고 3MB와 150MB 중 무엇에 더 안심하겠는가.
기술 스택
- Frontend: React + TypeScript — 익숙한 스택으로 빠르게 UI 구현
- Backend: Rust — 보안이 핵심인 앱에서 메모리 안전성은 필수
- 암호화: AES-256-GCM — 마스터 패스워드에서 키를 파생(PBKDF2, 100,000 iterations)
- 저장소: SQLite — 로컬 전용, 네트워크 불필요
Tauri v2의 달라진 점
v1에서 v2로 넘어오면서 가장 큰 변화는 플러그인 시스템이다. 이전에는 Rust 커맨드를 직접 정의했지만, v2에서는 플러그인으로 구조화할 수 있다.
// Tauri v2 플러그인 패턴
#[tauri::command]
fn encrypt(data: &str, key: &str) -> Result<String, String> {
// AES-256-GCM 암호화
crypto::encrypt_aes256(data, key)
.map_err(|e| e.to_string())
}
IPC 통신도 개선됐다. invoke 호출이 타입 안전해졌고, 프론트엔드에서 Rust 함수를
호출할 때 자동 완성이 된다.
키 파생 — 왜 PBKDF2를 골랐나
마스터 패스워드를 그대로 키로 쓸 수는 없다. 너무 짧고, 엔트로피가 부족하다. 키 파생 함수(KDF)가 필요했고, 옵션은 PBKDF2 / scrypt / Argon2 셋이었다.
| KDF | 메모리 사용 | GPU 공격 저항 | Rust 라이브러리 성숙도 |
|---|---|---|---|
| PBKDF2 | 낮음 | 중간 | 매우 안정적 |
| scrypt | 중간 | 높음 | 안정적 |
| Argon2 | 높음 | 가장 높음 | 비교적 새로움 |
KeyBox는 데스크톱 앱이고 키 파생을 자주 하지 않으니(앱 시작 시 1회) 메모리 사용은 중요하지 않았다. PBKDF2 100,000 iterations로도 무차별 대입에 충분히 저항한다는 판단이었고, 성숙한 라이브러리를 우선했다.
use pbkdf2::pbkdf2_hmac;
use sha2::Sha256;
fn derive_key(password: &str, salt: &[u8]) -> [u8; 32] {
let mut key = [0u8; 32];
pbkdf2_hmac::<Sha256>(password.as_bytes(), salt, 100_000, &mut key);
key
}
빌드 사이즈 비교
| 프레임워크 | 설치 파일 | 메모리 사용 | 콜드 스타트 |
|---|---|---|---|
| Electron | ~150 MB | ~200 MB | 1.2초 |
| Tauri v2 | ~3 MB | ~30 MB | 0.4초 |
50배 차이다. 특히 오프라인 전용 도구에서 이 차이는 사용자 경험에 직접 영향을 준다.
빠진 것 — Tauri의 한계
장점만 있는 건 아니다. 작업하면서 부딪힌 것들:
- 시스템 WebView 의존성 — Windows 11은 Edge WebView2가 기본 포함이지만, 구버전 Windows에서는 별도 설치가 필요할 수 있다.
- 플러그인 생태계 — Electron만큼 넓지 않다. 트레이 아이콘·자동 업데이트·시스템 알림은 Tauri 공식 플러그인으로 충분했지만, 특수한 기능은 직접 구현해야 한다.
- 디버깅 도구 — Electron의 Chrome DevTools 통합만큼 매끄럽지 않다. Rust 쪽 디버깅은 별도 IDE 설정이 필요하다.
이 한계들은 보안 도구라는 KeyBox의 특성상 큰 문제가 안 됐다. 자동 업데이트는 오프라인 도구에 불필요했고, 트레이·알림은 공식 플러그인으로 해결됐다.
마무리
Tauri v2는 “웹 기술로 데스크톱 앱”이라는 약속을 Electron보다 훨씬 가볍게 지킨다. 보안이 중요한 소규모 도구를 만든다면 고려해볼 가치가 있다. 다만 풍부한 생태계가 필요한 큰 앱이라면 여전히 Electron이 안전한 선택이다.
KeyBox 코드는 GitHub에 공개돼 있다. 보안 도구는 코드를 검증할 수 있어야 한다는 원칙에서다.