OZero Security
API 레퍼런스

API 레퍼런스

OZero SDK의 모든 공개 클래스와 메서드에 대한 완전한 레퍼런스입니다. 별도로 명시되지 않은 경우 모든 클래스는 OZeroSDK.Security 네임스페이스에 있습니다.

OZeroSecurityManager OZeroSDK.Security

모든 활성 보안 모듈을 관리하는 중앙 싱글톤입니다. DontDestroyOnLoad를 통해 씬 전환 시에도 유지됩니다. 정적 Instance 프로퍼티로 접근하세요. OZeroBootstrapper가 런타임 시작 시 [RuntimeInitializeOnLoadMethod]를 통해 자동 생성합니다 — 직접 인스턴스화하지 마세요.

프로퍼티

이름 타입 설명
Instance OZeroSecurityManager 정적 싱글톤 접근자. 활성 인스턴스를 반환합니다.

메서드

void RegisterUserCallback(DelegateSecurityViolation callback)

서드파티 콜백을 유저 체인에 등록합니다. 내장 기본 핸들러는 별도 체인에서 동작하므로 유저 콜백을 해제해도 무력화되지 않습니다. 콜백은 모듈 타입, 공개 abort code, 메시지 키, 안전한 진단 메시지, 현재 정책상 앱 종료 여부를 담은 OZeroSecurityEvent를 받습니다.

void UnregisterUserCallback(DelegateSecurityViolation callback)

이전에 등록한 유저 콜백을 제거합니다. 메모리 누수 방지를 위해 OnDisable 또는 OnDestroy에서 반드시 호출하세요.

델리게이트

delegate void DelegateSecurityViolation(OZeroSecurityEvent evt)

RegisterUserCallback에서 사용하는 콜백 시그니처입니다. 자체 UI, 로그, 저장 처리 여부를 결정할 때 evt.Type, evt.AbortCodeHex, evt.MessageKey, evt.Message, evt.WillAbort를 읽으세요.

예시

using OZeroSDK.Security;
using UnityEngine;

public class MySecurityListener : MonoBehaviour
{
    void OnEnable()
        => OZeroSecurityManager.Instance.RegisterUserCallback(OnThreat);

    void OnDisable()
        => OZeroSecurityManager.Instance.UnregisterUserCallback(OnThreat);

    void OnThreat(OZeroSecurityEvent evt)
        => Debug.Log(
            $"Threat={evt.Type}, Code={evt.AbortCodeHex}, Message={evt.Message}");
}

OZeroSecurityEvent class

RegisterUserCallback에 전달되는 고객 공개용 위반 이벤트 payload입니다. 내부 탐지 세부 정보 대신 안정적이고 안전한 진단 정보만 노출합니다.

이름 타입 설명
TypeModulationType위반을 발생시킨 보안 모듈입니다.
AbortCodeOZeroAbortCode안정적인 공개 abort code 카테고리입니다.
AbortCodeValueint서버 로그에 사용하기 좋은 숫자 코드 값입니다.
AbortCodeHexstring0x0C 같은 16진수 문자열입니다.
MessageKeystring현지화와 analytics 그룹화에 사용할 수 있는 안정적인 영문 메시지 키입니다.
Messagestring고객에게 노출 가능한 안전한 영문 진단 메시지입니다.
WillAbortbool콜백 반환 후 또는 grace timer 만료 후 현재 대응 정책이 앱을 종료할 예정이면 true입니다.

ModulationType enum

어떤 보안 모듈이 경보를 발생시켰는지 식별합니다. OZeroSecurityEvent.Type으로 전달됩니다.

설명
MemoryModulation Secure Type 변수가 의심스러운 방식으로 접근됨
SpeedHack 스피드핵 또는 시간 조작 감지
TimeHack 시스템 시계 이상 감지 (뒤로 이동, NTP 불일치)
Injection 메모리 인젝션 툴(Frida 등) 또는 불법 DLL 감지
PhysicsHack 불가능한 위치 변화 감지 (OZeroPhysicsHackDetector에 의해 발생 — 개별 플레이어 오브젝트에 직접 컴포넌트 부착 필요; Bootstrapper에서 자동 생성되지 않음)
DeviceBindingModulation 세이브 데이터가 바인딩된 기기와 다른 기기에서 로드됨
InstallSource 인가된 스토어가 아닌 곳에서 설치됨
BuildIntegrity 어셈블리 해시 불일치, 디버거 연결, 또는 플랫폼 검사 실패
EnvironmentModulation 에뮬레이터 또는 비정상 런타임 환경 감지
SteamAntiPiracy Steam 소유권 또는 티켓 검증에 실패했을 때 발생합니다.

