보안 심화 — ASAR 무결성과 Fuse
"기본 보안 설정만으로는 충분하지 않다" — ASAR 무결성, Fuse 설정, 코드 서명까지 적용해야 프로덕션 수준의 보안이 됩니다.
ASAR 아카이브
ASAR(Atom Shell Archive)은 Electron 앱의 소스 코드를 하나의 아카이브 파일로 묶는 포맷입니다.
앱.asar
├── main.js
├── preload.js
├── index.html
├── renderer.js
└── package.json
ASAR의 보안 한계
- ASAR은 압축이 아니라 아카이브 이므로 코드를 읽을 수 있음
asar extract app.asar ./output명령으로 추출 가능- 민감한 데이터(API 키 등)를 ASAR에 포함하면 안 됨
ASAR 무결성 검증
Electron 30+에서는 ASAR 파일의 해시를 검증할 수 있습니다.
// electron-builder 설정
// electron-builder.yml
asar: true
asarIntegrity: true
// Electron Forge 설정
// forge.config.js
module.exports = {
packagerConfig: {
asar: {
integrity: true, // ASAR 무결성 해시 생성
},
},
};
무결성 검증이 활성화되면, ASAR 파일이 변조되었을 때 앱이 실행을 거부합니다.
Electron Fuse
Fuse는 Electron 바이너리에 내장된 빌드 타임 설정 플래그 입니다. 런타임에서 변경할 수 없어 보안이 강합니다.
npm install @electron/fuses
// 빌드 스크립트에서 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: false | NODE_OPTIONS 주입 차단 |
OnlyLoadAppFromAsar: true | app.asar 없이는 앱 실행 불가 |
코드 서명 검증
// 메인 프로세스에서 앱 서명 검증 (macOS)
const { systemPreferences } = require('electron');
function verifyCodeSignature() {
if (process.platform !== 'darwin') return true;
// macOS에서 앱 서명 상태 확인
const isTrusted = systemPreferences.isTrustedAccessibilityClient(false);
return isTrusted;
}
런타임 보안 점검
// 앱 시작 시 보안 설정 점검
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;
}
민감한 데이터 보호
// 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 키를 안전하게 저장
보안 심화를 다뤘으면, 다음은 자동 업데이트 구현을 알아봅시다.
댓글 로딩 중...