Cordova SDK - 데이터 개인 정보 보호

문서

데이터 개인정보 보호법 준수

GDPR, CCPA, COPPA 및 기타 소비자 개인정보 보호 규정에 대한 사용자 동의 선택 사항을 Singular에 알림으로써 개인정보 보호 규정을 준수하는 데이터 수집을 구현하세요.

사용자가 제3자와의 정보 공유에 동의하거나 거부할 경우, Singular의 개인정보 보호 방법을 사용하여 사용자의 선택 사항을 전달하세요. 이를 통해 캘리포니아 소비자 개인정보 보호법(CCPA)과 같은 규정을 준수하고 파트너가 사용자의 개인정보 보호 기본 설정을 존중할 수 있습니다.

자세히 알아보기: Singular가 개인정보 동의를 처리하는 방법에 대한 자세한 내용은 사용자 개인정보 보호 및 데이터 공유 제한을참조하세요.


데이터 공유 제한

타사 데이터 공유 제어

limitDataSharing() 방법을 사용하여 사용자가 타사 파트너와 개인 데이터를 공유하는 데 동의했는지 여부를 Singular에 알립니다.

메소드 서명:

cordova.plugins.SingularCordovaSdk.limitDataSharing(
  shouldLimitDataSharing: boolean
): void

매개변수:

  • false: 사용자가 데이터 공유에 동의하고 옵트인했습니다.
  • true: 사용자가 옵트아웃했으며 데이터 공유에 동의하지 않음

중요: 선택 사항이지만, 이 방법은 어트리뷰션 데이터 공유에 영향을 줍니다. 일부 파트너는 사용자가 옵트인했음을 명시적으로 통지한 경우에만 전체 어트리뷰션 정보를 공유합니다.

전체 메서드 설명서는 limitDataSharing 참조를 참조하세요.


사용 예시

사용자 개인정보 기본 설정에 따라 데이터 공유 제어를 구현합니다.

JavaScript
document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady() {
  // User has opted in to share their data
  var onUserOptedInToDataSharing = function() {
    cordova.plugins.SingularCordovaSdk.limitDataSharing(false);
    console.log('Data sharing enabled');
  };
  
  // User has opted out and declined to share their data
  var onUserOptedOutOfDataSharing = function() {
    cordova.plugins.SingularCordovaSdk.limitDataSharing(true);
    console.log('Data sharing limited');
  };
  
  // Set based on user preference
  var handlePrivacyConsent = function(userConsented) {
    // Pass inverse: false = opted in, true = opted out
    cordova.plugins.SingularCordovaSdk.limitDataSharing(!userConsented);
    
    console.log('Data sharing: ' + (userConsented ? 'Enabled' : 'Limited'));
  };
  
  // Example: Ask user for consent
  askUserForPrivacyConsent(function(consented) {
    handlePrivacyConsent(consented);
  });
}

function askUserForPrivacyConsent(callback) {
  // Show custom dialog to user
  if (confirm('Do you consent to share your data with third parties?')) {
    callback(true);
  } else {
    callback(false);
  }
}

작동 방식:

Singular는 사용자 개인정보 보호 포스트백에서이 설정을 사용하여 규정 준수를 위해 이 설정이 필요한 파트너에게 전달합니다.


GDPR 준수 방법

사용자 추적 동의를 관리하고 SDK 기능을 제어하여 GDPR(일반 데이터 보호 규정) 및 기타 개인정보 보호 규정을 준수합니다.

추적 동의 관리

TrackingOptIn

Singular 서버에 GDPR 옵트인 이벤트를 전송하여 추적에 대한 명시적인 사용자 동의를 기록합니다.

메서드 서명:

cordova.plugins.SingularCordovaSdk.trackingOptIn(): void

사용 시기:

  • GDPR 준수: 사용자가 GDPR 규제 지역에서 추적에 명시적으로 동의할 때 호출합니다.
  • 동의 기록: 사용자가 Singular의 시스템에서 GDPR 동의를 제공한 것으로 표시합니다.
  • 기본 동작: 이 호출이 없으면 SDK는 추적을 계속하지만 동의를 구체적으로 기록하지 않습니다.

전체 메서드 문서는 trackingOptIn 참조를 참조하세요.


구현 예시

