데이터 개인정보 보호법 준수
GDPR, CCPA 및 기타 소비자 개인정보 보호 규정에 대한 사용자 동의 선택 사항을 Singular에 알림으로써 개인정보 보호 규정을 준수하는 데이터 수집을 구현하세요.
사용자가 제3자와의 정보 공유에 동의하거나 거부할 경우, Singular의 개인정보 보호 방법을 사용하여 사용자의 선택 사항을 전달하세요. 이를 통해 캘리포니아 소비자 개인정보 보호법(CCPA)과 같은 규정을 준수하고 파트너가 사용자의 개인정보 보호 기본 설정을 존중할 수 있습니다.
자세히 알아보기: Singular가 개인정보 동의를 처리하는 방법에 대한 자세한 내용은 사용자 개인정보 보호 및 데이터 공유 제한을참조하세요.
데이터 공유 제한
타사 데이터 공유 제어
LimitDataSharing 방법을 사용하여 사용자가 타사 파트너와 개인 데이터를 공유하는 데 동의했는지 여부를 Singular에 알립니다.
메소드 서명:
static void LimitDataSharing(bool shouldLimitDataSharing)
매개변수:
- false: 사용자가 데이터 공유에 동의하고 옵트인했습니다.
- true: 사용자가 옵트아웃했으며 데이터 공유에 동의하지 않음
중요: 선택 사항이지만, 이 방법은 어트리뷰션 데이터 공유에 영향을 줍니다. 일부 파트너는 사용자가 옵트인했음을 명시적으로 알린 경우에만 완전한 어트리뷰션 정보를 공유합니다.
사용 예시
// User has opted in to share their data
void AYourGameMode::OnUserOptedInToDataSharing()
{
USingularSDKBPLibrary::LimitDataSharing(false);
UE_LOG(LogTemp, Log, TEXT("Data sharing enabled"));
}
// User has opted out and declined to share their data
void AYourGameMode::OnUserOptedOutOfDataSharing()
{
USingularSDKBPLibrary::LimitDataSharing(true);
UE_LOG(LogTemp, Log, TEXT("Data sharing limited"));
}
// Example: Set based on user preference
void AYourGameMode::HandlePrivacyConsent(bool bUserConsented)
{
// Pass inverse: false = opted in, true = opted out
USingularSDKBPLibrary::LimitDataSharing(!bUserConsented);
UE_LOG(LogTemp, Log, TEXT("Data sharing: %s"),
bUserConsented ? TEXT("Enabled") : TEXT("Limited"));
}
작동 방식:
Singular는 사용자 개인정보 포스트백에서이 설정을 사용하여 규정 준수를 위해 이 설정이 필요한 파트너에게 전달합니다.
GDPR 준수 방법
사용자 추적 동의를 관리하고 SDK 기능을 제어하여 GDPR(일반 데이터 보호 규정) 및 기타 개인정보 보호 규정을 준수합니다.
추적 동의 관리
TrackingOptIn
Singular 서버에 GDPR 옵트인 이벤트를 전송하여 추적에 대한 명시적인 사용자 동의를 기록합니다.
메서드 서명:
static void TrackingOptIn()
사용 시기:
- GDPR 준수: 사용자가 GDPR 규제 지역에서 추적에 명시적으로 동의할 때 호출합니다.
- 동의 기록: 사용자가 Singular의 시스템에서 GDPR 동의를 제공한 것으로 표시합니다.
- 기본 동작: 이 호출이 없으면 SDK는 추적을 계속하지만 동의를 구체적으로 기록하지 않습니다.
// User accepted tracking consent
void AGDPRManager::OnUserAcceptedTracking()
{
USingularSDKBPLibrary::TrackingOptIn();
UE_LOG(LogTemp, Log, TEXT("User opted in to tracking"));
}
// Example: Call after consent dialog
void AGDPRManager::ShowGDPRConsentDialog()
{
// Your consent dialog UI logic here
// ...
// If user accepts:
OnUserAcceptedTracking();
}
추적 제어 방법
StopAllTracking
이 디바이스에서 현재 사용자에 대한 모든 SDK 추적 활동을 완전히 비활성화합니다.
메소드 서명:
static void StopAllTracking()
심각 중요: 이 메서드는 ResumeAllTracking() 이 호출될 때까지 SDK를 영구적으로 비활성화합니다. 비활성화 상태는 앱을 다시 시작할 때에도 유지되며 프로그래밍 방식으로만 되돌릴 수 있습니다.
동작:
- 즉각적인 효과: 모든 추적, 이벤트 보고 및 데이터 수집을 즉시 중지합니다.
- 영구 상태: 앱을 닫았다가 다시 열어도 비활성화 상태로 유지됨
-
자동 재설정 없음: 다시 활성화하려면
ResumeAllTracking()으로 명시적으로 호출해야 합니다.
// User declined all tracking
void ATrackingController::OnUserDeclinedTracking()
{
USingularSDKBPLibrary::StopAllTracking();
UE_LOG(LogTemp, Log, TEXT("All tracking stopped"));
// Optionally store preference
SaveBoolToConfig(TEXT("tracking_enabled"), false);
}
// Example: Handle user opt-out from settings menu
void ATrackingController::HandlePrivacySettingsChange(bool bTrackingEnabled)
{
if (!bTrackingEnabled)
{
USingularSDKBPLibrary::StopAllTracking();
UE_LOG(LogTemp, Log, TEXT("Privacy settings: Tracking disabled"));
}
}
ResumeAllTracking
StopAllTracking() 로 추적을 중지한 후 다시 활성화합니다.
메서드 서명:
static void ResumeAllTracking()
사용 사례:
- 동의 변경: 사용자가 개인정보 기본 설정을 변경하고 추적을 다시 선택함
- 개인정보 설정: 사용자가 앱 설정 메뉴를 통해 동의를 업데이트합니다.
- 지역 규정 준수: 사용자가 비규제 지역으로 이동할 때 추적을 다시 활성화합니다.
// User opted back in to tracking
void ATrackingController::OnUserResumedTracking()
{
USingularSDKBPLibrary::ResumeAllTracking();
UE_LOG(LogTemp, Log, TEXT("Tracking resumed"));
// Optionally update stored preference
SaveBoolToConfig(TEXT("tracking_enabled"), true);
}
// Example: Handle consent update from settings
void ATrackingController::HandlePrivacySettingsChange(bool bTrackingEnabled)
{
if (bTrackingEnabled)
{
USingularSDKBPLibrary::ResumeAllTracking();
UE_LOG(LogTemp, Log, TEXT("Privacy settings: Tracking enabled"));
}
}
IsAllTrackingStopped
현재 사용자에 대해 추적이 비활성화되었는지 확인합니다.
메소드 서명:
static bool IsAllTrackingStopped()
반환합니다:
-
true: 현재
StopAllTracking()을 통해 추적이 중지되었습니다. - false: 추적이 활성 상태입니다(중지되거나 재개되지 않음).
// Check current tracking status on startup
void APrivacySettingsUI::BeginPlay()
{
Super::BeginPlay();
UpdatePrivacyUI();
}
// Check current tracking status
bool APrivacySettingsUI::IsTrackingEnabled()
{
return !USingularSDKBPLibrary::IsAllTrackingStopped();
}
// Example: Display privacy status in settings
FString APrivacySettingsUI::GetPrivacyStatusText()
{
if (USingularSDKBPLibrary::IsAllTrackingStopped())
{
return TEXT("Tracking: Disabled");
}
else
{
return TEXT("Tracking: Enabled");
}
}
// Example: Sync UI with tracking state
void APrivacySettingsUI::UpdatePrivacyUI()
{
bool bIsStopped = USingularSDKBPLibrary::IsAllTrackingStopped();
if (TrackingToggle != nullptr)
{
TrackingToggle->SetIsChecked(!bIsStopped);
}
if (StatusText != nullptr)
{
FString StatusString = bIsStopped ? TEXT("Stopped") : TEXT("Active");
StatusText->SetText(FText::FromString(
FString::Printf(TEXT("Current tracking state: %s"), *StatusString)
));
}
UE_LOG(LogTemp, Log, TEXT("Current tracking state: %s"),
bIsStopped ? TEXT("Stopped") : TEXT("Active"));
}
// Handle toggle change from UI
void APrivacySettingsUI::OnTrackingToggleChanged(bool bEnabled)
{
if (bEnabled)
{
USingularSDKBPLibrary::ResumeAllTracking();
}
else
{
USingularSDKBPLibrary::StopAllTracking();
}
UpdatePrivacyUI();
}
어린이 개인정보 보호
TrackingUnder13
사용자가 13세 미만임을 Singular에 알려 COPPA(아동 온라인 개인정보 보호법) 및 기타 아동 개인정보 보호 규정을 준수하도록 합니다.
방법 서명:
static void TrackingUnder13()
규정 준수 요구사항:
- COPPA 준수: 미국에서 13세 미만 아동의 데이터를 수집하는 앱에 필수입니다.
- 연령 제한 콘텐츠: 등록 또는 연령 확인 시 사용자가 13세 미만임을 확인할 때 사용합니다.
- 제한된 추적: 아동 개인정보 보호법을 준수하기 위해 데이터 수집을 제한합니다.
// User identified as under 13
void ACOPPAManager::OnUserUnder13()
{
USingularSDKBPLibrary::TrackingUnder13();
UE_LOG(LogTemp, Log, TEXT("COPPA mode enabled for user under 13"));
}
// Example: Call after age verification
void ACOPPAManager::OnAgeVerified(int UserAge)
{
if (UserAge < 13)
{
USingularSDKBPLibrary::TrackingUnder13();
UE_LOG(LogTemp, Log, TEXT("COPPA restrictions applied"));
// Also limit data sharing for children
USingularSDKBPLibrary::LimitDataSharing(true);
}
}
// Example: Age gate implementation
void AAgeGateWidget::OnAgeSubmitted(int UserAge)
{
if (UserAge < 13)
{
// Apply COPPA protections
USingularSDKBPLibrary::TrackingUnder13();
USingularSDKBPLibrary::LimitDataSharing(true);
UE_LOG(LogTemp, Warning, TEXT("Child user detected - privacy protections enabled"));
// Show age-appropriate content
ShowChildSafeContent();
}
else
{
// Standard tracking for users 13+
UE_LOG(LogTemp, Log, TEXT("Adult user - standard tracking enabled"));
InitializeStandardTracking();
}
}
중요: 사용자가 13세 미만임을 확인한 후 가능한 한 빨리, 즉 앱 초기화 중 또는 연령 확인 직후에 이 방법을 호출하세요. 이렇게 하면 이후의 모든 추적에서 아동의 개인정보 보호 규정을 준수할 수 있습니다.
구현 모범 사례
완벽한 개인정보 관리 예시
사용자 선호도를 존중하고 규정을 준수하는 포괄적인 개인정보 보호 관리 기능을 구현하세요.
// ComprehensivePrivacyManager.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ComprehensivePrivacyManager.generated.h"
UCLASS()
class YOURGAME_API AComprehensivePrivacyManager : public AActor
{
GENERATED_BODY()
public:
AComprehensivePrivacyManager();
protected:
virtual void BeginPlay() override;
public:
// Initialize privacy settings on app startup
UFUNCTION(BlueprintCallable, Category = "Privacy")
void InitializePrivacySettings();
// User accepts tracking via consent dialog
UFUNCTION(BlueprintCallable, Category = "Privacy")
void OnUserAcceptedTracking();
// User declines tracking
UFUNCTION(BlueprintCallable, Category = "Privacy")
void OnUserDeclinedTracking();
// User updates data sharing preference
UFUNCTION(BlueprintCallable, Category = "Privacy")
void SetDataSharingEnabled(bool bEnabled);
// Check if tracking is currently enabled
UFUNCTION(BlueprintCallable, Category = "Privacy")
bool IsTrackingEnabled();
// Get current privacy status as readable text
UFUNCTION(BlueprintCallable, Category = "Privacy")
FString GetPrivacyStatus();
private:
// Helper methods for config storage
bool GetUserConsent();
void SaveUserConsent(bool bConsent);
bool GetDataSharingPreference();
void SaveDataSharingPreference(bool bEnabled);
// Config keys
static const FString PREF_USER_CONSENT;
static const FString PREF_DATA_SHARING;
};
// ComprehensivePrivacyManager.cpp
#include "ComprehensivePrivacyManager.h"
#include "SingularSDKBPLibrary.h"
#include "Kismet/GameplayStatics.h"
const FString AComprehensivePrivacyManager::PREF_USER_CONSENT = TEXT("privacy_user_consent");
const FString AComprehensivePrivacyManager::PREF_DATA_SHARING = TEXT("privacy_data_sharing");
AComprehensivePrivacyManager::AComprehensivePrivacyManager()
{
PrimaryActorTick.bCanEverTick = false;
}
void AComprehensivePrivacyManager::BeginPlay()
{
Super::BeginPlay();
// Initialize privacy settings on app start
InitializePrivacySettings();
}
void AComprehensivePrivacyManager::InitializePrivacySettings()
{
bool bHasUserConsent = GetUserConsent();
bool bAllowDataSharing = GetDataSharingPreference();
// Apply stored tracking preference
if (bHasUserConsent)
{
USingularSDKBPLibrary::TrackingOptIn();
USingularSDKBPLibrary::ResumeAllTracking();
UE_LOG(LogTemp, Log, TEXT("Privacy initialized: Tracking enabled with consent"));
}
else
{
USingularSDKBPLibrary::StopAllTracking();
UE_LOG(LogTemp, Log, TEXT("Privacy initialized: Tracking disabled"));
}
// Set data sharing preference (inverse logic)
USingularSDKBPLibrary::LimitDataSharing(!bAllowDataSharing);
UE_LOG(LogTemp, Log, TEXT("Privacy initialized: consent=%s, sharing=%s"),
bHasUserConsent ? TEXT("true") : TEXT("false"),
bAllowDataSharing ? TEXT("true") : TEXT("false"));
}
void AComprehensivePrivacyManager::OnUserAcceptedTracking()
{
SaveUserConsent(true);
USingularSDKBPLibrary::TrackingOptIn();
USingularSDKBPLibrary::ResumeAllTracking();
UE_LOG(LogTemp, Log, TEXT("User accepted tracking"));
}
void AComprehensivePrivacyManager::OnUserDeclinedTracking()
{
SaveUserConsent(false);
USingularSDKBPLibrary::StopAllTracking();
UE_LOG(LogTemp, Log, TEXT("User declined tracking"));
}
void AComprehensivePrivacyManager::SetDataSharingEnabled(bool bEnabled)
{
SaveDataSharingPreference(bEnabled);
// Note: LimitDataSharing uses inverse logic
// false = data sharing enabled, true = data sharing limited
USingularSDKBPLibrary::LimitDataSharing(!bEnabled);
UE_LOG(LogTemp, Log, TEXT("Data sharing: %s"),
bEnabled ? TEXT("Enabled") : TEXT("Limited"));
}
bool AComprehensivePrivacyManager::IsTrackingEnabled()
{
return !USingularSDKBPLibrary::IsAllTrackingStopped();
}
FString AComprehensivePrivacyManager::GetPrivacyStatus()
{
bool bIsEnabled = !USingularSDKBPLibrary::IsAllTrackingStopped();
bool bDataSharingEnabled = GetDataSharingPreference();
return FString::Printf(TEXT("Tracking: %s\nData Sharing: %s"),
bIsEnabled ? TEXT("Enabled") : TEXT("Disabled"),
bDataSharingEnabled ? TEXT("Enabled") : TEXT("Limited"));
}
// Private helper methods for config storage
bool AComprehensivePrivacyManager::GetUserConsent()
{
// Implement your config storage retrieval here
// Example using GameInstance or SaveGame system
return false; // Default to no consent
}
void AComprehensivePrivacyManager::SaveUserConsent(bool bConsent)
{
// Implement your config storage here
// Example using GameInstance or SaveGame system
}
bool AComprehensivePrivacyManager::GetDataSharingPreference()
{
// Implement your config storage retrieval here
return false; // Default to limited sharing
}
void AComprehensivePrivacyManager::SaveDataSharingPreference(bool bEnabled)
{
// Implement your config storage here
}
모범 사례:
- 퍼시스턴트 스토리지: 언리얼 엔진의 세이브게임 시스템 또는 커스텀 환경설정 파일을 사용하여 사용자 환경설정을 저장하세요.
- 조기 초기화: 가능하면 SDK 초기화 전 BeginPlay() 중에 개인정보 보호 설정을 적용합니다.
-
UI 동기화:
IsAllTrackingStopped()을 사용하여 설정 UI 를 실제 SDK 상태와 동기화합니다. - 명확한 커뮤니케이션: 앱 설정에서 명확하고 접근 가능한 개인정보 보호 컨트롤 제공
-
역논리:
LimitDataSharing(false)은 데이터 공유가 활성화되어 있음을 의미하고true은 제한됨을의미합니다. - 규정 준수 문서: 사용자가 동의를 제공하거나 철회하는 시기와 방법에 대한 기록을 유지합니다.
메서드 참조 요약
| 방법 | 설명 | 사용 시기 |
|---|---|---|
LimitDataSharing(bool)
|
사용자 동의를 기반으로 타사 데이터 공유 제어 | CCPA 준수, 사용자 개인정보 기본 설정 |
TrackingOptIn()
|
명시적인 GDPR 추적 동의 기록 | EU 지역에서의 GDPR 준수 |
StopAllTracking()
|
SDK 추적 완전히 비활성화 | 사용자가 모든 추적 동의를 거부 |
ResumeAllTracking()
|
추적 중지 후 다시 활성화 | 사용자가 동의를 변경하여 다시 옵트인 |
IsAllTrackingStopped()
|
현재 추적 상태 확인 | UI 동기화, 작업 전 상태 확인 |
TrackingUnder13()
|
어린이를 위한 COPPA 보호 활성화 | 13세 미만으로 확인된 사용자 |