OZero Security
API 레퍼런스

API 레퍼런스

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

OZeroSecurityManager OZeroSDK.Security

활성화된 보안 모듈과 보안 이벤트를 관리하는 전역 관리자입니다. 씬이 바뀌어도 유지되며, Instance 프로퍼티로 접근할 수 있습니다. SDK가 앱 시작 시 자동으로 생성하므로 직접 인스턴스를 만들 필요는 없습니다.

프로퍼티

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

메서드

void RegisterUserCallback(DelegateSecurityViolation callback)

보안 이벤트를 프로젝트 코드에서 받아보고 싶을 때 콜백을 등록합니다. OZero의 기본 대응은 별도 흐름에서 계속 실행되므로, 이 콜백을 등록하거나 해제해도 SDK 보호 동작이 꺼지지 않습니다. 콜백에는 탐지 영역, 공개 중단 코드, 메시지 키, 진단 메시지, 앱 종료 예정 여부가 담긴 OZeroSecurityEvent가 전달됩니다.

void UnregisterUserCallback(DelegateSecurityViolation callback)

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

void RegisterUserPolicyActionCallback(Action<OZeroPolicyActionEvent> callback)

Pro 기기 정책 heartbeat를 통해 서버에서 내려온 정책 액션을 받을 콜백을 등록합니다. 포털에서 Callback 대응 정책을 사용할 때 게임 코드가 후속 처리를 하도록 연결하는 용도이며, 로컬 보안 탐지 콜백과는 별도로 동작합니다.

void UnregisterUserPolicyActionCallback(Action<OZeroPolicyActionEvent> callback)

이전에 등록한 정책 액션 콜백을 제거합니다. 씬 오브젝트에서 사용할 때는 OnEnable에서 등록하고 OnDisable에서 해제하세요.

void RegisterUserActivationStateCallback(Action<OZeroUserActivationStateEvent> callback)

사용자에게 보여 줄 활성화 또는 DRM 상태 변화를 받을 콜백을 등록합니다. OZero Managed Steam DRM과 기본 Managed Verification UI를 함께 쓰면 SDK가 온라인 필요, 재시도, timeout, 차단 상태를 이미 표시합니다. 커스텀 UI, telemetry, 게임 전용 session gate가 필요할 때만 등록하세요.

void UnregisterUserActivationStateCallback(Action<OZeroUserActivationStateEvent> callback)

이전에 등록한 활성화 상태 콜백을 제거합니다. 씬 오브젝트에서 사용할 때는 OnEnable에서 등록하고 OnDisable에서 해제하세요.

void RegisterUserManagedVerificationStateCallback(Action<OZeroUserManagedVerificationStateEvent> callback)

Registers a callback for the shared OZero Managed Verification state used by Pro Build Integrity and Steam DRM. The default SDK UI handles these states automatically when enabled; use this callback only for custom UI, custom telemetry, or game-specific session gates.

void UnregisterUserManagedVerificationStateCallback(Action<OZeroUserManagedVerificationStateEvent> callback)

Removes a previously registered managed verification state callback. Register in OnEnable and unregister in OnDisable when using a scene object.

void RegisterUserManagedVerificationTextProvider(IOZeroUserManagedVerificationTextProvider provider)

Replaces individual built-in verification UI strings at runtime. Use JSON files under Assets/OZeroSDK/Resources/OZeroLocalization for normal localization, and use this provider only when text must be supplied dynamically.

void UnregisterUserManagedVerificationTextProvider(IOZeroUserManagedVerificationTextProvider provider)

Removes a previously registered managed verification text provider.

bool RequestBuildAttestationRetry()

Retries SDK-managed Build Integrity attestation after an online-required or retry-timeout state. The default Managed Verification UI calls this automatically. If your own game server validates OZA tokens, retry your own login or session-refresh request instead.

bool RequestSteamActivationRetry()

OZero 서버가 직접 처리하는 Steam Activation / DRM 검증을 다시 시도합니다. 기본 Managed Verification UI는 필요한 retry 흐름을 SDK 안에서 호출합니다. 기본 UI를 의도적으로 대체한 커스텀 UI에서만 게임 코드가 이 메서드를 호출하세요. 고객 게임 서버가 Steam 인증을 직접 처리하는 구조라면 이 메서드가 아니라 고객 서버의 로그인/세션 요청을 다시 보내야 합니다.

델리게이트

delegate void DelegateSecurityViolation(OZeroSecurityEvent evt)

RegisterUserCallback에서 사용하는 콜백 시그니처입니다. 경고 UI, 자체 서버 로그, 짧은 저장 처리가 필요할 때 evt.Type, evt.AbortCodeHex, evt.MessageKey, evt.Message, evt.WillAbort를 확인하세요. evt.WillAbort가 true이면 앱 종료가 예정되어 있으므로 오래 걸리는 작업은 피해야 합니다.

예시

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에 전달되는 고객 공개용 위반 이벤트입니다. 내부 탐지 세부 정보 대신 안정적이고 안전한 진단 정보만 노출합니다.

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

OZeroPolicyActionEvent class

RegisterUserPolicyActionCallback으로 전달되는 서버 정책 콜백 페이로드입니다. 고객 포털 정책 시스템에서 발행되며, Pro 기기 정책 heartbeat를 통해 Unity 메인 스레드에서 전달됩니다.

이름 타입 설명
Modulestringvariant, injection, physics 같은 정책 모듈입니다.
ActionIdstring전달 건을 식별하는 고유 ID입니다. SDK는 이 값으로 중복 전달을 막고 서버에 ack를 보냅니다.
PolicyIdstring가능한 경우 고객 포털 정책 ID입니다.
Reasonstring정책에 설정된 사유 또는 매칭된 증거에서 생성된 사유입니다.
Scoreint정책이 매칭된 시점의 위험 점수입니다.
EventCountint정책 매칭에 반영된 이벤트 수입니다.
WindowMinutesint정책 평가 윈도우(분)입니다.
IssuedAtUnixMslong서버가 액션을 발행한 UTC epoch milliseconds입니다.
ExpiresAtUnixMslongack되지 않은 액션이 만료되는 UTC epoch milliseconds입니다.

정책 콜백 예시

고객 포털 보안 정책의 대응을 Callback으로 설정했을 때 사용합니다. SDK는 정책 액션을 게임으로 전달하고, 게임은 사용자 안내, 기능 제한, 화면 이동을 직접 결정합니다.

using OZeroSDK.Security;
using UnityEngine;

public sealed class OZeroPolicyListener : MonoBehaviour
{
    private void OnEnable()
        => OZeroSecurityManager.Instance.RegisterUserPolicyActionCallback(OnPolicyAction);

    private void OnDisable()
        => OZeroSecurityManager.Instance.UnregisterUserPolicyActionCallback(OnPolicyAction);

    private void OnPolicyAction(OZeroPolicyActionEvent evt)
    {
        Debug.LogWarning($"Policy={evt.PolicyId}, Module={evt.Module}, Score={evt.Score}, Reason={evt.Reason}");

        if (evt.Score >= 80)
        {
            ShowSecurityNotice(evt.Reason);
            DisableRankedMatchmaking();
        }
    }
}

OZeroUserActivationStateEvent class

RegisterUserActivationStateCallback으로 전달되는 사용자 표시용 활성화 또는 DRM 상태 페이로드입니다. Steam Activation / DRM은 캐시된 오프라인 실행이 아직 허용되는지, 온라인 재검증이 필요한지를 이 이벤트로 게임에 알려줍니다.