OZeroBootstrapper OZeroSDK.Security

별도 와이어링이 필요 없는 자동 부트스트랩 진입점입니다. 이 클래스를 직접 호출할 필요는 없습니다. SDK를 Unity 시작 흐름에 연결하고, 검증된 보안 설정을 로드하며, 게임 시작 전에 활성 탐지기를 자동으로 준비합니다. 가능한 경우 Native 런타임 보호도 이 과정에서 초기화됩니다.

공개 API 없음 — 호출처에서 이 타입을 인스턴스화하거나 상속하거나 참조하지 마세요. 지원되는 통합 표면은 OZeroSecurityConfig 에셋뿐입니다.

OZeroSecurityConfigRuntime OZeroSDK.Security

보호된 빌드 타임 보안 설정의 런타임 로더입니다. 패키지된 설정을 검증하고 인메모리 OZeroSecurityConfig 스냅샷을 준비하며, 검증 실패 시 설정된 위협 대응 정책을 적용합니다.

프로퍼티

이름 타입 설명
Current OZeroSecurityConfig 블롭에서 하이드레이션된 설정 스냅샷입니다. 처음 접근 시 EnsureLoaded()를 호출합니다. 플레이어 빌드에서는 OZeroSecurityConfig.Instance가 이 프로퍼티를 통해 프록시됩니다.

메서드

static void EnsureLoaded()

멱등 로더 — 반복 호출해도 안전합니다. 첫 접근에서 패키지 설정을 검증하고 로드하며, 이후 호출은 같은 스냅샷을 재사용합니다. 실패 처리는 전역 위협 대응 정책을 따릅니다.

이 타입은 내부 로더입니다. 지원되는 연동 표면은 OZeroSecurityConfig와 Unity 에디터 창으로 보시면 됩니다.

OZero Secure Variables OZeroSDK.Security

기본 타입의 암호화된 드롭인 대체제입니다. 값은 Native C++ 힙에만 저장되고 암호화됩니다. 프레임마다 48바이트 XOR 마스크가 추가 적용되어 메모리 스캐너에는 노이즈만 보입니다. 모든 산술 연산자와 암묵적 변환이 지원됩니다 — 타입 이름만 변경하면 됩니다.

지원 타입

클래스 대체 타입
OZeroSV_Intint
OZeroSV_Int64long
OZeroSV_UIntuint
OZeroSV_UInt64ulong
OZeroSV_Shortshort
OZeroSV_UShortushort
OZeroSV_Bytebyte
OZeroSV_Floatfloat
OZeroSV_Doubledouble
OZeroSV_Decimaldecimal
OZeroSV_Boolbool
OZeroSV_Stringstring
OZeroSV_Vector2Vector2
OZeroSV_Vector3Vector3
OZeroSV_Bufferbyte[]

지원 연산자

숫자 타입(Int, Int64, UInt, UInt64, Short, UShort, Byte, Float, Double, Decimal)은 산술(+ - * / %), 비교(== != < > <= >=), 복합 대입(+= -= *= /=), 증감(++ --) 연산자와 기본 타입과의 암묵적 변환을 지원합니다. Vector2·Vector3는 산술 및 동등 연산자를 지원하고, Bool은 동등 연산자만 지원합니다. String은 ==, !=, +를 지원합니다. Buffer는 인덱스 연산자를 통해 바이트 배열에 직접 접근할 수 있습니다.

Secure Types는 GC 할당이 전혀 없습니다. 암호화는 stackalloc과 네이티브 원자 카운터를 통해 수행되어 프레임당 수천 번 호출되는 핫 패스에서도 안전하게 사용할 수 있습니다.

OZeroSafePlayerPrefs OZeroSDK.Security