사용자가 앱의 동의 대화 상자를 통해 추적 동의를 수락한 후 trackingOptIn() 으로 호출합니다.

JavaScript
document.addEventListener('deviceready', initializeGDPR, false);

function initializeGDPR() {
  checkStoredConsent();
}

function checkStoredConsent() {
  // Check if user has previously provided consent
  var consent = localStorage.getItem('gdpr_consent');
  
  if (consent === null) {
    // No stored preference - show consent dialog
    showGDPRConsentDialog();
  } else if (consent === 'true') {
    // User previously consented - apply setting
    onUserAcceptedTracking();
  }
}

function showGDPRConsentDialog() {
  // Show custom dialog to user
  var message = 'We would like your permission to track app usage and improve your experience.';
  
  if (confirm(message)) {
    onUserAcceptedTracking();
  } else {
    onUserDeclinedTracking();
  }
}

function onUserAcceptedTracking() {
  // Record user consent with Singular
  cordova.plugins.SingularCordovaSdk.trackingOptIn();
  console.log('User opted in to tracking');
  
  // Save preference locally
  localStorage.setItem('gdpr_consent', 'true');
}

function onUserDeclinedTracking() {
  console.log('User declined tracking');
  localStorage.setItem('gdpr_consent', 'false');
}

추적 제어 메서드

StopAllTracking

이 디바이스에서 현재 사용자에 대한 모든 SDK 추적 활동을 완전히 비활성화합니다.

메소드 서명:

cordova.plugins.SingularCordovaSdk.stopAllTracking(): void

심각 중요: 이 메서드는 resumeAllTracking() 이 호출될 때까지 SDK를 영구적으로 비활성화합니다. 비활성화 상태는 앱을 다시 시작할 때에도 유지되며 프로그래밍 방식으로만 되돌릴 수 있습니다.

동작:

  • 즉각적인 효과: 모든 추적, 이벤트 보고 및 데이터 수집을 즉시 중지합니다.
  • 영구 상태: 앱을 닫았다가 다시 열어도 비활성화 상태로 유지됨
  • 자동 재설정 없음: 다시 활성화하려면 resumeAllTracking() 을 명시적으로 호출해야 합니다.

전체 메서드 문서는 stopAllTracking 참조를 참조하세요.


구현 예시

사용자가 동의를 거부하거나 개인정보 설정을 통해 옵트아웃하면 추적을 중지합니다.

JavaScript
// User declined all tracking
function onUserDeclinedTracking() {
  cordova.plugins.SingularCordovaSdk.stopAllTracking();
  console.log('All tracking stopped');
  
  // Store preference
  localStorage.setItem('tracking_enabled', 'false');
}

// Handle user opt-out from settings menu
function handlePrivacySettingsChange(trackingEnabled) {
  if (!trackingEnabled) {
    cordova.plugins.SingularCordovaSdk.stopAllTracking();
    console.log('Privacy settings: Tracking disabled');
    localStorage.setItem('tracking_enabled', 'false');
  }
}

ResumeAllTracking

stopAllTracking() 으로 추적을 중지한 후 다시 활성화합니다.

메서드 서명:

cordova.plugins.SingularCordovaSdk.resumeAllTracking(): void

사용 사례:

  • 동의 변경: 사용자가 개인정보 기본 설정을 변경하고 추적을 다시 선택함
  • 개인정보 설정: 사용자가 앱 설정 메뉴를 통해 동의를 업데이트합니다.
  • 지역 규정 준수: 사용자가 비규제 지역으로 이동하는 경우 추적을 다시 활성화합니다.

전체 메서드 설명서는 resumeAllTracking 참조를 참조하세요.


구현 예시

사용자가 다시 옵트인하거나 개인정보 기본 설정을 업데이트하면 추적을 재개합니다.

JavaScript
// User opted back in to tracking
function onUserResumedTracking() {
  cordova.plugins.SingularCordovaSdk.resumeAllTracking();
  console.log('Tracking resumed');
  
  // Update stored preference
  localStorage.setItem('tracking_enabled', 'true');
}

// Handle consent update from settings
function handlePrivacySettingsChange(trackingEnabled) {
  if (trackingEnabled) {
    cordova.plugins.SingularCordovaSdk.resumeAllTracking();
    console.log('Privacy settings: Tracking enabled');
    localStorage.setItem('tracking_enabled', 'true');
  }
}