이름 타입 설명
Providerstringsteam 같은 활성화 제공자입니다.
Statestringvalid, revalidated, online_required, outage_fail_open, rejected 같은 안정적인 상태값입니다.
Reasonstringsteam_activation_revalidate_unavailable, steam_activation_cache_expired 같은 사유 코드입니다.
Actionstring가능한 경우 이 상태와 연결된 포털 정책 액션 값입니다.
OfflineAllowedbool현재 캐시 토큰 또는 유예 정책으로 오프라인 실행이 허용되면 true입니다.
OnlineRequiredbool보호 세션을 허용하기 전에 사용자에게 네트워크 연결과 재검증을 요구해야 하면 true입니다.
ExpiresAtUnixMslong활성화 토큰이 만료되는 UTC epoch milliseconds입니다.
GraceUntilUnixMslong오프라인 유예 시간이 끝나는 UTC epoch milliseconds입니다.
OutageFailOpenUntilUnixMslong일시적인 서버 장애 fail-open을 허용하는 UTC epoch milliseconds입니다.

활성화 상태 콜백 사용 기준

OZero Managed Steam DRM과 기본 Managed Verification UI를 함께 쓰면 activation callback 코드는 필요하지 않습니다. SDK가 플레이어에게 온라인 필요, 재시도, timeout, 차단 상태를 표시합니다. 이 콜백은 기본 UI를 의도적으로 대체하거나, 별도 session gate를 붙이거나, 고객 게임 서버 검증 흐름을 운영할 때만 등록하세요. Steam Web API Key나 OZero Server API Key를 클라이언트에 넣지 마세요.

OZeroUserManagedVerificationStateEvent class

RegisterUserManagedVerificationStateCallback으로 전달되는 사용자 표시용 managed verification 페이로드입니다. Build Integrity와 Steam DRM이 모두 이 이벤트를 사용하지만, 기본 Managed Verification UI를 쓰면 SDK가 자동으로 소비합니다. 게임 코드에서는 커스텀 UI, 별도 telemetry, 게임 전용 session gate가 필요할 때만 처리하세요.

이름 타입 설명
ProviderOZeroManagedVerificationProviderSource module: BuildIntegrity or SteamDrm.
StateOZeroUserManagedVerificationStateCurrent state such as Checking, Allowed, Warning, OnlineRequired, RetryTimedOut, Blocked, or StandardFallback.
ReasonstringStable reason code suitable for custom UI text, analytics, or customer support logs.
VerdictstringServer verdict when available, such as allow, warn, block, or fallback.
CanRetryboolTrue when a Retry action is meaningful for the current provider and state.
TimestampUnixMslongUTC epoch milliseconds when the state was raised.

Managed verification 콜백 사용 기준

managedVerificationUiPolicy가 OZero 기본 다이얼로그를 사용하면 SDK가 Build Integrity와 Steam DRM의 managed-verification UI, 재시도, timeout 상태를 이미 처리합니다. RegisterUserManagedVerificationStateCallbackCustom UI / Callback Only, 별도 telemetry, 게임 전용 session gate에만 등록하세요. 커스텀 UI 모드에서는 Provider에 맞는 retry 메서드를 호출하고, 고객 게임 서버 모드에서는 SDK retry가 아니라 자체 로그인/세션 요청을 다시 보내세요.

OZeroManagedVerificationUiPolicy enum

Build Integrity와 Steam DRM에서 발생하는 managed verification 상태를 SDK가 플레이어에게 어떻게 표시할지 결정합니다. 두 Built-In 정책에는 TextMeshPro, TMP Essential Resources, optional OZero Built-In TMP Dialog package가 필요합니다. 이 조건 없이 Built-In 정책을 선택하면 build preflight가 player build를 중단합니다. Window > OZero Security > Check Setup에서 해당 오류의 Import Package를 눌러 프로젝트를 수정하세요.

설명
CustomCallbackOnlySDK는 RegisterUserManagedVerificationStateCallback 상태만 전달합니다. 게임이 자체 UI, 재시도 버튼, timeout 처리, session gate를 모두 직접 구현할 때 사용합니다.
BuiltInBlockingDialogOZero 기본 차단형 다이얼로그를 사용합니다. 온라인 재검증이 필요한 동안 보호 세션을 멈추거나 차단해야 하는 출시 빌드의 기본 권장값입니다.
BuiltInNonBlockingDialogOZero 기본 안내형 다이얼로그를 사용합니다. 재시도나 경고 상태를 안내하는 동안에도 게임 진행이 안전하게 가능할 때만 사용하세요.

OZeroManagedVerificationTimeoutAction enum

온라인 필요 또는 재시도 상태가 설정된 제한 시간 안에 해결되지 않았을 때 기본 managed verification UI가 취할 동작을 정합니다.

설명
KeepDialogtimeout 이후에도 다이얼로그를 계속 표시합니다. 플레이어가 계속 수동으로 재시도해야 하는 흐름에서만 선택하세요.
BlockSessiontimeout 이후 보호 세션을 차단합니다. 온라인 검증은 필수지만 애플리케이션은 유지해야 하는 경우의 기본 권장값입니다.
AbortApplicationtimeout 이후 애플리케이션을 종료합니다. 해결되지 않은 검증 실패 시 즉시 종료해야 하는 출시 정책에서만 사용하세요.
InvokeCallbackOnly기본 차단 또는 종료 동작 없이 콜백만 호출합니다. 완전한 커스텀 세션 제어가 필요한 경우에 사용합니다.

ModulationType enum

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

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

OZeroBootstrapper OZeroSDK.Security

SDK 초기화를 담당하는 자동 시작 진입점입니다. 프로젝트 코드에서 직접 호출할 필요는 없습니다. Unity 시작 흐름에 맞춰 보안 설정을 로드하고, 게임 시작 전에 활성화된 탐지기를 준비합니다.

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

OZeroSecurityConfigRuntime OZeroSDK.Security

보호된 빌드 설정을 플레이어 실행 시 읽고 검증하는 구성 로더입니다. 패키지된 설정을 검증한 뒤 OZeroSecurityConfig 실행 설정을 준비하며, 검증 실패 시 설정된 위협 대응 정책을 적용합니다.

프로퍼티

이름 타입 설명
Current OZeroSecurityConfig 플레이어 빌드에 포함된 보호 설정을 읽어 만든 설정 스냅샷입니다. 처음 접근할 때 EnsureLoaded()를 호출합니다.

메서드

static void EnsureLoaded()

반복 호출해도 안전한 로더입니다. 첫 호출에서 패키지된 설정을 검증하고 로드하며, 이후 호출은 같은 설정 스냅샷을 재사용합니다. 실패 시에는 설정된 대응 정책을 따릅니다.

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

OZero Secure Variables OZeroSDK.Security

일반 숫자, 문자열, 벡터 타입 대신 사용할 수 있는 암호화 타입입니다. 값은 보호된 메모리 영역에 저장되며, 대부분의 산술 연산자와 암묵적 변환을 지원합니다. 기존 코드에서 타입 이름만 바꿔 적용할 수 있습니다.

지원 타입

클래스 대체 타입
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는 지원되는 기본 값 연산에서 반복 할당을 줄이도록 설계되어 있습니다. 다만 문자열/버퍼 변환, 로그 출력, 박싱, LINQ, 사용자 코드 패턴에 따라 GC가 발생할 수 있으므로 매 프레임 대량 갱신 값에는 프로파일링 후 적용하세요.

OZeroSafePlayerPrefs OZeroSDK.Security