Unity의 PlayerPrefs를 암호화된 드롭인 대체제입니다. 키 이름은 message authentication으로 해시되고 값은 key-derivation function 기기 바인딩 키(100,000회 반복)를 사용한 암호화됩니다. 저장된 데이터는 기기 레지스트리(Windows)나 설정 plist(iOS)를 직접 열어봐도 읽을 수 없습니다.

메서드

static void SetInt(string key, int value)
static int GetInt(string key, int defaultValue = 0)
static void SetFloat(string key, float value)
static float GetFloat(string key, float defaultValue = 0f)
static void SetString(string key, string value)
static string GetString(string key, string defaultValue = "")
static void SetInt64(string key, long value)
static long GetInt64(string key, long defaultValue = 0L)
static void SetDouble(string key, double value)
static double GetDouble(string key, double defaultValue = 0.0)
static void SetBool(string key, bool value)
static bool GetBool(string key, bool defaultValue = false)
static bool HasKey(string key)
static void DeleteKey(string key)
static void DeleteAll()
static void Save()

모든 메서드는 PlayerPrefs와 기능적으로 동일합니다. 마이그레이션 단계가 필요 없습니다 — 클래스 이름만 교체하세요.

OZeroSafePlayerPrefs로 쓴 데이터는 표준 PlayerPrefs와 호환되지 않습니다. 두 가지를 전환하면 기존 데이터를 읽을 수 없게 됩니다.

OZeroSV_File OZeroSDK.Security

내장 무결성 검증과 함께 파일을 암복호화합니다. 키가 앱 수준(기기 바인딩 없음)이므로 스팀 클라우드 세이브와 호환됩니다. 읽기 시 무결성 검증이 먼저 실행되며, 변조된 파일은 손상된 데이터를 자동으로 반환하는 대신 예외를 발생시킵니다.

암호화된 파일에는 44바이트 오버헤드(인증 헤더)가 있습니다. 파일 앞에 추가되므로 실제 페이로드는 오프셋 44부터 시작합니다.

메서드

static void WriteAllText(string path, string contents)

contents를 암호화하고 결과(헤더 + 암호문 + 인증 태그)를 path에 씁니다. 디렉터리가 이미 존재해야 합니다.

static string ReadAllText(string path)

path의 파일을 읽고 무결성을 검증한 후 복호화된 문자열을 반환합니다. 파일이 변조된 경우 InvalidDataException을 발생시킵니다.

static void WriteAllBytes(string path, byte[] bytes)

원시 바이트 배열을 암호화하고 path에 씁니다.

static byte[] ReadAllBytes(string path)

WriteAllBytes로 쓴 파일을 읽고 복호화합니다. 반환 전 무결성 태그를 검증합니다.

예시 코드

using OZeroSDK.Security;

string path = Application.persistentDataPath + "/save.json";
string json = JsonUtility.ToJson(saveData);

// Write (encrypts automatically)
OZeroSV_File.WriteAllText(path, json);

// Read (decrypts + integrity check)
try
{
    string loaded = OZeroSV_File.ReadAllText(path);
    saveData = JsonUtility.FromJson<SaveData>(loaded);
}
catch (System.IO.InvalidDataException)
{
    // File was tampered — handle accordingly
    Debug.LogError("Save file integrity check failed.");
}

OZeroBuildIntegrityValidator OZeroSDK.Security

빌드 변조, 디버거/타이밍 이상, 플랫폼 네이티브 무결성 검사, 선택적 Pro 서버 검증(attestation)과 OZero 대행 검증(Managed Verification)을 처리하는 런타임 검증기입니다. Build Integrity가 OZeroSecurityConfig에서 활성화되면 OZeroBootstrapper가 자동 생성합니다.

검사 항목

검사 설명
Assembly / Manifest지원 빌드 타겟에서 생성된 무결성 매니페스트와 managed assembly 상태를 검증합니다.
Debugger / Timing연결된 디버거, 비정상 타이밍 간격, breakpoint에 가까운 지연을 감지하며 일반적인 포커스 손실 오탐은 억제합니다.
Platform Native활성화 시 Android 패키지/서명, iOS jailbreak, 데스크톱 런타임 상태 같은 플랫폼별 검사를 수행합니다.
Pro AttestationPro 서버 attestation이 켜져 있으면 로컬 검사 통과 후 서버 발급 attestation 토큰을 요청합니다. Managed Verification이 켜져 있으면 같은 토큰으로 OZero 위임 verdict까지 확인합니다.

