네이티브 스토리지
안전한 네이티브 키-값 저장소 — TEMP / PERM / SECURE 3단계
개요
Storage Bridge는 웹에서 네이티브 저장소에 데이터를 읽고 쓸 수 있게 합니다. Android와 iOS에서 동일한 JS API를 사용합니다.
| 타입 | 저장 방식 | 초기화 시점 | 용도 |
|---|---|---|---|
TEMP | 인메모리 (Map) | 앱 재시작 시 삭제 | 세션 중 임시 상태 |
PERM | SharedPreferences (Android) / UserDefaults (iOS) | 앱 삭제 또는 clearData 호출 시 | 사용자 설정, 비민감 데이터 |
SECURE | EncryptedSharedPreferences (Android) / Keychain (iOS) | 앱 삭제 또는 clearSecureData 호출 시 | 토큰, 세션, PII 등 민감 데이터 |
저장소는 앱별로 격리됩니다. 다른 앱에서 접근할 수 없습니다.
SECURE 티어: Android는 AndroidKeyStore 기반 AES256-GCM 암호화, iOS는 Secure Enclave 기반 Keychain을 사용합니다. 두 플랫폼 모두 하드웨어 보안 모듈로 보호됩니다.
API
saveData
데이터를 저장합니다.
window.unveilyBridge.saveData(key, value, type)
// type: "TEMP" | "PERM" | "SECURE"// 임시 저장 (세션 중에만 유지)
window.unveilyBridge.saveData("sessionStep", "2", "TEMP");
// 영구 저장 (앱 재시작 후에도 유지)
window.unveilyBridge.saveData("theme", "dark", "PERM");
// 보안 저장 (암호화 — 토큰, 민감 정보)
window.unveilyBridge.saveData("accessToken", "eyJ...", "SECURE");loadData
데이터를 동기적으로 불러옵니다. SECURE 타입에는 사용 불가 — loadSecureData를 사용하세요.
const value = window.unveilyBridge.loadData(key, type)
// type: "TEMP" | "PERM"
// 반환값: 저장된 문자열, 없으면 ""const theme = window.unveilyBridge.loadData("theme", "PERM");
if (theme === "dark") applyDarkMode();loadSecureData
SECURE 저장소에서 비동기로 불러옵니다.
window.unveilyBridge.loadSecureData(key, callbackFunctionName)window.unveilyBridge.loadSecureData("accessToken", "onTokenLoaded");
function onTokenLoaded(result) {
if (result.success) {
console.log("토큰:", result.value);
} else {
console.log("저장된 토큰 없음");
}
}콜백 응답 구조
{ "success": true, "value": "eyJ..." }
{ "success": false, "value": null }loadData(key, "SECURE")는 항상 빈 문자열을 반환합니다. SECURE 저장소 읽기는 반드시 loadSecureData를 사용하세요.
removeData
특정 키의 데이터를 삭제합니다.
window.unveilyBridge.removeData(key, type)
// type: "TEMP" | "PERM" | "SECURE"window.unveilyBridge.removeData("theme", "PERM");
window.unveilyBridge.removeData("accessToken", "SECURE");clearData
TEMP / PERM 전체를 초기화합니다.
window.unveilyBridge.clearData(type)
// type: "TEMP" | "PERM" | "ALL"window.unveilyBridge.clearData("TEMP"); // 임시 저장 전체 삭제
window.unveilyBridge.clearData("PERM"); // 영구 저장 전체 삭제
window.unveilyBridge.clearData("ALL"); // TEMP + PERM 모두 삭제clearData는 SECURE 저장소에 영향을 주지 않습니다. SECURE 데이터를 삭제하려면 clearSecureData를 사용하세요.
clearSecureData
SECURE 저장소에서 특정 키들을 삭제합니다.
window.unveilyBridge.clearSecureData(keysJson)
// keysJson: 삭제할 키 목록 JSON 배열 문자열// 로그아웃 시 인증 관련 키 삭제
window.unveilyBridge.clearSecureData(JSON.stringify(["accessToken", "refreshToken"]));사용 패턴
로그인 / 로그아웃
// 로그인 성공 후 — 토큰은 SECURE에 저장
async function onLoginSuccess(token, user) {
window.unveilyBridge.saveData("accessToken", token, "SECURE");
window.unveilyBridge.saveData("userProfile", JSON.stringify(user), "PERM");
}
// 앱 시작 시 — SECURE는 비동기로 로드
function checkAuth() {
window.unveilyBridge.loadSecureData("accessToken", "onAuthChecked");
}
function onAuthChecked(result) {
if (result.success && result.value) {
// 자동 로그인 처리
initApp(result.value);
} else {
showLoginScreen();
}
}
// 로그아웃 시 — 인증 데이터 삭제
function logout() {
window.unveilyBridge.clearSecureData(JSON.stringify(["accessToken", "refreshToken"]));
window.unveilyBridge.removeData("userProfile", "PERM");
}글루 준비 후 초기화
window.addEventListener("unveilyGlueReady", () => {
// 브릿지 준비 완료 후 저장소 접근
checkAuth();
});