Unity PlayerPrefs와 비슷한 방식으로 사용할 수 있는 암호화 저장소입니다. 키 이름과 값이 보호되어 Windows 레지스트리나 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 int IncrementInt(string key, int defaultValue = 0)
static bool HasKey(string key)
static void DeleteKey(string key)
static void DeleteAll()
static void Save()
static void Initialize(string newPassword = "", string newSalt = "") // obsolete compatibility no-op

자주 쓰는 PlayerPrefs 스타일 메서드에 더해 Int64, Double, Bool, IncrementInt 헬퍼를 제공합니다. 기존 plain PlayerPrefs 값이 자동으로 이전되지는 않으므로, 앞으로 보호할 key부터 OZeroSafePlayerPrefs로 저장하세요.

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

OZeroSV_File OZeroSDK.Security

내부 암호화 로직으로 파일 읽기와 쓰기를 보호합니다. 기기 바인딩 키를 사용하지 않으므로 스팀 클라우드 세이브처럼 여러 기기에서 같은 세이브 파일을 읽어야 하는 경우에도 사용할 수 있습니다. 파일을 고의로 변조하면 읽는 시점에 무결성 검사가 실패하고 InvalidDataException이 발생합니다.

암호화된 파일은 SDK 내부 형식으로 저장됩니다. 파일 구조나 특정 위치를 직접 파싱하지 말고, 읽기와 쓰기는 항상 OZeroSV_File API를 통해 처리하세요.

메서드

static void WriteAllText(string path, string contents)

contents를 암호화해 path에 저장합니다. 상위 폴더는 자동으로 생성하지 않으므로, 필요한 경우 저장 전에 Directory.CreateDirectory로 먼저 만들어 주세요.

static string ReadAllText(string path)

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

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

데이터를 암호화하고 path에 안전하게 저장합니다.

static byte[] ReadAllBytes(string path)

path에 지정된 파일을 읽습니다. 읽기 시 파일 무결성을 검증하며 변조 여부를 탐지합니다.

static string DecryptBytesToText(byte[] encryptedData)

파일 경로가 아니라 이미 메모리에 올라온 암호화 바이트 버퍼를 복호화합니다. 원격 다운로드나 커스텀 저장소에서 받은 데이터를 ReadAllText에 넘길 수 없을 때 사용하세요.

예시 코드

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 서버 검증을 처리하는 검증기입니다. Build Integrity가 OZeroSecurityConfig에서 활성화되면 SDK가 자동으로 생성합니다.

검사 항목

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

공개 속성

이름 타입 설명
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()

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

OZeroBuildAttestationToken

Pro attestation 결과입니다. AttestToken을 게임 서버로 전달하고, 로그인, PvP, 랭킹, 재화 처리 같은 흐름에 사용하기 전에는 IsValid(nowMillis)로 유효성을 확인하세요.

bool IsExpired(long nowMillis)

서버가 발급한 만료 시간이 지난 경우 true를 반환합니다.

bool IsValid(long nowMillis)

토큰 발급이 성공했고 아직 만료되지 않은 경우 true를 반환합니다.

OZeroSpeedHackDetector OZeroSDK.Security

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

감지 신호

신호 설명
TimeScale 게임 시간 흐름이 비정상적으로 바뀌는지 확인
API Clock 플랫폼 시간과 네이티브 기준 시간을 비교해 큰 차이를 감지
Thread Drift Unity 런타임 시간과 네이티브 기준 시간의 흐름 차이를 관찰
Time Backward 기기 시간이 비정상적으로 되돌아가는 상황을 감지
NTP 선택적 — 신뢰할 수 있는 외부 시간 기준과 비교(네트워크 필요)

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

OZeroWatchdog OZeroSDK.Security

신뢰할 수 있는 장시간 로딩 작업을 위한 public helper입니다. 릴리스 deadline보다 오래 Unity 메인 스레드를 막을 수 있는 동기 작업 구간에서 native Watchdog heartbeat deadline을 제한적으로 유예합니다.

메서드

OZeroWatchdog.OZeroLoadingGraceScope BeginLoadingGrace(int maxGraceMs = 60000)

제한된 loading grace scope를 시작합니다. 신뢰할 수 있는 로딩 작업이 끝나는 즉시 반환된 scope의 End()를 호출하거나 dispose하세요. 중첩 scope를 지원하며, 마지막 scope가 끝나면 정상 Watchdog 타이밍으로 돌아갑니다.

void OZeroLoadingGraceScope.End()

이 loading grace scope를 수동으로 종료합니다. Dispose()도 같은 로직을 호출하므로 using 블록과 명시적 End()는 동일하게 동작합니다.

void RunWithLoadingGrace(Action work, int maxGraceMs = 60000)

동기 로딩 작업을 위한 편의 wrapper입니다. loading grace scope를 만들고 work를 실행한 뒤, using 블록으로 scope를 안전하게 종료합니다.

예시

using OZeroSDK.Security;
using UnityEngine.SceneManagement;

public void LoadLargeScene()
{
    using (OZeroWatchdog.BeginLoadingGrace(60000))
    {
        SceneManager.LoadScene("Battle", LoadSceneMode.Single);
    }
}
이 API는 Watchdog deadline만 유예하며 다른 보호 모듈을 끄거나 native heartbeat를 public으로 노출하지 않습니다. 신뢰할 수 있는 로딩 경계에만 사용하고 keep-alive 용도로 사용하지 마세요.

OZeroInjectionDetector OZeroSDK.Security

실행 중인 게임에 의심스러운 모듈이 붙었는지, 후킹이나 디버거 흔적이 있는지 확인합니다. 주기 검사는 가능한 경우 검사 타이밍을 조금씩 바꿔 단순한 우회 시도를 어렵게 만듭니다.

감지 대상

Runtime module 예상치 못한 런타임 모듈 또는 후킹 의심 신호
Debugger 디버깅 또는 추적 도구 연결 의심 신호
Memory map 비정상적인 런타임 메모리 또는 모듈 상태 신호
Illegal DLL 프로세스에 로드된 허용되지 않은 관리 어셈블리 신호(Windows/Unity Editor)

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

OZeroSteamAntiPiracy OZeroSDK.Security

Steam Anti-Piracy의 감지 후 동작을 실행 중에 바꾸는 API입니다. 대부분의 프로젝트는 Config Dashboard에서 설정하면 충분합니다. 게임 안에 운영자용 메뉴나 QA용 스위치를 직접 제공하는 경우에만 사용하세요.

이 API는 QA 빌드에서 잠시 관찰 모드로 바꾸거나, 게임 안 운영자 메뉴에서 기본 설정으로 되돌리는 용도에 적합합니다. Pro 서버 정책이 별도로 적용되는 프로젝트에서는 포털 정책이 우선할 수 있으므로, 실제 차단 정책은 포털 설정과 함께 확인하세요.

OZeroSteamDetectionAction

설명
Off로컬 Steam Anti-Piracy 응답을 적용하지 않습니다. 제한된 문제 분석 상황에서만 사용하세요.
Observe진단 정보만 기록하고 게임 실행은 계속 허용합니다.
CallbackOZeroSecurityManager 콜백을 발생시켜 게임이 UI 표시, 로그 기록, 자체 처리를 할 수 있게 합니다. 이 옵션만으로는 앱이 자동 종료되지 않으며, 실제 종료 여부는 Global Threat Response 설정과 프로젝트의 콜백 처리 방식에 따릅니다.
Block위반을 차단 정책으로 취급합니다. 실제 앱 종료 여부는 Global Threat Response 설정을 따릅니다.

