들어가며: JavaScript의 단일 스레드 신화
JavaScript를 처음 배울 때 '단일 스레드'라는 말을 많이 들어보셨을 텐데요. 이는 언어 레벨에서 정확하지만, 실제 애플리케이션은 Web Worker 같은 멀티 스레드 환경을 활용할 수 있습니다. 더 정확한 표현은 **'JavaScript realm은 단일 스레드'**라는 것입니다. realm은 코드가 실행되는 환경을 뜻하며, 브라우저 탭, Web Worker, iframe 등이 각각 별도의 realm이 됩니다.
문제는 이런 realm들이 서로 다른 전역 객체를 갖기 때문에, 한 realm에서 정의한 변수가 다른 realm에 영향을 줄 수 없다는 점입니다. 이 특성을 활용하면 코드를 격리할 수 있는데, 기존에는 이 방식이 번거롭고 제한적이었습니다.

ShadowRealm API: 어두운 반사, 깨끗한 격리
TC39에서 제안 중인 ShadowRealm API는 전역 객체와 내장 객체를 갖지만, 자체 실행 스레드는 없는 '그림자 영역'을 만듭니다. 코드는 여전히 호스트 realm의 스레드에서 실행되지만, 전역 환경은 완전히 분리됩니다. 기본 사용법은 매우 간단합니다.
// ShadowRealm 생성
const shadow = new ShadowRealm();
// 외부 realm에서 전역 함수 정의
function globalFunction() {};
console.log(globalThis.globalFunction);
// 결과: function globalFunction()
// ShadowRealm 내부에서 전역 함수 확인
console.log(shadow.evaluate('globalThis.globalFunction'));
// 결과: undefined
위 코드에서 볼 수 있듯이, ShadowRealm 내부의 전역 객체는 외부와 완전히 분리되어 있습니다. 반대로 ShadowRealm 내부에서 정의한 함수도 외부에서 접근할 수 없죠.
// ShadowRealm 생성
const shadow = new ShadowRealm();
// ShadowRealm 내부에서 전역 함수 선언
shadow.evaluate('function globalFunction() {};');
// 외부에서는 접근 불가
console.log(globalThis.globalFunction);
// 결과: undefined
// ShadowRealm 내부에서는 접근 가능
console.log(shadow.evaluate('globalThis.globalFunction'));
// 결과: function globalFunction()
또한, importValue 메서드를 사용하면 모듈을 동적으로 가져와서 격리된 환경에서 실행할 수 있습니다.
// spookycode.js
export function greeting() {
return "Hello from the ShadowRealm!";
}
// 메인 스크립트
async function shadowGreeter() {
const shadow = new ShadowRealm();
// importValue는 Promise를 반환하며, 두 번째 인자로 내보낸 함수를 지정
const shadowGreet = await shadow.importValue("./spookycode.js", "greeting");
// 호출
shadowGreet();
}
shadowGreeter();
// 결과: Hello from the ShadowRealm!
![]()
주의사항과 한계
ShadowRealm은 완벽한 보안 경계를 제공하지 않습니다. 코드가 다른 realm의 정보를 유추할 수 있기 때문에, **무결성 경계(integrity boundary)**로 이해해야 합니다. 또한, 현재는 Stage 2.7로 아직 브라우저에서 사용할 수 없으며, eval과 유사한 unsafe-eval CSP 규칙이 적용될 수 있습니다.
실무에서 적용하려면 다음과 같은 점을 고려해야 합니다.
- 테스트 환경: 단위 테스트 시 mock 데이터와 실제 데이터 간 충돌을 방지할 수 있습니다.
- 플러그인 시스템: 서드파티 코드를 격리하여 전역 오염을 막을 수 있습니다.
- 성능 오버헤드: 격리된 환경에서 코드를 실행하는 데 추가 비용이 발생할 수 있습니다.

결론: 준비된 자가 미래를 선점한다
ShadowRealm API는 JavaScript의 오랜 숙원이었던 코드 격리를 실현할 유망한 솔루션입니다. 아직 표준화가 진행 중이지만, 이 개념을 미리 이해해두면 브라우저 구현이 시작될 때 바로 활용할 수 있습니다.
특히 국내 개발 생태계에서는 레거시 코드와 서드파티 라이브러리 간 충돌 문제가 빈번한데, ShadowRealm이 이 문제를 해결하는 데 큰 역할을 할 수 있습니다. 다만, 보안 경계로 오해하지 말고 무결성 경계로 접근하는 것이 중요합니다.
다음 단계로는 TC39 프로포절 문서를 직접 살펴보고, Stage 3 이후 브라우저 구현 소식을 주시하는 것을 권장합니다. 또한, 마이크로소프트 Maia 200, AI 추론을 위해 태어난 초고성능 가속기 심층 분석과 같은 최신 기술 트렌드도 함께 확인해보세요.
함께 보면 좋은 글: