플러그인 샌드박싱
신뢰할 수 없는 플러그인 코드는 모든 계층에서 격리됩니다. 백엔드는 별도의 제한된 프로세스에서, 프론트엔드는 샌드박스 iframe에서 실행되며, 테마는 민감한 접근을 전혀 받지 않습니다.
JavaScript 샌드박스 없음
node:vm은 보안 샌드박스로 의도적으로 사용되지 않습니다. JavaScript
인터프리터 샌드박스는 결심한 공격자가 호스트 프로세스에 도달하는 것을
막을 수 없습니다. 대신 격리는 운영 체제가 강제합니다. 제한된 능력을
가진 별도 프로세스와 별도 브라우징 컨텍스트입니다.
백엔드 격리
신뢰할 수 없는 백엔드 플러그인은 제한 사항이 있는 자체 Node.js 24 프로세스에서 실행됩니다.
- 제한된 로더는 패키지 로컬 ESM과 SDK API만 해석합니다.
- 프로세스는 로더가 허용하는 것 외의
node:*빌트인을 가져오거나, 패키지 루트 밖의 모듈을 해석하거나, 호스트 데이터베이스에 도달할 수 없습니다. - 모든 능력은 IPC 채널로 전달되며, 호스트가 모든 호출에서 권한을 강제합니다.
- 프로세스는 SDK 이벤트 버스를 통해서만 핵심 애플리케이션 이벤트를 듣고, 자체 네임스페이스에서만 내보낼 수 있습니다.
- 프로세스가 크래시하면 호스트가 소유한 모든 등록을 제거합니다.
플러그인 프로세스는 Fastify 루트, SQLite 연결, 절대 경로, 전체 환경,
다른 프로바이더의 API 키를 절대 받지 않습니다. 네트워크 접근은
권한 검사된 fetch를 통해 부여된 호스트로 제한됩니다.
프론트엔드 격리
네이티브 프론트엔드 플러그인은 sandbox="allow-scripts"가 있고
allow-same-origin이 없는 샌드박스 iframe 안에서 실행됩니다.
- iframe은 애플리케이션 문서에 대한 same-origin 접근이 없습니다.
- 호스트와의 통신은 부트스트랩 nonce, 구조화된 봉투, 마감,
취소가 있는 단일 전송된
MessagePort를 통해 이루어집니다. - 호스트는 각 등록의 UI를 iframe 안의 격리된 루트에 마운트하고 RPC로 통신하므로 플러그인은 React 컴포넌트 트리나 내부 DOM을 건드리지 않습니다.
- 플러그인 UI 크래시는 해당 플러그인의 루트와 클립 영역만 무너뜨립니다.
각 플러그인은 전체 뷰포트 샌드박스 iframe 하나를 소유하며, 호스트는 활성 마운트의 사각형을 일괄 처리해 보이는 대화형 iframe 영역을 그 합집합으로 클리핑합니다. 플러그인 표면 밖의 포인터 이벤트는 애플리케이션에 유지됩니다.
신뢰할 수 있는 레거시 모드
legacy.frontend 및 legacy.backend 진입점은 기존 SillyTavern
확장 기능을 위한 별도의 신뢰할 수 있는 호환 모드입니다. 네이티브
샌드박스의 우회가 아닙니다. 두 진입점 중 하나를 사용하려면
legacy.trusted 권한이 필요하며, UI는 강화된 경고로 표시하고
사용자가 명시적으로 확인해야 합니다. 레거시 프론트엔드 코드는 메인
창에서 실행되고, 레거시 백엔드 코드는 자체
/api/plugins/{pluginId} 네임스페이스로 범위가 지정된 Express
라우터를 받습니다. 세이프 모드는 레거시 진입점을 전혀 로드하지
않습니다.
테마
테마 패키지는 더 제한적입니다. 테마는 채팅, API 키, 파일 시스템에 접근할 수 없습니다. 테마는 CSS와 선언적 레이아웃뿐이며 Theme SDK에는 JavaScript 진입점이 없습니다. 테마 측 이야기는 Theme SDK 세이프 모드를 참조하세요.
세이프 모드
세이프 모드(URL의 ?safe=1)는 타사 플러그인과 테마를 완전히
비활성화합니다. 플러그인이나 테마 코드가 로드되기 전에 처리됩니다.
패키지 CSS와 토큰 오버라이드가 문서에 추가되지 않고, 타사 진입점이
실행되지 않습니다. 기본 제공 테마와 기본 제공 플러그인 런타임은
남으므로 인터페이스는 항상 복구됩니다. 세이프 모드를 벗어나면 이전에
저장된 활성 플러그인 및 테마 상태가 복원됩니다.
패키지 검증
어떤 코드도 실행되기 전에 모든 패키지가 검증됩니다. 경로 탐색, 심볼릭 링크, 네이티브 바이너리, 실행 가능 페이로드가 거부되고, 매니페스트 필드, 진입점, 권한이 검사되며, npm 의존성은 무결성 검사와 함께 가져오고 설치 스크립트는 절대 실행되지 않습니다. 설치부터 정리까지의 전체 이야기는 라이프사이클을 참조하세요.