IsAllTrackingStopped

현재 사용자에 대한 추적이 비활성화되었는지 확인합니다.

메서드 서명:

cordova.plugins.SingularCordovaSdk.isAllTrackingStopped(
  success: Function
): void

반환합니다:

  • true: 현재 stopAllTracking()을 통해 추적이 중지되었습니다.
  • false: 추적이 활성 상태입니다(중지되지 않았거나 재개되지 않았습니다).

전체 메서드 문서는 isAllTrackingStopped 참조를 참조하세요.


구현 예제

추적 상태를 확인하여 UI 상태를 SDK 추적 상태와 동기화합니다.

JavaScript
document.addEventListener('deviceready', initializePrivacyUI, false);

function initializePrivacyUI() {
  updatePrivacyUI();
}

// Check current tracking status
function isTrackingEnabled(callback) {
  cordova.plugins.SingularCordovaSdk.isAllTrackingStopped(function(isStopped) {
    callback(!isStopped);
  });
}

// Display privacy status in settings
function getPrivacyStatusText(callback) {
  cordova.plugins.SingularCordovaSdk.isAllTrackingStopped(function(isStopped) {
    var text = isStopped ? 'Tracking: Disabled' : 'Tracking: Enabled';
    callback(text);
  });
}

// Sync UI with tracking state
function updatePrivacyUI() {
  cordova.plugins.SingularCordovaSdk.isAllTrackingStopped(function(isStopped) {
    var statusElement = document.getElementById('tracking-status');
    var toggleElement = document.getElementById('tracking-toggle');
    
    if (statusElement) {
      statusElement.textContent = isStopped ? 'Tracking: Disabled' : 'Tracking: Enabled';
    }
    
    if (toggleElement) {
      toggleElement.checked = !isStopped;
    }
    
    console.log('Current tracking state: ' + (isStopped ? 'Stopped' : 'Active'));
  });
}

// Handle toggle change from UI
function onTrackingToggleChanged(enabled) {
  if (enabled) {
    cordova.plugins.SingularCordovaSdk.resumeAllTracking();
  } else {
    cordova.plugins.SingularCordovaSdk.stopAllTracking();
  }
  
  updatePrivacyUI();
}

어린이 개인정보 보호

사용자가 13세 미만인 경우 Singular에 알림을 전송하여 COPPA(아동 온라인 개인정보 보호법) 준수를 구현하고 아동의 개인정보를 보호합니다.

13세 미만 추적

아동 개인정보 보호 사용

사용자가 13세 미만임을 Singular에 알려 COPPA 및 기타 아동 개인정보 보호 규정을 준수합니다.

메소드 서명:

cordova.plugins.SingularCordovaSdk.trackingUnder13(): void

규정 준수 요구 사항:

  • COPPA 준수: 미국에서 13세 미만 아동의 데이터를 수집하는 앱에 필수입니다.
  • 연령 제한 콘텐츠: 등록 또는 연령 확인 시 사용자가 13세 미만임을 확인할 때 사용합니다.
  • 제한된 추적: 아동 개인정보 보호법을 준수하기 위해 데이터 수집을 제한합니다.

전체 메서드 문서는 13세 미만 추적 참조를 참조하세요.


구현 예시

연령 확인을 통해 사용자가 13세 미만인 것으로 확인되면 즉시 trackingUnder13() 으로 연락하세요.

JavaScript
document.addEventListener('deviceready', initializeCOPPA, false);

function initializeCOPPA() {
  // Check if user's age was previously verified
  var ageCategory = localStorage.getItem('user_age_category');
  
  if (ageCategory === 'under_13') {
    applyChildPrivacyProtections();
  }
}

// User identified as under 13
function onUserUnder13() {
  cordova.plugins.SingularCordovaSdk.trackingUnder13();
  console.log('COPPA mode enabled for user under 13');
  
  // Store age category for app restart
  localStorage.setItem('user_age_category', 'under_13');
}