공개 속성

이름 타입 설명
InstanceOZeroBuildIntegrityValidator모듈이 생성된 경우 현재 validator 인스턴스입니다.
LastValidationResultbool?가장 최근 로컬 검증 결과입니다. 첫 검증 전에는 null입니다.
IsValidatingbool검증 실행 중이면 true입니다.
IsIntegrityVerifiedbool최근 활성화된 로컬 검사를 통과하면 true입니다.
AttestationTokenOZeroBuildAttestationToken가장 최근 Pro attestation 토큰입니다. 서버 attestation이 성공하거나 실패하기 전까지는 null이며, 토큰에는 재사용 추적을 위한 고유 ID가 포함됩니다.

이벤트 및 메서드

UnityEvent OnValidationPassed { get; }

활성화된 모든 로컬 검사가 통과하면 호출됩니다.

UnityEvent OnValidationFailed { get; }

활성화된 로컬 검사 또는 Pro attestation이 빌드를 거부하면 호출됩니다.

UnityEvent OnAttestationPassed { get; }

Pro 서버 attestation이 성공하고 AttestationToken에 유효한 토큰이 들어오면 호출됩니다.

void Validate()

수동 검증을 시작합니다. 일반 프로젝트는 대시보드의 시작 시/주기적 검증 설정을 사용하는 편이 좋습니다.

OZeroSpeedHackDetector OZeroSDK.Security

5가지 독립적인 감지 신호를 사용하여 스피드핵과 시간 조작을 감지합니다. 신호들이 서로 확인할 때만 위협을 보고하여 오탐을 줄입니다.

감지 신호

신호 설명
TimeScale Unity의 Time.timeScale의 무단 변경을 모니터링
API Clock OS 시간 API를 네이티브 백그라운드 타이머와 비교
Thread Drift Unity 런타임 시간과 독립 Native 타이밍 소스 사이의 드리프트 측정
Time Backward 시스템 시간의 뒤로 이동 감지
NTP 선택적 — 절대 시간 검증을 위해 NTP 서버와 교차 확인(네트워크 필요)

감지는 ModulationType.SpeedHack 또는 ModulationType.TimeHack으로 OZeroSecurityManager 콜백을 통해 발생합니다. OZeroSecurityConfig에서 설정합니다.

OZeroInjectionDetector OZeroSDK.Security

비정상 런타임 모듈, 후킹, 디버거, 신뢰 모듈 정책 신호를 관찰합니다. 주기 검사는 적용 가능한 경우 Jitter 스케줄링을 사용해 예측 가능한 스캔 타이밍을 줄입니다.

감지 대상

Runtime module 예상치 못한 모듈 또는 후킹 관련 런타임 신호
Debugger 디버거 또는 트레이서 연결 신호
Memory map 의심스러운 런타임 메모리 또는 모듈 배치 신호
Illegal DLL 프로세스에 로드된 무단 관리 어셈블리(Windows/Unity Editor)

감지는 ModulationType.Injection으로 OZeroSecurityManager 콜백을 통해 발생합니다.

OZeroSecurityConfig ScriptableObject

전역 보안 설정을 저장하는 ScriptableObject 에셋입니다. 에디터에서 작성하면 빌드 파이프라인이 플레이어 빌드용 보호된 런타임 설정으로 패키징합니다. 실제 적용 설정은 OZeroSecurityConfig.Instance로 접근합니다.

필드

필드는 중첩된 설정 클래스(Response, Integrity, InstallSource, DeviceBinding, SpeedHack, Injection)로 그룹화되어 있으며, OZeroSecurityConfig.Instance의 동일 이름 프로퍼티로 접근합니다. 자주 조정되는 필드를 아래에 나열했으며, 전체 항목은 에셋의 인스펙터 툴팁을 참고하세요.

