Async Executor
VM을 비동기로 실행해, 바이트코드 복호화 키를 번들에 포함하지 않고 런타임에 가져올 수 있도록 합니다.
시청
Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization
vmAsyncExecutor 옵션은 비동기 VM 실행기를 활성화합니다. 가장 큰 이점은 vmBytecodeArrayEncodingKeyGetter가 Promise를 반환할 수 있게 된다는 점입니다. 이러한 비동기 키 게터를 사용하면, 코드가 처음 실행될 때 키를 동기적으로 확보해 둘 필요 없이 로드 시점에 네트워크 요청, IndexedDB 등 임의의 비동기 소스에서 복호화 키를 가져올 수 있습니다.
백엔드에서 키를 가져오는 전체 과정은 Bytecode Array Encoding 키 외부화하기를 참고하세요.
언제 사용하나요
전면적으로 비동기인 코드베이스에 특히 권장합니다. 이 모드에서는 async 함수만 가상화됩니다. 동기 함수는 반환값을 Promise로 바꿔 호출부를 망가뜨리지 않고서는 비동기로 만들 수 없기 때문입니다. 따라서 전체가 async로 작성된 코드일수록 보호 범위가 넓어집니다. 루트가 동기인 경우(예: 동기 IIFE나 UMD 래퍼)에도 여전히 동작합니다. 그 안의 가장 바깥쪽 async 함수들이 보호되고, 동기 부분은 가상화되지 않습니다(나머지 난독화는 그대로 적용됩니다).
무엇이 변환되나요
중첩 여부와 관계없이(동기 래퍼 안에 중첩된 경우를 포함해) 가장 바깥쪽 async 함수가 모두 변환됩니다. 각 체인에서 가장 바깥쪽 async 함수가 보호 단위이며, 그 안에 있는 동기·비동기 코드는 모두 함께 컴파일됩니다. 동기 함수와 일반 제너레이터는 가상화되지 않습니다(나머지 난독화는 여전히 적용됩니다).
제외 대상과 경고
비동기 키 게터가 활성화된 경우 비동기 제너레이터도 가상화되지 않습니다. 비동기 제너레이터는 이터레이터를 동기적으로 반환해야 하므로 키를 기다릴 수 없기 때문입니다. 기본값인 vmTargetFunctionsMode: 'root'에서는 대상 선택이 자동으로 이뤄지므로 제외가 조용히 처리됩니다. 단, 아무것도 가상화되지 않으면 VMNoFunctionsToVirtualize가 보고됩니다. 'comment' 모드에서는 명시적으로 표시한 함수를 가상화할 수 없을 때, 즉 그 함수가 알고 보니 동기 함수였거나 비동기 키 게터 아래의 비동기 제너레이터인 경우 경고가 보고됩니다(대시보드와 API 응답의 warnings 배열에서). 이러한 경고(VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode)는 warnings 옵션(v7.8.0+)으로 유형별로 끌 수 있습니다.
root 모드에서 vmAsyncExecutor는 vmWrapTopLevelInitializers가 켜져 있어도 최상위 변수 초기화 식을 일반 JavaScript로 남기며, (v7.8.0+) VMTopLevelInitializerNotVirtualized 경고가 그 목록을 알려 줍니다.
요구 사항
- 비동기 키 게터를 사용하려면
vmBytecodeArrayEncoding이 필요하며,vmBytecodeArrayEncodingKeyGetter는vmBytecodeArrayEncodingKey와 짝을 이뤄야 합니다. 난독화 도구는 두 옵션이 모두 설정되었는지(또는 둘 다 없는지), 그리고 게터가 표현식으로 파싱되는지 검증하며, 그렇지 않으면 빌드를 거부합니다. - 난독화 도구 버전 7.3.0 이상.
이 옵션만 활성화하면 실행기가 비동기 모드로 전환될 뿐입니다(가장 바깥쪽 async 함수만 가상화됩니다). 런타임 키 조회가 가능해지는 것은 키 게터가 Promise를 반환할 때이며, 이를 위해서는 키 게터를 갖춘 Bytecode Array Encoding이 추가로 필요합니다. 게터가 Promise를 반환하는지는 빌드 시점에 검사할 수 없으므로, vmAsyncExecutor가 꺼진 상태에서 Promise를 반환하는 게터를 사용하면 런타임에 실패합니다. 디코더가 키 대신 Promise를 받기 때문입니다.
예시
전면적으로 동기인 코드베이스에서는 async 함수만 대상이 되므로 가상화되는 코드가 거의 없습니다. 진입점이 async가 아니라면 동기 키 게터를 사용하고 vmAsyncExecutor는 끄는 편이 좋습니다.
