"기본 보안 설정만으로는 충분하지 않다" — ASAR 무결성, Fuse 설정, 코드 서명까지 적용해야 프로덕션 수준의 보안이 됩니다.


ASAR 아카이브

ASAR(Atom Shell Archive)은 Electron 앱의 소스 코드를 하나의 아카이브 파일로 묶는 포맷입니다.

PLAINTEXT
앱.asar
├── main.js
├── preload.js
├── index.html
├── renderer.js
└── package.json

ASAR의 보안 한계

  • ASAR은 압축이 아니라 아카이브 이므로 코드를 읽을 수 있음
  • asar extract app.asar ./output 명령으로 추출 가능
  • 민감한 데이터(API 키 등)를 ASAR에 포함하면 안 됨

ASAR 무결성 검증

Electron 30+에서는 ASAR 파일의 해시를 검증할 수 있습니다.

JAVASCRIPT
// electron-builder 설정
// electron-builder.yml
asar: true
asarIntegrity: true
JAVASCRIPT
// Electron Forge 설정
// forge.config.js
module.exports = {
  packagerConfig: {
    asar: {
      integrity: true,  // ASAR 무결성 해시 생성
    },
  },
};

무결성 검증이 활성화되면, ASAR 파일이 변조되었을 때 앱이 실행을 거부합니다.


Electron Fuse

Fuse는 Electron 바이너리에 내장된 빌드 타임 설정 플래그 입니다. 런타임에서 변경할 수 없어 보안이 강합니다.

BASH
npm install @electron/fuses
JAVASCRIPT
// 빌드 스크립트에서 Fuse 설정
const { flipFuses, FuseVersion, FuseV1Options } = require('@electron/fuses');

await flipFuses(
  electronBinaryPath,  // Electron 바이너리 경로
  {
    version: FuseVersion.V1,
    [FuseV1Options.RunAsNode]: false,
    // ELECTRON_RUN_AS_NODE 환경변수 비활성화
    // 이걸 끄면 앱 바이너리를 Node.js처럼 사용할 수 없음

    [FuseV1Options.EnableCookieEncryption]: true,
    // 쿠키를 OS 키체인으로 암호화

    [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false,
    // NODE_OPTIONS 환경변수 비활성화

    [FuseV1Options.EnableNodeCliInspectArguments]: false,
    // --inspect 디버그 인자 비활성화

    [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true,
    // ASAR 무결성 검증 활성화

    [FuseV1Options.OnlyLoadAppFromAsar]: true,
    // ASAR에서만 앱 로드 (디렉토리 직접 로드 차단)
  }
);

Fuse 설정 설명

Fuse효과
RunAsNode: false앱 바이너리를 Node.js로 실행 방지
EnableCookieEncryption쿠키를 OS 키체인으로 암호화
EnableNodeOptionsEnvironmentVariable: falseNODE_OPTIONS 주입 차단
OnlyLoadAppFromAsar: trueapp.asar 없이는 앱 실행 불가

코드 서명 검증

JAVASCRIPT
// 메인 프로세스에서 앱 서명 검증 (macOS)
const { systemPreferences } = require('electron');

function verifyCodeSignature() {
  if (process.platform !== 'darwin') return true;

  // macOS에서 앱 서명 상태 확인
  const isTrusted = systemPreferences.isTrustedAccessibilityClient(false);
  return isTrusted;
}

런타임 보안 점검

JAVASCRIPT
// 앱 시작 시 보안 설정 점검
function securityAudit() {
  const issues = [];

  // 1. contextIsolation 확인
  // (런타임에서는 BrowserWindow 설정을 검사)

  // 2. 앱이 패키징 되었는지 확인
  if (!app.isPackaged) {
    issues.push('앱이 패키징되지 않았습니다 (개발 모드)');
  }

  // 3. ASAR 사용 확인
  if (!process.mainModule?.filename?.includes('.asar')) {
    issues.push('ASAR 아카이브를 사용하지 않고 있습니다');
  }

  if (issues.length > 0) {
    console.warn('보안 점검 결과:', issues);
  }

  return issues;
}

민감한 데이터 보호

JAVASCRIPT
// OS 키체인을 사용한 비밀 저장
const keytar = require('keytar');

// 비밀 저장
await keytar.setPassword('myapp', 'api-key', 'secret-value');

// 비밀 읽기
const secret = await keytar.getPassword('myapp', 'api-key');

// 비밀 삭제
await keytar.deletePassword('myapp', 'api-key');

면접 포인트 정리

  • ASAR은 아카이브일 뿐 암호화가 아님, 민감한 데이터 포함 금지
  • ASAR 무결성 검증으로 코드 변조를 감지
  • Electron Fuse는 빌드 타임 보안 플래그, 런타임에서 변경 불가
  • RunAsNode: false로 바이너리를 Node.js로 실행하는 것을 차단
  • OS 키체인(keytar)으로 비밀번호/API 키를 안전하게 저장

보안 심화를 다뤘으면, 다음은 자동 업데이트 구현을 알아봅시다.

댓글 로딩 중...