필드 타입 기본값 설명
— 최상위 —
developerSecret string "" OZeroSV_FileOZeroSafePlayerPrefs의 key-derivation function 키 도출에 사용되는 패스프레이즈. 게임별로 고유해야 하며 출시 후 절대 변경해서는 안 됩니다.
enableLog bool true SDK 디버그 로그 활성화(릴리스 빌드에서는 OZeroSecLog로 항상 제거됩니다).
— Response —
response.forceQuitOnDetection bool true 위협 시 강제 종료(OZeroInternalFallbackReceiver가 네이티브 OZ_AbortProcess로 강제). 사용자 콜백 체인만으로 처리하려면 비활성화하세요.
— Integrity —
integrity.useIntegrity bool true 빌드 무결성 모듈 마스터 스위치.
integrity.validateOnStartup bool true Start() 시점에 전체 무결성 검사를 실행합니다.
integrity.periodicCheckInterval float 120 주기적 재검증 실행 간격(초). 0 이하로 설정하면 주기 검사를 비활성화합니다.
integrity.checkAssemblyHash bool true OZeroAssemblyManifest를 기준으로 컴파일된 어셈블리의 SHA-256 / 공개 키 토큰 검증.
integrity.checkDebugger bool true 연결된 매니지드 디버거, Unity 디버그 빌드 플래그, CPU 타이밍 이상 감지.
integrity.checkPlatformNative bool true 플랫폼별 네이티브 검사(루팅, 탈옥, APK 서명, Authenticode 등) 실행.
integrity.failIfManifestMissing bool false* 어셈블리 매니페스트 누락/로드 실패를 위반으로 처리합니다. *development가 아닌 플레이어 빌드에서는 직렬화 값과 무관하게 true로 강제됩니다.
integrity.requireManifestSignature bool false* 어셈블리 매니페스트에 유효한 public-key signature 서명을 요구합니다. 키는 Tools → OZero → Generate Manifest Signing Keys로 생성하세요. *릴리스 플레이어 빌드에서는 true로 강제됩니다.
integrity.blockEmulator bool true (Android) 에뮬레이터 감지를 무결성 위반으로 처리.
— InstallSource (Android) —
installSource.useInstallSource bool true 설치 출처 검증 마스터 스위치.
installSource.allowGooglePlayStore bool true Google Play 설치 허용(Galaxy Store, Amazon Appstore, AppGallery, OneStore 등 개별 스토어 플래그도 토글 가능).
— DeviceBinding —
deviceBinding.useDeviceBinding bool true 디바이스 바인딩 검증 마스터 스위치.
deviceBinding.hardwareChangeTolerance int (0–3) 1 디바이스를 새 기기로 간주하기 전까지 허용되는 하드웨어 지문 구성 요소 변경 수.
— SpeedHack —
speedHack.useSpeedHack bool true 스피드핵 디텍터 마스터 스위치.
speedHack.checkInterval float 1.0 폴링 간격(초, 0.05–5로 클램프됨).
speedHack.requiredDetections int 3 위반을 발생시키기 위해 필요한 연속 의심 샘플 수(1–10으로 클램프됨).
speedHack.useWebTimeValidation bool true 외부 엔드포인트와의 HTTPS HEAD 기반 게임 시간 교차 검증을 활성화합니다.
speedHack.webTimeUrls[] string[] [] M-4 보안 강화 (2026-04-24). 라운드 로빈 시간 교차 검증에 사용되는 통합자 제어 엔드포인트 목록. 본인이 통제하는 항목을 2개 이상 설정하세요. 이 목록이 비어 있는 경우에만 더 이상 사용되지 않는 단일 webTimeUrl 필드로 폴백됩니다.
speedHack.minSuccessfulEndpoints int 2 라운드를 성공으로 간주하기 위해 유효한 Date 헤더로 응답해야 하는 webTimeUrls 중 최소 엔드포인트 수.
speedHack.maxConsecutiveFailures int 6 onWebTimeUnavailable 에스컬레이션 발화 전까지 허용되는 최대 연속 실패 라운드 수.
speedHack.onWebTimeUnavailable enum WarnOnly 웹 시간 엔드포인트가 도달 불가 상태일 때의 정책: WarnOnly(기본 — 로깅 후 계속 실행, 오프라인 우선 게임에 적합), Strict(적대적 환경으로 간주하고 SpeedHack 콜백 발화), Silent(로그/에스컬레이션 없음 — 권장하지 않음).
— Injection —
injection.useInjection bool true 인젝션/후킹 디텍터 마스터 스위치. 빌드 종류별 동작: release → 즉시 종료, development build → 경고만 출력(M-5 보안 강화, 2026-04-24), editor → 무시.
developerSecret은 첫 릴리스 전에 반드시 설정해야 하며 이후 변경해서는 안 됩니다. 변경 시 모든 기존 세이브 데이터(PlayerPrefs 및 파일)를 읽을 수 없게 됩니다.

