비동기 실행기
VM을 비동기로 실행해, 바이트코드 복호화 키를 번들에 포함하지 않고 런타임에 가져올 수 있도록 합니다.
vmAsyncExecutor 옵션은 비동기 VM 실행기를 활성화합니다. 가장 큰 이점은 vmBytecodeArrayEncodingKeyGetter가 Promise를 반환할 수 있게 된다는 점입니다. 이러한 비동기 키 게터를 사용하면, 코드가 처음 실행될 때 키를 동기적으로 확보해 둘 필요 없이 로드 시점에 네트워크 요청, IndexedDB 등 임의의 비동기 소스에서 복호화 키를 가져올 수 있습니다.
백엔드에서 키를 가져오는 전체 과정은 레시피 백엔드에서 바이트코드 배열 키 가져오기를 참고하세요.
언제 사용하나요
전면적으로 비동기인 코드베이스에 특히 권장합니다. 이 모드에서는 async 함수만 가상화됩니다. 동기 함수는 반환값을 Promise로 바꿔 호출부를 망가뜨리지 않고서는 비동기로 만들 수 없기 때문입니다. 따라서 전체가 async로 작성된 코드일수록 보호 범위가 넓어집니다. 루트가 동기인 경우(예: 동기 IIFE나 UMD 래퍼)에도 여전히 동작합니다. 그 안의 가장 바깥쪽 async 함수들이 보호되고, 동기 부분은 그대로 남습니다.
무엇이 변환되나요
중첩 여부와 관계없이(동기 래퍼 안에 중첩된 경우를 포함해) 가장 바깥쪽 async 함수가 모두 변환됩니다. 각 체인에서 가장 바깥쪽 async 함수가 보호 단위이며, 그 안에 있는 동기·비동기 코드는 모두 함께 컴파일됩니다. 동기 함수와 일반 제너레이터는 난독화되지 않은 채로 남습니다.
function foo() { // sync — left as-is
function bar() {} // sync — left as-is
async function baz() { // transformed
// any code here, including calls to other async or sync functions
}
async function bark() { // transformed
// any code here, including calls to other async or sync functions
}
}
제외 대상과 경고
비동기 키 게터가 활성화된 경우 비동기 제너레이터도 난독화되지 않은 채로 남습니다. 비동기 제너레이터는 이터레이터를 동기적으로 반환해야 하므로 키를 기다릴 수 없기 때문입니다. 기본값인 vmTargetFunctionsMode: 'root'에서는 대상 선택이 자동으로 이뤄지므로 제외가 조용히 처리됩니다. 'comment' 모드에서는 명시적으로 표시한 함수를 가상화할 수 없을 때, 즉 그 함수가 알고 보니 동기 함수였거나 비동기 키 게터 아래의 비동기 제너레이터인 경우 ObfuscationResult.getWarnings()를 통해 경고가 전달됩니다. 이러한 경고(VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode)는 warnings 옵션(v7.8.0+)으로 유형별로 끌 수 있습니다.
요구 사항
- 비동기 키 게터를 사용하려면
vmBytecodeArrayEncoding과vmBytecodeArrayEncodingKeyGetter가 함께 필요합니다. - 난독화 도구 버전 7.3.0 이상.
예시
JavaScriptObfuscator.obfuscate(code, {
vmObfuscation: true,
vmAsyncExecutor: true,
vmBytecodeArrayEncoding: true,
vmBytecodeArrayEncodingKey: 'mySecretKey123',
// the key getter may now return a Promise
vmBytecodeArrayEncodingKeyGetter: 'fetch("/vm-key").then((res) => res.text())'
});