// Call after age verification
function onAgeVerified(userAge) {
  if (userAge < 13) {
    cordova.plugins.SingularCordovaSdk.trackingUnder13();
    console.log('COPPA restrictions applied');
    
    // Also limit advertising identifiers
    cordova.plugins.SingularCordovaSdk.setLimitAdvertisingIdentifiers(true);
    
    localStorage.setItem('user_age_category', 'under_13');
    
    alert('Special privacy protections have been applied to your account.');
  } else {
    localStorage.setItem('user_age_category', 'adult');
    console.log('Adult account - standard tracking');
  }
}

// Example: Age verification form
function handleAgeSubmit() {
  var ageInput = document.getElementById('age-input');
  var userAge = parseInt(ageInput.value, 10);
  
  if (isNaN(userAge) || userAge < 1 || userAge > 120) {
    alert('Please enter a valid age.');
    return;
  }
  
  onAgeVerified(userAge);
}

// Apply all child privacy protections
function applyChildPrivacyProtections() {
  cordova.plugins.SingularCordovaSdk.trackingUnder13();
  cordova.plugins.SingularCordovaSdk.setLimitAdvertisingIdentifiers(true);
  console.log('Child privacy protections applied');
}

모범 사례: 사용자의 나이를 확인한 후 가능한 한 빨리 trackingUnder13()으로 연락하세요. 종합적인 아동 개인정보 보호를 위해 setLimitAdvertisingIdentifiers(true) 와 결합하세요.


완벽한 개인정보 보호 구현

영구 저장 및 UI 동기화를 통해 GDPR, CCPA, COPPA를 준수하는 포괄적인 개인정보 보호 관리를 구현하세요.

전체 구현 예시

개인정보 관리자 모듈

모든 개인정보 보호 설정 초기화 및 지속성을 처리하는 재사용 가능한 개인정보 보호 관리 모듈을 생성하세요.

JavaScript
// Privacy Manager Module
var PrivacyManager = {
  // Storage keys
  PREF_USER_CONSENT: 'privacy_user_consent',
  PREF_DATA_SHARING: 'privacy_data_sharing',
  PREF_AGE_CATEGORY: 'user_age_category',
  
  /**
   * Initialize privacy settings on app startup
   */
  initialize: function() {
    var hasUserConsent = this.getUserConsent();
    var allowDataSharing = this.getDataSharingPreference();
    var ageCategory = this.getAgeCategory();
    
    // Apply age-based restrictions first
    if (ageCategory === 'under_13') {
      cordova.plugins.SingularCordovaSdk.trackingUnder13();
      cordova.plugins.SingularCordovaSdk.setLimitAdvertisingIdentifiers(true);
      console.log('COPPA restrictions applied on startup');
    }
    
    // Apply stored tracking preference
    if (hasUserConsent) {
      cordova.plugins.SingularCordovaSdk.trackingOptIn();
      cordova.plugins.SingularCordovaSdk.resumeAllTracking();
      console.log('Privacy initialized: Tracking enabled with consent');
    } else {
      cordova.plugins.SingularCordovaSdk.stopAllTracking();
      console.log('Privacy initialized: Tracking disabled');
    }
    
    // Set data sharing preference (inverse logic)
    cordova.plugins.SingularCordovaSdk.limitDataSharing(!allowDataSharing);
    
    console.log('Privacy initialized: consent=' + hasUserConsent + ', sharing=' + allowDataSharing);
  },
  
  /**
   * User accepts tracking via consent dialog
   */
  onUserAcceptedTracking: function() {
    this.saveUserConsent(true);
    
    cordova.plugins.SingularCordovaSdk.trackingOptIn();
    cordova.plugins.SingularCordovaSdk.resumeAllTracking();
    
    console.log('User accepted tracking');
  },
  
  /**
   * User declines tracking
   */
  onUserDeclinedTracking: function() {
    this.saveUserConsent(false);
    
    cordova.plugins.SingularCordovaSdk.stopAllTracking();
    
    console.log('User declined tracking');
  },
  
  /**
   * User updates data sharing preference
   */
  setDataSharingEnabled: function(enabled) {
    this.saveDataSharingPreference(enabled);
    
    // Note: LimitDataSharing uses inverse logic
    // false = data sharing enabled, true = data sharing limited
    cordova.plugins.SingularCordovaSdk.limitDataSharing(!enabled);
    
    console.log('Data sharing: ' + (enabled ? 'Enabled' : 'Limited'));
  },
  
  /**
   * Check if tracking is currently enabled
   */
  isTrackingEnabled: function(callback) {
    cordova.plugins.SingularCordovaSdk.isAllTrackingStopped(function(isStopped) {
      callback(!isStopped);
    });
  },
  
  /**
   * Get current privacy status as readable text
   */
  getPrivacyStatus: function(callback) {
    var self = this;
    
    this.isTrackingEnabled(function(isEnabled) {
      var dataSharingEnabled = self.getDataSharingPreference();
      var ageCategory = self.getAgeCategory();
      
      var status = 'Tracking: ' + (isEnabled ? 'Enabled' : 'Disabled') + '\n';
      status += 'Data Sharing: ' + (dataSharingEnabled ? 'Enabled' : 'Limited');
      
      if (ageCategory === 'under_13') {
        status += '\nCOPPA: Restrictions Applied';
      }
      
      callback(status);
    });
  },
  
  /**
   * Set user's age and apply appropriate protections
   */
  setUserAge: function(age) {
    if (age < 13) {
      cordova.plugins.SingularCordovaSdk.trackingUnder13();
      cordova.plugins.SingularCordovaSdk.setLimitAdvertisingIdentifiers(true);
      localStorage.setItem(this.PREF_AGE_CATEGORY, 'under_13');
      console.log('Age set to under 13 - COPPA protections applied');
    } else {
      localStorage.setItem(this.PREF_AGE_CATEGORY, 'adult');
      console.log('Age set to adult - standard tracking');
    }
  },
  
  // Private helper methods
  getUserConsent: function() {
    var value = localStorage.getItem(this.PREF_USER_CONSENT);
    return value === 'true';
  },
  
  saveUserConsent: function(consent) {
    localStorage.setItem(this.PREF_USER_CONSENT, consent.toString());
  },
  
  getDataSharingPreference: function() {
    var value = localStorage.getItem(this.PREF_DATA_SHARING);
    return value === 'true';
  },
  
  saveDataSharingPreference: function(enabled) {
    localStorage.setItem(this.PREF_DATA_SHARING, enabled.toString());
  },
  
  getAgeCategory: function() {
    return localStorage.getItem(this.PREF_AGE_CATEGORY);
  }
};