OZeroLicenseConfig OZeroSDK.Security.License

Resources/OZeroLicenseConfig에서 로드되는 ScriptableObject입니다. 라이선스 티어를 선택하고 Plus/Pro 키와 선택적 Pro 런타임 기능을 설정합니다. 없거나 비어 있으면 Standard/serverless로 동작합니다.

필드

필드 타입 설명
tierOZeroLicenseTierStandard는 완전 오프라인으로 동작합니다. Plus는 프로젝트 바인딩 native variant를 활성화합니다. Pro는 Plus를 포함하고 서버 기반 런타임 기능을 활성화합니다.
licenseKeystringPlus 키는 OZ-PLS-..., Pro 키는 OZ-PRO-... 형식입니다. 비어 있으면 Standard/serverless로 동작합니다.
requireVariantManifestForBuildboolPlus/Pro 빌드에서 프로젝트 바인딩 native Variant manifest가 없거나 맞지 않으면 Unity 빌드를 실패시킵니다.
variantProjectIdstring다운로드된 manifest에 project id가 있을 때 Variant 사전 검증에 사용하는 선택적 프로젝트 식별자입니다.
serverBaseUrlstringPro 활성화와 서버 기능에 사용하는 Base URL입니다. OZero 지원팀이 전용 엔드포인트를 안내하지 않았다면 기본값을 유지하세요.
serverPublicKeyHexstringPro 라이선스와 함께 제공되는 공개 검증 키입니다. 라이선스 서버의 서명된 응답을 검증하는 데 사용됩니다.
previousServerPublicKeyHexstring선택적 이전 공개키입니다. 서버 키 전환 중 OZero 지원팀이 안내한 경우에만 입력하세요.
tokenTtlSecondsint성공한 Pro entitlement를 오프라인에서 신뢰하는 시간입니다. 만료 후에는 다시 활성화될 때까지 Pro 전용 기능이 비활성화됩니다.
activationTimeoutSecondsfloatPro 활성화를 기다리는 최대 시간입니다. 초과 시 SDK는 Standard/serverless 모드로 계속 진행합니다.
enableLogboolOZeroSecLog를 통해 라이선스 흐름 진단 로그를 출력합니다.
enableDevicePolicyHeartbeatboolPro 전용. 현재 기기가 계속 허용 상태인지 주기적으로 확인합니다.
enableSecurityLevelCheckboolPro 전용. 빌드가 기대한 보안 레벨을 선언했는지 서버가 확인할 수 있게 합니다.
enableRemoteSpeedHackConfigboolPro 전용. Speed & Time Hack 임계값을 서버 정책으로 갱신할 수 있게 합니다.
enableSignedServerTimeboolPro 전용. 사용 가능할 때 signed server time을 기본 신뢰 시간 소스로 사용합니다.
injectionWhitelistEntriesOZeroInjectionWhitelistEntry[]알려진 신뢰 모듈을 위한 선택적 hash/signature whitelist 항목입니다.

프로퍼티

static OZeroLicenseConfig RuntimeInstance { get; }

Resources에서 런타임 설정을 로드합니다. null은 Standard/serverless로 처리하세요.

bool IsServerlessMode { get; }

Standard, Plus 또는 빈 라이선스 키이면 true입니다. Pro 활성화가 필요한 경우에만 false입니다.

bool IsVariantTier { get; }

Plus와 Pro에서 true입니다. 빌드 사전 검증과 native Variant 바인딩에 사용됩니다.

OZeroLicenseRuntime OZeroSDK.Security.License

현재 라이선스 상태를 읽는 런타임 facade입니다. 앱 시작 시 자동 초기화되므로 대부분의 프로젝트는 상태를 읽거나 HasCapability만 호출하면 됩니다.

프로퍼티