메서드

static void SetDetectionActionOverride(OZeroSteamDetectionAction action)

실행 중 Steam Anti-Piracy의 감지 후 동작을 바꿉니다. QA 빌드에서 임시로 Observe로 낮추거나, 운영자용 메뉴에서 특정 동작을 선택하게 만들 때 사용합니다.

static void ClearDetectionActionOverride()

실행 중 바꾼 Steam Anti-Piracy 동작을 해제하고 Config Dashboard 또는 Pro 포털에 설정된 기본 동작으로 되돌립니다.

예시

using OZeroSDK.Security;

// QA session: observe Steam violations without blocking gameplay.
OZeroSteamAntiPiracy.SetDetectionActionOverride(
    OZeroSteamDetectionAction.Observe);

// Restore the dashboard/server policy.
OZeroSteamAntiPiracy.ClearDetectionActionOverride();

마지막 검증 결과

OZeroSteamAntiPiracyValidator.Instance.GetLastResult()

가장 최근 Steam 검증 스냅샷을 반환합니다. reported AppID, BuildID, SteamID, 서버 검증 여부, soft signal, native score 필드를 포함합니다. 디버그 UI나 QA 리포트에는 사용할 수 있지만, 게임플레이 권한 판단의 유일한 기준으로 쓰지는 마세요.

OZeroInstallSourceValidator OZeroSDK.Security

Android 설치 출처 검증기입니다. Install Source가 활성화되면 컴포넌트는 자동 생성됩니다. 고객 코드는 주로 지원 UI, 진단 로그, 스토어별 분기 처리를 위해 마지막 결과를 읽습니다.

메서드 및 이벤트

event Action<InstallSourceResult> OnInstallSourceDetected

설치 출처 확인이 끝났을 때 호출됩니다.

InstallSourceResult GetLastResult()

가장 최근 검사 결과를 반환합니다.

InstallSourceResult GetAndroidInstallationSource()

필요하면 초기화를 수행한 뒤 Android 설치 출처 결과를 반환합니다.

InstallSourceResult

DetectedSource해석된 설치 출처입니다. 타입은 AndroidInstallSource enum입니다.
RawInstallerPackageAndroid PackageManager가 반환한 원본 installer package name입니다.
IsAuthorized로컬 설정과, 활성화된 경우 Pro 서버 정책이 이 설치 출처를 허용하면 true입니다.
ServerVerifiedPro 전용입니다. 서버 검증 호출이 완료되었으면 true입니다.
ServerAuthorizedPro 전용입니다. ServerVerified가 true일 때의 서버 측 허용 여부입니다.

AndroidInstallSource

InstallSourceResult.DetectedSource가 반환하는 정확한 enum 값입니다. manual의 스토어 이름은 읽기 쉬운 표시명이고, 코드에서는 아래 enum 이름으로 비교하세요.

설명
GooglePlayStoreGoogle Play Store에서 설치된 경우입니다.
SamsungGalaxyStoreSamsung Galaxy Store에서 설치된 경우입니다.
AmazonAppstoreAmazon Appstore에서 설치된 경우입니다.
HuaweiAppGalleryHuawei AppGallery에서 설치된 경우입니다.
OneStoreONE Store에서 설치된 경우입니다.
XiaomiGetAppsXiaomi GetApps에서 설치된 경우입니다.
OppoAppMarketOPPO App Market에서 설치된 경우입니다.
VivoAppStoreVivo App Store에서 설치된 경우입니다.
Custom원본 installer package가 customAuthorizedPackages와 일치한 경우입니다.
ADBAndroid가 빈 installer package를 반환한 경우입니다. 보통 ADB 또는 sideload 방식 설치에서 나타납니다.
DetectionFailedJNI 또는 플랫폼 API를 사용할 수 없어 installer 조회 자체가 실패한 경우입니다. ADB와 다릅니다.
UnknownAndroid가 package name을 반환했지만 기본 목록이나 커스텀 허용 목록에 없는 경우입니다.
EditorUnity Editor에서 실행 중일 때 반환됩니다.
NotApplicableAndroid 설치 출처 개념이 적용되지 않는 플랫폼에서 반환됩니다.

OZeroDeviceBindingDetector OZeroSDK.Security

기기에 묶인 세이브 슬롯과 고객지원용 초기화 흐름을 위한 헬퍼 API입니다. Device Binding이 켜져 있으면 검증기는 자동으로 시작됩니다. 클라우드 세이브, 계정 세이브 슬롯 같은 데이터를 현재 기기와 묶고 싶을 때만 아래 토큰 메서드를 직접 호출하세요.

메서드

void Initialize()

로컬 기기 지문을 준비한 뒤 등록하거나 검증합니다. 일반 프로젝트에서는 SDK 시작 시 자동으로 호출됩니다.

string BindToSaveSlot(string saveSlotKey)

세이브 슬롯 키를 현재 기기에 연결하는 토큰을 만듭니다. 토큰은 세이브 메타데이터나 서버 기록에 저장하고, 플레이어가 직접 수정할 수 있는 세이브 본문에는 넣지 마세요.

bool ValidateSaveSlot(string saveSlotKey, string storedToken)

저장된 세이브 슬롯 토큰이 현재 기기와 맞는지 확인합니다. 맞지 않으면 설정된 Device Binding 위반 응답이 발생합니다.

string GetCurrentFingerprintHash()

현재 기기 지문 해시를 반환하는 디버그/데모용 헬퍼입니다. 운영 게임 코드에서 화면에 보여주거나, 업로드하거나, 저장하지 마세요.

void ClearStoredFingerprint(string authorizationToken = "")

이 기기에 저장된 지문을 지웁니다. Editor가 아닌 빌드에서는 서버가 발급한 Reset Token을 전달해야 하며, 정상적인 고객지원 초기화 흐름에서만 사용하세요.

예시

using OZeroSDK.Security;

var detector = OZeroDeviceBindingDetector.Instance;
string slotKey = "account:1234:slot:main";

string token = detector.BindToSaveSlot(slotKey);
// Store token next to your save metadata.

bool ok = detector.ValidateSaveSlot(slotKey, token);

OZeroSecurityConfig ScriptableObject

OZero 보안 모듈의 기본 설정을 담는 Unity ScriptableObject 에셋입니다. Config Dashboard나 Inspector에서 값을 바꾸면 빌드 시 플레이어에서 사용할 보호 설정으로 포함됩니다. 코드에서 현재 설정을 확인해야 할 때는 OZeroSecurityConfig.Instance를 사용합니다.

필드

필드는 Response, Integrity 같은 중첩 설정 클래스로 그룹화됩니다. 아래 표는 코드에서 자주 확인하거나 연동 중 자주 조정하는 필드를 정리한 요약이며, 전체 Inspector 설정 표는 manual을 참고하세요. 기본값은 코드에 저장된 직렬화 기본값 기준입니다. 릴리스 빌드에서 런타임 값이 강제로 달라지는 항목은 *로 표시합니다.

