컴파일 빌드

앱을 네이티브 바이너리로 컴파일합니다 — 평문 Python이 배포되지 않습니다. 기본은 포터블이며, --bind-machine을 사용하면 라이선스 게이트가 모든 모듈에 자동으로 삽입되어 찾아서 지울 수 있는 단일 검사 지점이 존재하지 않습니다.

편의 티어는 한 번 복호화하면 읽을 수 있는 Python 바이트코드를 배포합니다. magiclock build는 여기서 한 걸음 더 나아갑니다. 소스 트리 전체를 네이티브 머신 코드로 컴파일하고 번들에 포함된 모델을 암호화합니다 — 그래서 읽을 평문 Python이 전혀 배포되지 않습니다. 기본적으로 결과물은 포터블입니다. 계정도 활성화도 없이 어떤 머신에서든 실행됩니다. --bind-machine으로 빌드하면 여기에 더해 모든 모듈에 라이선스 게이트 검사를 자동으로 삽입하고, 그 게이트를 컴파일된 네이티브 코드에 직접 짜 넣고, 벤더의 공개 키를 임베드합니다 — 그래서 공격자가 찾아서 patch할 수 있는 단일 검사 지점이 남지 않습니다.

표시할 것이 없습니다

데코레이터도 없고, 코드에 주석을 달 필요도 없습니다 — 소스 코드를 전혀 바꾸지 않습니다. --bind-machine(또는 --web-gate) 빌드에서는 magiclock build가 진입점에서 도달 가능한 모든 .py 모듈을 순회하며, 컴파일하기 전에 각 모듈에 게이트 검사(python_protect 역량 확인)를 하나씩 삽입합니다. 진입 모듈에는 magiclock.bootstrap() 호출도 자동으로 삽입되므로 직접 작성할 필요가 없습니다.

python
# 여러분의 소스 코드, 그대로입니다 — 데코레이터도, 수동으로 추가한 bootstrap() 호출도 없습니다
def export_report(data: str) -> bytes:
    return render_pdf(data)
shell
magiclock build app.py --bind-machine   # 트리 안의 모든 모듈이 — 이 모듈을 포함해서 — 자동으로 게이트가 걸립니다

게이트 검사는 각 모듈당 한 번, 프로세스가 그 모듈을 처음 import할 때 실행됩니다 — 호출마다가 아니라 모듈마다 하나의 검사 지점입니다(장시간 실행되는 프로세스에서 이것이 의미하는 바와 유효 기간/취소와의 트레이드오프는 보안 모델을 참고하세요).

빌드하기

shell
magiclock build app.py                        # -> dist/app.<...>.so   (portable by default — runs anywhere)
magiclock build app.py --bind-machine          # machine-locked build with the per-module license gate
magiclock build app.py --standalone            # a self-contained app directory instead
magiclock build app.py --no-compile            # scan + inject + embed only — skip compiling (no C toolchain needed)
magiclock build app.py --model weights.onnx    # also encrypt a model into the build (repeatable)
플래그기본값의미
-o, --output-dirdist빌드 출력이 기록되는 위치.
--source-root진입점 파일스캔/변환할 프로젝트 루트(app.py가 프로젝트 최상위에 있지 않을 때 사용).
--module단일 파일 네이티브 확장 모듈로 컴파일(기본 타깃).
--standalone단일 모듈 대신 독립 실행형 앱 디렉터리로 컴파일. --module과 상호 배타적.
--no-compileoff스캔, 게이트 주입, 리소스 임베드까지만 수행하고 실제 네이티브 컴파일은 건너뜁니다 — 변환 결과를 확인하거나, C 툴체인이 없는 머신에서 유용합니다.
--keep-tmpoff정리하지 않고 중간 변환 디렉터리를 유지합니다.
--model PATHnone모델을 암호화해 빌드에 번들로 포함합니다. 반복 지정 가능.
--model-lock-passphraseoff번들된 모델에 패스프레이즈를 2단계 요소로 추가합니다(--model이 하나 이상, 그리고 --bind-machine 필요).
--model-trial / --model-expires-in / --model-expires-atnone번들된 모델의 유효 기간 — 코드 암호화의 유효 기간 플래그와 의미가 동일하며, 서로 배타적입니다.
--bind-machineoff머신 잠금 빌드: 라이선스 게이트가 컴파일되어 들어가며, 바이너리는 이 머신의 활성화된 볼트 아래에서만 실행됩니다. 번들된 모델은 이 머신의 키로 암호화됩니다. 이 플래그가 없으면 빌드는 포터블입니다(기본값 — 아래 참고).
--passphrase / --emit-keyoff포터블 빌드에서 번들된 모델에 키 없는 기본값 대신 비밀 값을 겁니다. --passphrase는 패스프레이즈에서 모델 키를 도출하고, --emit-key는 무작위 키를 생성해 출력합니다.

배포되는 것

컴파일된 .so/.pyd/독립 실행형 디렉터리는 이를 실행하는 머신에서 MagicLock 설치도, 계정도, 네트워크도 필요하지 않습니다 — 복호화와 라이선스 검사 모두 완전히 오프라인으로 이루어집니다(보안 모델 참고).

기본적으로 빌드는 포터블입니다. 바이너리는 계정도 볼트도 없이 어디서든 실행되고, 라이선스 게이트는 컴파일되지 않으며, 번들된 모델도 기본적으로 키가 없습니다 — 컴파일되어 들어간 런타임을 통해 어떤 머신에서든 스스로 복호화됩니다. 이때 보호는 네이티브 컴파일 자체에 의존합니다(그리고 선택했다면 모델 비밀 값에도 의존합니다. --emit-key는 배포용 키를 출력하고 --passphrase는 패스프레이즈에서 키를 도출하며, 바이너리는 magiclock.open_model(path, key=...) 또는 passphrase=...로 이를 읽습니다). 여기에 --web-gate를 더하면 출하 후에도 원격 중지 스위치를 유지할 수 있습니다(클라우드 제어 참조) — 포터블 빌드는 자유롭게 배포할 수 있으면서 동시에 원격으로 중지할 수 있습니다.

--bind-machine으로 빌드하면 대신 바이너리가 빌드한 머신에 잠깁니다. 빌드 시 이 머신의 시트를 지명하는 서명된 선언이 바이너리에 새겨지고, 런타임 게이트는 다른 머신의 볼트 아래에서의 실행을 — 그 머신이 활성화되어 있어도 — 거부합니다. 번들된 모델은 추가로 이 머신의 키로 암호화됩니다. 동일한 머신 잠금 프로그램을 두 번째 워크스테이션이나 배포 서버에서 실행해야 한다면, 해당 머신도 계정 아래에서 활성화한 뒤 그곳에서 빌드하세요.

다음으로 볼 문서

  • 보안 모델 — 편의 티어가 완전히 배제하지 못하는 "검사 지점을 찾아서 patch하는" 우회를 컴파일 강력 보호가 어떻게 막아내는지 설명합니다.
  • 계정 및 활성화 — 추가 빌드/배포 머신을 활성화하는 방법.