이름 타입 설명
EntitlementOZeroLicenseEntitlement현재 활성화된 entitlement입니다. Standard/serverless 모드에서는 null입니다.
HasEntitlementbool현재 entitlement가 있으면 true입니다.
IsServerlessboolSDK가 Pro 서버 기능 없이 실행 중이면 true입니다.
Initializedbool라이선스 런타임의 첫 시작 처리가 끝나면 true입니다.
IsProDowngradedboolPro 활성화 실패 또는 만료 후 SDK가 Standard로 조용히 계속 실행되면 true입니다.
DowngradeReasonstring가장 최근 자동 다운그레이드(기본 보호 전환)의 진단 사유입니다.
DeviceIdProviderFunc<string>활성화에 사용할 device id를 선택적으로 바꿀 수 있습니다. 프로젝트가 자체 식별자를 써야 한다면 초기화 전에 설정하세요.

메서드

static Task Initialize()

멱등적인 시작 메서드입니다. 보통 SDK가 자동 호출하며, 커스텀 부트스트랩은 라이선스 상태를 읽기 전에 await할 수 있습니다.

static bool HasCapability(string cap)

활성 entitlement에 telemetry, signed_time, attestation_v1 같은 capability가 있는지 반환합니다. Standard/serverless에서는 false입니다.

Standard와 Plus는 런타임 활성화가 필요 없습니다. Pro가 활성화되지 못해도 게임플레이는 Standard 기능으로 계속 동작하고 Pro 전용 기능만 사용할 수 없습니다.

라이선스 서버 런타임 호출

Pro 기능은 /v1 아래의 HTTPS JSON 호출을 사용합니다. 대부분의 호출은 SDK가 자동으로 수행합니다. 자체 게임 서버가 있는 팀은 /v1/validate로 OZA 토큰을 직접 검증하고, 고가치 액션에는 consumeToken=true로 tokenId 재사용을 막을 수 있습니다. 서버가 없는 팀은 Managed Verification 설정으로 OZero 위임 verdict를 사용할 수 있습니다.

엔드포인트 용도
POST /v1/activate현재 기기에서 Pro 라이선스를 활성화하고 로컬 entitlement를 갱신합니다.
GET /v1/time활성화된 경우 Speed & Time Hack 검증에 사용할 signed server time을 제공합니다.
POST /v1/attest활성화된 무결성 검사 통과 후 고유 토큰 ID가 포함된 Pro build attestation 토큰을 발급합니다. nonce는 제출된 빌드 증거와 앱 식별 정보에 묶입니다.
POST /v1/validate게임 서버에서 OZA 토큰을 검증합니다. 랭킹, 결제, 재화 지급 같은 1회성 고가치 액션은 consumeToken=true로 같은 tokenId 재사용을 차단할 수 있습니다.
POST /v1/managed-session자체 백엔드가 없는 팀을 위해 OZero가 Pro OZA 토큰을 검증하고 allow/warn/block verdict와 짧은 managed session을 반환합니다. SDK는 managed session 만료 전에 자동 재검증을 시도하며, 같은 tokenId의 managed-session 재사용은 차단됩니다.
POST /v1/telemetrytelemetry capability가 활성화된 경우 보안 이벤트에 대한 Pro telemetry를 전송합니다.
네트워크 장애, 점검, 라이선스 만료는 게임플레이를 중단하지 않습니다. SDK는 Standard/serverless 모드로 조용히 계속 동작하고 다음 유효한 활성화 경로에서 Pro 기능을 다시 시도합니다.

OZeroAbortCode 및 이벤트 메시지

확정된 보안 위반이 발생하면 SDK는 OZeroSecurityEvent를 생성합니다. 이벤트에는 ModulationType, 안정적인 공개 OZeroAbortCode, MessageKey, 안전한 영문 Message, WillAbort가 포함됩니다.

Abort code 및 메시지 표

코드 OZeroAbortCode ModulationType MessageKey 메시지
0x01MemoryModulationMemoryModulationmemory_modulationProtected memory value changed unexpectedly.
0x02InjectionInjectioninjectionUnexpected module, hook, or runtime injection signal detected.
0x0ABuildIntegrityBuildIntegritybuild_integrityBuild integrity validation failed.
0x0CSpeedOrTimeHackSpeedHackspeed_hackSuspicious time scale or execution speed change detected.
0x0CSpeedOrTimeHackTimeHacktime_hackSystem clock or trusted time anomaly detected.
0x0EDeviceOrInstallPolicyDeviceBindingModulationdevice_bindingDevice binding policy rejected the current device.
0x0EDeviceOrInstallPolicyInstallSourceinstall_sourceApplication install source is not trusted.
0x0FPhysicsHackPhysicsHackphysics_hackAbnormal physics behavior exceeded the configured policy.
0x10EnvironmentModulationEnvironmentModulationenvironment_modulationUnsupported or unsafe runtime environment detected.
0x13SteamAntiPiracySteamAntiPiracysteam_antipiracySteam ownership or ticket validation failed.