필드 타입 기본값 설명
— 최상위 —
developerSecret string "" OZeroSV_FileOZeroSafePlayerPrefs 데이터를 보호하는 프로젝트별 secret입니다. 첫 릴리스 전에 Config Dashboard의 Generate Secure Secret으로 생성하고, 출시 후에는 변경하지 마세요. 변경하면 기존 보호 데이터를 새 버전에서 복호화할 수 없습니다.
enableLog bool true SDK 디버그 로그를 켭니다. 개발/QA 원인 분석에는 유용하지만, 릴리스 빌드에서는 로그 노출 정책을 별도로 확인하세요.
enableFailureDiagnostics bool false 보안 실패 진단 파일을 Application.persistentDataPath에 저장합니다. QA 또는 고객 지원 중에만 켜고, 확인 후 다시 끄세요.
— Response —
response.forceQuitOnDetection bool true 위협이 확인되었을 때 앱을 자동 종료할지 결정합니다. QA 중에는 끄고 이벤트만 관찰할 수 있지만, 출시 빌드에서는 프로젝트 정책에 맞게 명확히 선택하세요.
response.fatalCallbackGraceSeconds float 10 위협 감지 후 게임 쪽 보안 콜백 UI가 플레이어에게 안내할 수 있는 최대 시간(초)입니다. 즉시 종료를 원할 때만 0으로 설정하세요.
— Managed Verification UI —
managedVerificationUiPolicy (Pro) OZeroManagedVerificationUiPolicy BuiltInBlockingDialog OZero Managed Build Integrity와 Steam DRM 상태를 어떤 사용자 UI 흐름으로 보여 줄지 선택합니다. 기본 모드는 SDK가 nonce/attest, managed session verification, 온라인 필요 안내, 재시도, timeout UI를 처리합니다. SDK 다이얼로그를 대체할 때만 Custom UI / Callback Only를 사용하세요.
managedVerificationDialogPrefabResourcePath (Pro) string "" 복사해서 커스터마이징한 OZero Managed Verification UI 프리팹의 Resources 경로입니다. 비워 두면 SDK 기본 프리팹을 사용합니다.
managedVerificationRetryTimeoutSeconds (Pro) int 15 플레이어가 Retry를 누른 뒤 retry-timeout으로 보고하기 전까지 기다리는 최대 시간입니다.
managedVerificationOnlineRequiredTimeoutSeconds (Pro) int 120 온라인 필요 상태를 유지하다가 설정된 timeout action을 적용하기 전까지 기다리는 최대 시간입니다.
managedVerificationTimeoutAction (Pro) OZeroManagedVerificationTimeoutAction BlockSession timeout 시 다이얼로그 유지, 보호 세션 차단, 앱 종료, 콜백만 호출 중 어떤 동작을 수행할지 선택합니다.
autoRetryManagedVerificationWhenNetworkRestored (Pro) bool false 네트워크 연결이 복구되면 managed verification을 자동으로 다시 시도합니다. 명시적인 플레이어 조작 없이 재시도해도 안전한 게임 흐름에서만 활성화하세요.
managedVerificationLanguageCode (Pro) string auto 기본 UI 문자열에 사용할 언어 코드입니다. autoApplication.systemLanguage를 따릅니다.
managedVerificationFallbackLanguageCode (Pro) string en 선택된 JSON 리소스가 없을 때 사용할 fallback 언어입니다. 커스텀 리소스는 ozero_ui_text_{code}.json 형식을 사용합니다.
— Integrity —
integrity.useIntegrity bool true Build Integrity 모듈을 켜는 마스터 스위치입니다.
integrity.validateOnStartup bool true Start() 시점에 전체 무결성 검사를 실행합니다.
integrity.periodicCheckInterval float 300 주기적 재검증 실행 간격(초)입니다. 코드 기본값은 300이며, 0 이하로 설정하면 주기 검사를 비활성화합니다.
integrity.checkAssemblyHash bool true OZeroAssemblyManifest를 기준으로 컴파일된 어셈블리의 SHA-256 / 공개 키 토큰 검증.
integrity.checkDebugger bool true 연결된 매니지드 디버거, Unity 디버그 빌드 플래그, CPU 타이밍 이상 감지.
integrity.checkPlatformNative bool true 플랫폼별 네이티브 검사(루팅, 탈옥, APK 서명, Authenticode 등) 실행.
integrity.failIfManifestMissing bool false* manifest 누락/로드 실패를 위반으로 처리합니다. *development가 아닌 플레이어 빌드에서는 직렬화 값과 무관하게 true로 강제됩니다.
integrity.failIfAssemblyHashBlobMissing bool false* 생성된 어셈블리 해시 블롭 누락을 위반으로 처리합니다. *development가 아닌 플레이어 빌드에서는 true로 강제됩니다.
integrity.requireManifestSignature bool false* manifest에 유효한 서명을 요구합니다. 키는 Window → OZero Security → Config & DashboardGenerate Key Pair로 생성하세요. *릴리스 플레이어 빌드에서는 true로 강제됩니다.
integrity.il2cppHashGlobalGameManagers bool false Windows IL2CPP 파일 해시에 globalgamemanagers를 포함합니다. Standard와 Strict 프리셋은 이 값을 켭니다.
integrity.il2cppHashSharedAssets bool false Windows IL2CPP 파일 해시에 sharedassets* 파일을 포함합니다. Standard와 Strict 프리셋은 이 값을 켭니다.
integrity.il2cppHashSceneFiles bool false Windows IL2CPP 파일 해시에 level* 같은 Unity 씬 파일을 포함합니다. Standard와 Strict 프리셋은 이 값을 켭니다.
integrity.blockEmulator bool true (Android) 에뮬레이터 감지를 무결성 위반으로 처리.
integrity.checkIntegrityWithServer (Pro) bool false Pro의 nonce → attest 흐름을 켭니다. OZero Managed와 기본 Managed Verification UI를 함께 쓰면 SDK가 빌드 무결성 증거 제출, managed session 판정 요청, 사용자 재시도/timeout 상태 표시를 게임 코드 없이 처리합니다.
integrity.attestationVerificationMode (Pro) enum CustomerGameServer OZA 토큰을 고객 게임 서버에서 최종 검증할지, OZero Managed 검증이 SDK 관리 세션 흐름으로 판정을 반환하게 할지 선택합니다.
integrity.attestationNetworkPolicy (Pro) enum BestEffort 오프라인 또는 재검증 실패 시 로컬 보호로 계속 진행할지, 온라인 필요 상태를 표시하고 재시도를 요구할지 선택합니다. 기본 Managed Verification UI 모드는 이 상태를 자동으로 표시합니다.
— InstallSource (Android) —
installSource.useInstallSource bool true 설치 출처 검증 마스터 스위치.
installSource.allowGooglePlayStore bool true Google Play 설치 허용(Galaxy Store, Amazon Appstore, AppGallery, OneStore 등 개별 스토어 플래그도 토글 가능).
installSource.enableServerSync (Pro) bool false 로컬 감지 후 /v1/install-source/verify를 호출해 Pro 서버 allowlist와 감사 로그를 적용합니다.
installSource.allowDetectionFailed bool false Android installer 조회 자체가 실패해도 시작을 허용합니다. 검증된 기기별 사유가 없다면 릴리스에서는 꺼두세요.
installSource.allowUnknownSources bool false 기본 목록과 customAuthorizedPackages에 없는 installer package를 허용합니다.
— Steam Anti-Piracy —
steamAntiPiracy.useSteamAntiPiracy bool false Steam 실행, 권한, DLC, 릴리스 hygiene 검사의 master switch입니다.
steamAntiPiracy.detectionAction OZeroSteamDetectionAction Callback Steam 검증 실패 시 적용할 로컬 응답입니다. Pro 정책이 이 값을 override할 수 있습니다.
steamAntiPiracy.checkSteamDrmWithServer (Pro) bool false 서버 근거를 사용한 Steam DRM 검증을 켭니다. OZero Managed와 기본 Managed Verification UI를 함께 쓰면 SDK가 Steam ticket 제출, activation token cache, 온라인 필요 UI, 재시도, timeout 상태를 처리합니다.
steamAntiPiracy.steamDrmVerificationMode (Pro) enum OZero Managed OZero 직접 검증 또는 고객 게임 서버 검증 중 어떤 방식으로 Steam DRM 검증을 운영할지 선택합니다. OZero Managed는 기본 Managed Verification UI와 함께 사용할 때 자체 백엔드 없는 통합 경로입니다.
steamAntiPiracy.steamDrmNetworkPolicy (Pro) enum Best Effort Steam DRM 재검증이 필요한 시점에 서버에 연결할 수 없을 때 클라이언트가 어떻게 처리할지 정합니다. 기본 Managed Verification UI 모드는 온라인 필요와 재시도 흐름을 자동으로 표시합니다.
— DeviceBinding —
deviceBinding.useDeviceBinding bool true SDK 시작 시 Device Binding 검증을 켭니다.
deviceBinding.hardwareChangeTolerance int (0–3) 1 기기 지문을 구성하는 항목이 몇 개까지 달라져도 같은 기기로 볼지 정합니다.
deviceBinding.enableServerSync (Pro) bool false Pro 전용입니다. /v1/device/register/v1/device/verify로 기기 지문을 등록하고 검증합니다. 네트워크 실패는 게임을 막지 않지만, 서버의 명확한 거부는 Device Binding 위반이 됩니다.
deviceBinding.maxDevices (Pro) int 0 한 라이선스에 등록할 수 있는 기기 수를 보여주는 참고값입니다. 실제 운영 한도는 서버 라이선스 기록 또는 고객 포털 정책을 따릅니다.
— SpeedHack —
speedHack.useSpeedHack bool true 스피드핵 디텍터 마스터 스위치.
speedHack.checkInterval float 1.0 검사 주기(초)입니다. 너무 작거나 큰 값은 안전 범위 안에서 자동 보정됩니다.
speedHack.requiredDetections int 3 위반으로 판단하기 전에 필요한 연속 의심 횟수입니다. 너무 작거나 큰 값은 안전 범위 안에서 자동 보정됩니다.
speedHack.detectSlowHack bool false 느린 시간 조작도 감지합니다. 의도적인 슬로우 모션 오탐을 줄이기 위해 기본값은 꺼져 있습니다.
speedHack.useWebTimeValidation bool true 외부 엔드포인트와의 HTTPS HEAD 기반 게임 시간 교차 검증을 활성화합니다.
speedHack.webTimeUrls[] string[] [] 웹 시간 교차 검증에 사용할 HTTPS 주소 목록입니다. 직접 운영하거나 신뢰할 수 있는 주소를 2개 이상 설정하세요. 목록이 비어 있으면 웹 시간 검증에 사용할 주소가 없습니다.
speedHack.minSuccessfulEndpoints int 2 한 번의 web-time 검사 라운드를 성공으로 인정하려면, webTimeUrls 중 최소 몇 개가 유효한 Date 헤더를 돌려줘야 하는지 정합니다.
speedHack.maxConsecutiveFailures int 6 web-time 검사 라운드가 이 횟수만큼 연속 실패하면 onWebTimeUnavailable 정책을 실행합니다.
speedHack.onWebTimeUnavailable WebTimeUnavailablePolicy WarnOnly 웹/서버 시간을 계속 확인하지 못할 때의 정책입니다. WarnOnly는 로그만 남기고 계속 실행합니다. Strict는 반복 실패 후 SpeedHack 이벤트를 발생시킵니다. Silent는 로그도 남기지 않으므로 특수 테스트용으로만 두세요.
speedHack.enableRemoteSpeedHackConfig bool false Pro 서버 기능입니다. 켜면 /v1/speedhack-config가 Speed & Time Hack 일부 기준값을 앱 재빌드 없이 덮어쓸 수 있습니다. 실제 호출에는 활성화된 Pro 라이선스와 서버 URL이 필요합니다.
speedHack.remoteSpeedHackConfigInterval float 300 /v1/speedhack-config를 다시 가져오는 주기입니다. 0이면 앱 시작 시 한 번만 가져옵니다.
speedHack.remoteSpeedHackConfigJitterPercent float 20 Pro 원격 설정 요청 시간이 여러 기기에서 겹치지 않도록, 설정한 갱신 주기 주변에서 호출 시점을 분산하는 비율입니다. 0~75 범위로 제한됩니다.
speedHack.enableSignedServerTime bool false Pro 서버 기능입니다. Pro 활성화가 가능할 때 서명된 /v1/time을 우선 신뢰 시간으로 사용합니다. 여러 번 실패하면 설정된 web-time endpoint로 되돌아갑니다.
— PhysicsHack —
physicsHack.useGlobalPhysicsHackbooltrue모든 OZeroPhysicsHackDetector 컴포넌트를 한 번에 켜거나 끄는 전역 스위치입니다. 개별 이동 기준값은 각 컴포넌트 Inspector에 남아 있습니다.
physicsHack.enableServerTelemetry (Pro)boolfalsePro 전용이며 기본값은 꺼짐입니다. 프로젝트가 명시적으로 동의하고 활성 라이선스에 권한이 있을 때만 일반 보안 이벤트와 상세 PhysicsHack telemetry를 전송합니다. 끄면 신규 telemetry 전송을 중단하며 서버 정책은 로컬 동의 없이 전송을 켤 수 없습니다.
physicsHack.telemetryThrottlePerMinute (Pro)int30이 클라이언트가 1분 동안 보낼 수 있는 PhysicsHack telemetry 수입니다. 0은 제한 없음이라, 잘못 설정된 detector가 서버를 과도하게 호출할 수 있어 권장하지 않습니다.
— Injection —
injection.useInjection bool true Injection & Hooking 전체 스위치입니다. 플레이어 빌드에서는 설정된 대응 정책에 따라 처리하고, 개발 빌드에서는 원인 확인을 위한 경고 중심 진단 흐름으로 동작하며, 에디터에서는 일반적으로 검사하지 않습니다.
injection.injectionWhitelistEntries OZeroInjectionWhitelistEntry[] empty Injection Detector에 등록하는 로컬 신뢰 모듈 목록입니다. Pro 전용이 아니라 모든 티어에서 사용할 수 있습니다. 게임과 함께 배포하거나 QA, 진단 파일, Pro telemetry, OZero 지원팀 안내로 검증한 모듈만 추가하세요.

