
최적화 또는 지적 재산권 보호 목적을 위한 강력한 웹사이트 컴파일러/난독화 도구.

WebSafeCompiler (WSC)는 Node.js를 사용하는 웹 애플리케이션과 웹사이트의 최적화, 최소화 및 난독화(필요한 경우)를 위해 설계된 고급 유틸리티(웹사이트 컴파일러)입니다. 파일 크기를 줄이거나 리버스 엔지니어링에 대한 강력한 보호를 제공하여 웹 자산을 향상시키고, 코드가 배포 준비가 되고 안전하게 유지되도록 보장합니다.
[!NOTE]
*.github.io 사이트에 적합합니다
컴파일러는 모놀리식입니다: 모든 구현은 source/wsc.js에 있습니다. 회귀 테스트는 tests/에 별도로 있습니다.
WebSafeCompiler의 잠재력을 최대한 활용하려면 터미널에서 다음 명령을 실행하세요:
node wsc.js <input_dir> <output_dir> [--map] [--smart] [--drm]
<input_dir>: 처리할 소스 파일이 포함된 디렉터리입니다.<output_dir>: 최적화 및 난독화된 파일이 출력될 디렉터리입니다.-m, --map: 더 나은 SEO를 위해 출력 디렉터리에 sitemap.xml을 생성합니다.-s, --smart: 축소된 파일을 자동으로 감지하여 건너뜁니다. 여기에는 JS 및 CSS 파일이 포함됩니다.-d, --drm: 무단 분석으로부터 소스 코드를 보호하기 위해 코드 난독화(DRM 보호)를 활성화합니다.
class, id, title 값을 인코딩하는 것 외에도 적격한 HTML 태그에 임의의 사용되지 않는 클래스와 임의의 속성을 추가합니다. 기존 클래스 이름과 속성은 유지됩니다. 감지된 선택자 및 DOM 검사 종속성은 콘솔 경고와 함께 노이즈를 제한합니다.-h, --help: 자세한 사용 지침과 함께 도움말 메시지를 표시합니다.-v, --version: WebSafeCompiler의 현재 버전을 출력합니다.node wsc.js "/path/to/source" "/path/to/output" --drm --smart
이 명령은 지정된 소스 디렉터리 내의 모든 파일을 처리하고, 최적화하며, 난독화 플래그가 활성화된 경우 코드를 무단 접근이나 변조로부터 보호합니다. 출력 파일은 웹 환경에 배포할 준비가 됩니다.

