본문으로 건너뛰기
Unveilydocs

네이티브 스토리지

안전한 네이티브 키-값 저장소 — TEMP / PERM / SECURE 3단계

개요

Storage Bridge는 웹에서 네이티브 저장소에 데이터를 읽고 쓸 수 있게 합니다. Android와 iOS에서 동일한 JS API를 사용합니다.

타입저장 방식초기화 시점용도
TEMP인메모리 (Map)앱 재시작 시 삭제세션 중 임시 상태
PERMSharedPreferences (Android) / UserDefaults (iOS)앱 삭제 또는 clearData 호출 시사용자 설정, 비민감 데이터
SECUREEncryptedSharedPreferences (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();
});

On this page