WebTimeUnavailablePolicy

설정된 web-time 주소가 maxConsecutiveFailures 라운드만큼 연속 실패한 뒤 적용되는 정책입니다. 일시적인 네트워크 문제를 로그로만 볼지, 보안 콜백으로 올릴지 정합니다.

설명
WarnOnly기본값입니다. 경고 로그만 남기고 게임은 계속 실행합니다. 오프라인에서도 실행되어야 하는 게임에는 이 선택이 가장 안전합니다.
Strict반복 실패 후 SpeedHack 콜백을 발생시킵니다. 네트워크 품질이 낮아도 web-time 실패가 발생할 수 있으므로, 실제 서비스 지역의 네트워크에서 테스트한 뒤 사용하세요.
Silent로그도 남기지 않고 콜백도 발생시키지 않습니다. 짧은 호환성 테스트용으로만 두고, 릴리스 빌드에는 권장하지 않습니다.
developerSecret은 첫 릴리스 전에 반드시 설정해야 하며 이후 변경해서는 안 됩니다. 변경하면 기존 세이브 데이터(PlayerPrefs 및 파일)를 새 버전에서 복호화할 수 없습니다.

OZeroLicenseConfig OZeroSDK.Security.License

Resources/OZeroLicenseConfig에서 로드되는 ScriptableObject입니다. 라이선스 티어를 선택하고 Plus/Pro 라이선스 키와 Pro 런타임 서버 설정을 보관합니다. 에셋이 없거나 키가 비어 있으면 Standard와 같은 방식으로 동작합니다.