WebSafeCompiler는 JavaScript 코드를 처리하기 위해 다음 라이브러리를 사용합니다:
WebSafeCompiler를 시작하려면 시스템에 Node.js가 설치되어 있어야 합니다. 필요한 패키지를 설치하려면 다음 단계를 따르세요:
Node.js 설치: Node.js 공식 웹사이트에서 Node.js를 다운로드하여 설치합니다. 사용 중인 운영 체제에 맞는 설치 지침을 따르세요.
저장소 복제: 아직 복제하지 않았다면 저장소를 로컬 머신에 복제합니다:
git clone <repository-url>
cd <repository-directory>/source
의존성 설치: 프로젝트 디렉터리로 이동하여 필요한 npm 패키지를 설치합니다:
npm install
완료! WSC를 사용할 수 있습니다.
WSC는 HTML 태그/속성 공백을 최소화하고 일반 HTML 주석을 제거하면서, 따옴표로 묶인 값, 텍스트 공백, 원시 script/style 본문, 조건부 주석, 프레임워크 마커는 보존합니다. 감지된 소스/주석 검사는 경고와 함께 해당 마크업 편집을 비활성화합니다. JavaScript는 로컬 이름 맹글링과 5회의 압축 패스를 사용하면서 공용 전역 변수와 함수 이름은 유지합니다. DRM은 제어 흐름 평탄화, 데드 코드 주입, base64 인코딩을 통한 전체 문자열 배열 커버리지를 유지합니다. CSS는 파싱되어 최소화되며, 파서 경고가 있는 지원되지 않는 JS와 CSS는 경고와 함께 변경되지 않고 유지됩니다. 비 UTF-8 자산은 변환 없이 복사됩니다. 로컬 SRI 자산은 HTML보다 먼저 처리된 후, script, stylesheet, preload 및 template 참조에서 최종 바이트를 기준으로 SHA-256/384/512 메타데이터가 재계산됩니다. 접근 가능한 CSP 정책에서 일치하는 외부 스크립트 해시도 업데이트됩니다. 참조하는 페이지 중 하나라도 사용할 수 없는 CSP가 있거나 UTF-8로 안전하게 재작성할 수 없는 경우, 공유 자산은 DRM 경고와 함께 변경되지 않고 유지됩니다. 유효하지 않은 SRI 메타데이터는 계속 차단되며, 외부 호스팅 자산은 재작성되지 않습니다.
DRM은 기존 class 속성에 무작위 클래스를 추가하고, 적격한 일반 HTML 태그의 각 실제 속성 주위에 두 개의 무작위 비활성 속성을 추가합니다. 무작위 이름은 HTML, CSS, JS 소스 텍스트와 대조하여 확인됩니다. 클래스 동등성/부분 문자열 선택자는 영향을 받는 클래스 값을 보존하며, AST 분석은 각 페이지와 해당 로컬 JS/CSS 의존성을 사용하여 정적으로 식별된 요소, 불변 별칭 및 옵저버 하위 트리로 클래스/속성 검사를 범위 지정합니다. 관련 없는 요소는 여전히 노이즈를 받습니다. 알 수 없는 수신자, 런타임 선택자, 구조 분해 및 해결되지 않은 옵저버는 보수적인 폴백을 사용하고 경고를 출력합니다. script/style/meta/noscript 태그, 사용자 정의 요소, 외부 SVG/MathML 노드는 정크 속성을 받지 않습니다. 이러한 가드는 알려진 의존성을 커버하지만, 동적으로 계산된 선택자나 리플렉션은 항상 정적으로 추론할 수 없습니다.
DRM 모드에서 WSC는 지원되는 CSP 구성이 적용될 때 각 HTML 문서 옆에 적격한 인라인 JavaScript를 난독화된 wsc-inline-*.js 파일로 자동 추출합니다. 지원되는 CSP 구성은 루트 _headers, 루트 vercel.json(headers 규칙), 또는 HTML CSP 메타 태그입니다. 출력 정책의 script-src-elem에 'self'를 추가하며, 다른 소스 권한, 이벤트 핸들러에 대한 script-src 규칙, 그리고 관련 없는 지시문은 그대로 유지합니다. 이는 의도적으로 스크립트 권한을 동일 출처 파일로 확장합니다. 생성된 JavaScript와 헤더 구성을 HTML과 함께 배포하십시오. Nonce는 변경되지 않으며, 생성된 파일에는 SRI 해시가 포함됩니다. 리터럴 라우트와 * 와일드카드가 지원됩니다.
생성된 스크립트 태그는 원래 위치에 유지됩니다. 클래식 스크립트는 파서 차단 상태로 남으며, src를 추가할 때 무시된 인라인 async/defer 속성은 제거됩니다. 모듈은 속성을 유지하며, 파일은 상대 임포트 해석을 보존하기 위해 문서 옆에 생성됩니다. 임포트 맵, 데이터 스크립트, 스타일, 이벤트 핸들러는 인라인으로 유지됩니다.
WSC는 추출이 불가능할 때 경고를 출력합니다: 외부/알 수 없는 CSP, 지원되지 않는 라우트, strict-dynamic, <base href>, 비동기 스크립트, 템플릿 스크립트, 유효하지 않은 JavaScript, 또는 document.currentScript.src, import.meta, document.write와 같은 감지된 소스/URL 의존성. 가능한 경우 대신 인라인 코드를 난독화하고 접근 가능한 정책에서 SHA-256/384/512 해시를 업데이트합니다. 원본 스크립트 소스를 읽는 코드와 접근 가능한 정책이 없는 코드는 변경되지 않고 유지됩니다. document.currentScript.src, document.write/writeln, import.meta 및 템플릿 스크립트를 읽는 것은 추출을 방지하지만 CSP가 접근 가능할 때 인라인 난독화를 비활성화하지는 않습니다. 템플릿 실행과 소스 URL은 보존됩니다. 기존 정책에 의해 금지된 스크립트는 새로 승인되지 않습니다. DRM 없이 적격한 인라인 JavaScript는 축소되고 CSP가 접근 가능할 때 해시가 업데이트되며, 그렇지 않으면 원본 소스가 경고와 함께 유지됩니다. 외부 JS 처리와 HTML 속성 인코딩은 DRM에서도 활성화된 상태로 유지됩니다. 독립적으로 제공된 추가 HTTP 정책은 프로젝트 정책과 일치해야 하며, 임의의 소스 반영과 타이밍 의존성은 정적 분석으로 보편적으로 추론할 수 없습니다.
입력 및 출력 디렉터리는 겹쳐서는 안 됩니다. 입력 심볼릭 링크는 따라가며 그 내용은 링크의 상대 경로 아래에 컴파일됩니다. 디렉터리 순환과 출력으로 향하는 입력 링크는 경고와 함께 건너뛰며, 기존 출력 링크는 의도하지 않은 쓰기를 방지하기 위해 거부됩니다.
source에서 브라우저 회귀 테스트 스위트를 실행하십시오(테스트 러너에는 Node.js 18 이상 필요):
npm install
npx playwright install chromium
npm test
테스트는 tests/browser.js에 있습니다. 이 스위트는 OS 임시 디렉터리에 의도적으로 잘못된 형식의 사이트를 생성하고 데스크톱 및 모바일 너비에서 네 가지 플래그 조합으로 브라우저 동작과 스크린샷을 비교합니다. 실제로 생성된 JS 파일, 실행 순서, 무시된 인라인 async/defer 속성, 모듈 가져오기, 생성된 SRI, 생성된 _headers/vercel.json의 CSP, 외부에서 관리되는 CSP를 확인합니다. 또한 범위가 지정된 속성/클래스 검사, 옵저버 하위 트리, 동적 선택자 폴백, 난독화된 document.write 및 import.meta, 템플릿 스크립트 삽입, 여러 알고리즘과 패딩 없는 해시를 사용한 원시 바이트 SRI, preload/CSS SRI, 차단된 불일치 무결성, strict-dynamic, 기본 URL, 비동기 실행도 확인합니다. DRM 건너뛰기는 스마트 모드, 인코딩, 지원되지 않는 JS, 접근 불가능한 SRI/CSP, 외부 스크립트 및 이벤트 핸들러를 포함하여 영향을 받는 파일 또는 요소와 이유를 보고합니다. 브라우저 CSP 위반은 테스트를 실패시킵니다. 픽스처와 스크린샷은 검사를 위해 출력된 임시 디렉터리에 남아 있습니다. PowerShell에서 설치된 Microsoft Edge를 사용하려면:
$env:WSC_BROWSER_CHANNEL = 'msedge'
npm test
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.