로그나 다국어 UI를 만들 때는 OZeroAbortCodeMessageKey를 기준값으로 사용하세요. Message는 개발자가 상황을 이해할 수 있도록 안전한 표현으로 정리되어 있어, 개발자용 화면이나 QA 로그에 그대로 표시해도 괜찮습니다.

런타임에서 보안 이벤트 처리

SDK가 abort하기 전에 분석(analytics) 큐를 비우거나, 개발자용 경고를 표시하거나, 진행 중인 게임 데이터를 안전하게 저장해야 한다면 OZeroSecurityManager.RegisterUserCallback으로 핸들러를 등록하세요. 현재 대응 정책이 앱을 종료할지 여부는 evt.WillAbort로 확인할 수 있습니다.

using OZeroSDK.Security;

void OnEnable()
{
    OZeroSecurityManager.Instance.RegisterUserCallback(OnHack);
}

void OnHack(OZeroSecurityEvent evt)
{
    Debug.LogWarning(
        $"OZero: {evt.Type} {evt.AbortCodeHex} {evt.MessageKey} - {evt.Message}");

    if (evt.WillAbort)
    {
        // Last chance to flush your own analytics or save state.
    }

    Analytics.FlushSync();
}

Injection Detector API OZeroSDK.Security

Injection Detector silenced -> Add to Whitelist workflow
흐름: 최초 감지 -> 신뢰 모듈 항목 추가 -> 이후 스캔에서 해당 모듈을 허용 처리할 수 있습니다.

hash + signer-fingerprint 화이트리스트의 프로그래밍 표면입니다. 런타임에서는 OZeroDispatch를 사용하고, 게임에 함께 배포할 신뢰 항목은 OZeroLicenseConfig에 설정합니다.

DTO — OZeroInjectionWhitelistEntry

[Serializable]
public class OZeroInjectionWhitelistEntry
{
    // SHA-256 of the matched module file. Lowercase 64-char hex. Required.
    public string HashHex { get; set; }

    // SHA-256 of the module's signing certificate. Lowercase 64-char hex.
    // Empty ("") means "match by hash only" (only mode for Android .so / Linux ELF).
    public string SignerHex { get; set; }

    // Module file format hint — "pe" | "macho" | "so". Defaults to "so".
    public string Type { get; set; }

    // Optional human-readable note (UI / audit only — never sent to native).
    public string Comment { get; set; }
}

Unity에서 로컬 신뢰 모듈 항목을 시드해야 할 때 사용하는 DTO입니다. Pro 고객은 보통 같은 정책을 포털에서 관리합니다.

런타임 API — OZeroDispatch

// Returns true when trusted-module policy support is available.
public static bool HasInjectionV3 { get; }

// Replace trusted module entries atomically. Pass null/empty to clear.
// Returns false when the runtime support is unavailable.
public static bool RegisterInjectionWhitelistHash(OZeroInjectionWhitelistEntry[] entries);

// Trusted-module aware scan. Returns true when a relevant runtime signal is observed.
// Output fields are diagnostic context for your review and may be empty.
public static bool DetectAssemblyInjectionV3(
    out bool   silencedByWhitelist,
    out string hashHex,
    out string signerHex,
    out string matchedModulePath);

세 메서드 모두 static helper입니다. 선택적 기능 표면으로 취급해 먼저 가용성을 확인하고, 로컬 신뢰 항목은 최소한으로 유지하세요.

Config — OZeroLicenseConfig

// Inspector array of OZeroInjectionWhitelistEntry — preferred surface.
public OZeroInjectionWhitelistEntry[] InjectionWhitelistEntries { get; }

public string[] InjectionWhitelistKeywords { get; }

InjectionWhitelistEntries는 신뢰 모듈 정책의 로컬 seed입니다. 직접 배포하거나 명시적으로 신뢰하는 모듈에만 사용하세요.