필드

필드 타입 설명
tierOZeroLicenseTierStandard는 완전 오프라인으로 동작합니다. Plus는 프로젝트 바인딩 native variant를 활성화합니다. Pro는 Plus를 포함하고 서버 기반 런타임 기능을 활성화합니다.
licenseKeystring프로젝트에 발급된 Plus/Pro 라이선스 키입니다. Plus는 프로젝트 전용 Native Variant 확인에 사용하고, Pro는 런타임 활성화와 서버 기능에도 사용합니다. 비어 있으면 Standard와 같은 방식으로 동작합니다.
serverBaseUrlstringPro 런타임 서버 Base URL입니다. 활성화, 텔레메트리, signed time, attestation, 서버 정책 호출에 사용됩니다. Standard와 Plus 런타임은 이 URL을 호출하지 않습니다.
serverPublicKeyHexstringPro 전용 서버 서명 공개키입니다. 고객 포털 > Server Key의 Active publicKey를 복사해 넣으며, Pro 런타임의 signed activation, time, attestation, offline policy 토큰 검증에 사용합니다. Plus Variant manifest는 이 필드가 아니라 SDK에 내장된 OZero Variant signing key로 검증됩니다.
previousServerPublicKeyHexstringPro 서버 키 교체 유예 기간에만 사용하는 이전 서명용 공개키입니다. 평소에는 비워 둡니다.
tokenTtlSecondsintPro 런타임 오프라인 캐시 유지 시간입니다. 만료 후에는 다시 활성화될 때까지 Pro 서버 기능이 비활성화됩니다.
offlineProPolicyModeOZeroOfflineProPolicyMode디바이스가 오프라인일 때 서명된 Pro 포털 차단 정책을 어떻게 사용할지 정합니다.
activationTimeoutSecondsfloatPro 런타임 활성화 타임아웃입니다. 시간 안에 활성화가 끝나지 않으면 사용할 수 있는 Pro 캐시를 사용하거나 Standard/serverless 방식으로 게임 시작을 계속 진행합니다.
enableLogboolOZeroSecLog를 통해 라이선스 흐름 진단 로그를 출력합니다. Plus/Pro 설정 중에 특히 유용합니다.
enableDevicePolicyHeartbeatboolPro 전용. 현재 기기가 계속 허용 상태인지 주기적으로 확인합니다.
devicePolicyHeartbeatIntervalfloatPro 기기 정책 확인 기본 주기입니다. 기본값은 300초이며, 0이면 주기 확인을 끕니다.
devicePolicyHeartbeatJitterPercentfloat여러 기기가 같은 순간에 기기 정책을 확인하지 않도록, 확인 시간을 설정 주기 주변으로 조금씩 분산하는 비율입니다. 0~75 범위로 제한됩니다.
enableSecurityLevelCheckboolPro 전용. 빌드가 기대한 보안 레벨을 선언했는지 서버가 확인할 수 있게 합니다.
declaredSecurityLevelOZeroDeclaredSecurityLevel이 빌드가 서버에 선언하는 보안 레벨입니다.
failOnSecurityLevelRejectbooltrue이면 서버가 보안 레벨 또는 설정 해시를 명시적으로 거부했을 때 설정된 강한 대응을 실행합니다.
securityLevelCheckIntervalfloat서버 보안 레벨 재확인 주기입니다. 0이면 앱 시작 시 한 번만 확인합니다.
securityLevelCheckJitterPercentfloat여러 기기가 같은 순간에 보안 레벨을 다시 확인하지 않도록, 확인 시간을 설정 주기 주변으로 조금씩 분산하는 비율입니다. 0~75 범위로 제한됩니다.

OZeroDeclaredSecurityLevel

보안 레벨 검증을 켰을 때 Pro 서버로 보내는 enum입니다. 서버는 이 값이 라이선스에 설정된 최소 보안 레벨을 만족하는지 확인합니다.

설명
Low프로토타입 또는 개발 빌드 수준입니다. 서버 정책에서 낮은 보호 선언을 허용할 때만 사용하세요.
Standard기본값이며 일반적인 보호 빌드에서 권장하는 라이브 게임용 선언입니다.
Strict가장 강한 보호 선언입니다. 프로젝트가 strict 정책으로 정상 동작하는지 QA로 확인한 뒤 사용하세요.

OZeroOfflineProPolicyMode

디바이스가 서버에 연결할 수 없을 때, 서명된 Pro 포털 차단 정책을 어떻게 처리할지 정하는 enum입니다.

설명
ApplyCachedBlockPolicies대부분의 Pro 게임에 권장됩니다. 서명된 정책이 아직 유효하면, 명시적으로 차단된 빌드 해시, SDK 버전, 앱 버전은 오프라인에서도 계속 차단됩니다.
RequireFreshPolicy온라인 전용 게임을 위한 엄격한 모드입니다. 최신 서명 정책을 사용할 수 없으면 오래된 정책을 믿지 않고 Build Integrity를 실패시킵니다.
IgnoreCachedBlockPolicies오프라인 downgrade 중 캐시된 Pro 차단 정책을 무시합니다. 특수 테스트나 레거시 호환 목적 외에는 사용하지 마세요.

프로퍼티

static OZeroLicenseConfig RuntimeInstance { get; }

Resources에서 런타임 설정을 로드합니다. null이면 Standard와 같은 방식으로 처리하세요.

bool IsServerlessMode { get; }

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

bool IsVariantTier { get; }

Plus와 Pro에서 true입니다. Native Variant 검증 대상 등급을 식별하며, private Variant 존재 여부는 가져온 서명 manifest에서 자동 판별합니다.

OZeroLicenseRuntime OZeroSDK.Security.License

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

프로퍼티

이름 타입 설명
EntitlementOZeroLicenseEntitlement현재 활성화된 Pro 권한 정보입니다. Standard 모드에서는 null입니다.
HasEntitlementbool현재 Pro 활성화 정보가 있으면 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)

현재 활성화 정보에 telemetry, signed_time, attestation 같은 기능 권한이 있는지 반환합니다. Standard에서는 false입니다.

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

라이선스 서버 런타임 호출

Pro 기능은 /v1 아래의 HTTPS JSON API를 사용합니다. 대부분의 호출은 SDK가 자동으로 수행합니다. 자체 게임 서버가 있는 팀은 /v1/validate로 OZA 토큰을 검증하고, 결제나 재화 지급처럼 중요한 액션에는 consumeToken=true를 사용해 같은 토큰 재사용을 막을 수 있습니다. 자체 서버가 없는 팀은 OZero 서버의 허용/경고/차단 결과를 사용할 수 있습니다.