// Initialize on device ready
document.addEventListener('deviceready', function() {
  PrivacyManager.initialize();
}, false);

주요 구현 가이드라인

모범 사례:

  • 영구 저장소: 로컬 스토리지 또는 보안 스토리지 솔루션을 사용하여 사용자 환경설정을 저장하세요.
  • 조기 초기화: SDK 초기화 후 즉시 개인정보 설정 적용
  • UI 동기화: isAllTrackingStopped() 를 사용하여 설정 UI를 실제 SDK 상태와 동기화 유지
  • 명확한 커뮤니케이션: 앱 설정에서 명확하고 접근 가능한 개인정보 보호 컨트롤 제공
  • 역논리: limitDataSharing(false) 은 데이터 공유가 활성화되어 있음을 의미하고 true제한됨을의미합니다.
  • COPPA 우선순위: 다른 개인정보 보호 설정보다 어린이 개인정보 보호(trackingUnder13())를 먼저 적용하세요.
  • 규정 준수 문서: 사용자가 동의를 제공하거나 철회한 시기와 방법에 대한 기록을 유지합니다.

확인 체크리스트

개인정보 보호 구현이 규정 준수 요구사항을 충족하는지 확인하세요:

  1. 동의 수집: 추적 시작 전에 사용자에게 명시적 동의를 요청합니다.
  2. 동의 기록: 사용자가 GDPR 동의를 제공하면 trackingOptIn()으로 연락
  3. 데이터 공유 제어: limitDataSharing() 을 사용하여 파트너에게 사용자 기본 설정을 전달합니다.
  4. 옵트아웃 메커니즘: 사용자는 개인정보 설정에서 stopAllTracking() 을 통해 추적을 중지할 수 있습니다.
  5. 연령 확인: 연령 게이트를 구현하고 어린이의 경우 trackingUnder13() 으로 전화하세요.
  6. 영구 설정: 개인정보 기본 설정이 저장되어 앱 재시작 시 다시 적용됩니다.
  7. UI 투명성: 개인정보 설정 화면에 현재 추적 상태를 명확하게 표시