엔드포인트 용도
POST /v1/activate현재 기기에서 Pro 라이선스를 활성화하고 로컬 활성화 정보를 갱신합니다.
GET /v1/time활성화된 경우 Speed & Time Hack 검증에 사용할 signed server time을 제공합니다.
POST /v1/attest활성화된 무결성 검사 통과 후 고유 토큰 ID가 포함된 Pro build attestation 토큰을 발급합니다. nonce는 제출된 빌드 증거와 앱 식별 정보에 묶입니다.
POST /v1/validate게임 서버에서 OZA 토큰을 검증합니다. 랭킹, 결제, 재화 지급처럼 중요한 1회성 액션은 consumeToken=true를 사용해 같은 토큰 재사용을 차단할 수 있습니다.
POST /v1/managed-session자체 백엔드가 없는 팀을 위해 OZero가 Pro OZA 토큰을 검증하고 허용/경고/차단 결과와 짧은 세션을 반환합니다. SDK는 세션 만료 전에 자동 재검증을 시도하며, 같은 토큰을 재사용하는 흐름은 차단됩니다.
POST /v1/telemetryPro 텔레메트리 권한이 활성화된 경우 보안 이벤트를 서버로 전송합니다.

POST /v1/activate 계약

Unity SDK가 Pro 라이선스를 활성화할 때 보내는 기본 요청 계약입니다. 서버 스키마는 네이티브 검증용 필드를 추가로 받을 수 있지만, 현재 SDK의 기본 활성화 요청은 아래 필드를 보냅니다.

필드타입필수 여부설명
licenseKeystringyes/v1/activate에 사용하는 Pro 라이선스 키입니다. 서버는 키 형식, 상태, 티어, 만료, 기기 수 제한을 확인합니다.
deviceIdstringyesOZeroLicenseRuntime.DeviceIdProvider에서 가져온 기기 식별자입니다. 활성화 수, 캐시 바인딩, 기기 정책에 사용됩니다.
sdkVersionstringyesSDK 버전 문자열입니다. 서버는 semver에 가까운 형식을 검증하고 활성화 기록에 저장합니다.
platformenum stringyeswindows, windows_server, macos, linux, linux_server, ios, android, webgl, unknown 중 하나입니다.
appIdentifierstringoptional가능한 경우 Unity Application.identifier 값입니다. 라이선스 identity 정책과 비교됩니다.
companyNamestringoptional가능한 경우 Unity Application.companyName 값입니다.
productNamestringoptional가능한 경우 Unity Application.productName 값입니다.
webglOriginstringoptionalWebGL 빌드에서 Unity Application.absoluteURL로 확인한 HTTP(S) origin입니다.
필드타입설명
activatedbool활성화가 승인되면 true입니다.
tierstring서버가 결정한 라이선스 티어입니다.
capabilitiesstring[]OZeroLicenseRuntime.HasCapability에서 사용하는 기능 목록입니다.
serverFeaturesEnabledboolPro 서버 기능을 사용할 수 있으면 true입니다.
signedTokenstring서명된 활성화 토큰입니다. SDK는 이 토큰을 검증한 뒤 활성화 정보를 신뢰합니다.
keyIdstring서버 키 교체 진단에 사용하는 서명 키 ID입니다.
expiresAtnumber활성화 토큰이 만료되는 Unix millisecond입니다.
serverUnreachablePosturestring일시적으로 서버에 연결할 수 없을 때 적용할 서버 반환 정책입니다.
실패 응답은 codemessage를 가진 JSON입니다. 자주 볼 수 있는 코드는 BAD_JSON, BAD_REQUEST, LICENSE_NOT_FOUND, LICENSE_PENDING, LICENSE_SUSPENDED, LICENSE_REVOKED, LICENSE_EXPIRED, DEVICE_BLOCKED, ACTIVATION_LIMIT, SERVER_NOT_CONFIGURED, SIGN_FAILED입니다. SDK는 라이선스/기기/identity가 명시적으로 거부된 경우와 일시적인 네트워크 실패를 다르게 처리합니다.
네트워크 장애, 점검, 라이선스 만료는 게임플레이를 바로 중단하지 않습니다. SDK는 기본 보호 기능을 유지하고, 다음 활성화 가능 시점에 Pro 기능을 다시 시도합니다.

OZeroAbortCode 및 이벤트 메시지

OZero가 보안 위협을 확정하면 OZeroSecurityEvent를 만들고, SDK 기본 대응 흐름과 프로젝트에서 등록한 콜백에 전달합니다. 이벤트에는 ModulationType, 안정적인 공개 OZeroAbortCode, MessageKey, 안전한 영문 Message, WillAbort가 포함됩니다.

중단 코드 및 메시지 표

코드 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 로그에 그대로 표시해도 괜찮습니다.

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

기본적으로 OZero는 Config Dashboard의 Response 설정에 따라 앱을 종료하거나 로그만 남깁니다. 직접 경고 화면을 표시하거나, 자체 서버 로그를 보내거나, 종료 직전에 짧은 저장 처리가 필요하다면 OZeroSecurityManager.RegisterUserCallback으로 핸들러를 등록하세요.

evt.WillAbort가 true이면 현재 대응 정책상 콜백 흐름 이후 앱이 종료됩니다. 이때는 analytics flush나 마지막 저장처럼 짧게 끝나는 작업만 수행하세요. 콜백은 이벤트를 보고하고 마무리 처리를 연결하는 지점이며, OZero의 보안 대응을 취소하는 용도가 아닙니다.

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
흐름: 최초 감지 -> 신뢰 모듈 항목 추가 -> 이후 스캔에서 해당 모듈을 허용 처리할 수 있습니다.

Injection 검사에서 정상 모듈로 인정할 항목을 등록하는 API입니다. 예를 들어 게임과 함께 배포하는 overlay, 녹화 도구, 운영용 플러그인처럼 정상 동작하지만 Injection 검사에 잡힐 수 있는 모듈을 예외로 둘 때 사용합니다. HashHex는 해당 모듈 파일의 SHA-256 hash이고, SignerHex는 모듈 서명 인증서의 SHA-256 hash입니다. 값을 추측해서 입력하지 말고, 실제 배포 파일이나 진단 결과에서 확인한 값만 등록하세요.

데이터 구조 — 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에서 로컬 신뢰 모듈 항목을 등록할 때 사용하는 데이터 구조입니다. HashHex는 필수 64자리 SHA-256 파일 hash이고, SignerHex는 선택 64자리 signer fingerprint입니다. Typepe, macho, so 중 하나로 모듈 형식을 알려주며, Comment는 운영자가 알아볼 수 있는 메모입니다.

런타임 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);

실행 중에 신뢰 모듈 목록을 네이티브 검사기에 전달하거나, 현재 플랫폼에서 이 기능을 사용할 수 있는지 확인할 때 사용합니다. 일반 프로젝트는 Config Dashboard의 Injection 설정만으로 충분합니다. 코드에서 직접 호출해야 한다면 배포 파일이 확정된 뒤 필요한 항목만 등록하고, 등록 전후 결과를 QA 로그로 확인하세요.

Config — OZeroSecurityConfig.InjectionSettings

// Preferred local trusted-module surface in the Injection settings.
public OZeroInjectionWhitelistEntry[] InjectionWhitelistEntries { get; }

InjectionWhitelistEntries는 Injection 설정에 포함되는 로컬 신뢰 모듈 목록입니다. 고객 PC에 우연히 설치된 프로그램을 넓게 허용하기 위한 설정이 아니라, 개발사가 함께 배포하고 정상 동작을 확인한 모듈만 등록하는 곳입니다. 이 로컬 목록은 모든 티어에서 사용할 수 있고, Pro 고객은 고객 포털의 서버 관리 whitelist로 운영 중 같은 성격의 정책을 갱신할 수 있습니다.