Electron은 Chromium과 Node.js를 묶어 웹 기술(HTML·CSS·JavaScript)로 데스크톱 앱을 만드는 프레임워크다. 앱은 OS(Operating System) 권한을 가진 메인 프로세스(Main Process) 하나와, 창마다 하나씩 뜨는 렌더러 프로세스(Renderer Process)로 나뉜다.
- 메인 프로세스: Node.js 환경. 앱 생명주기,
BrowserWindow생성, 파일 시스템·메뉴·트레이·알림 같은 OS 작업을 맡는다 - 렌더러 프로세스: 각 창 안의 웹 페이지. 보통의 브라우저처럼 화면을 그리고, React 같은 UI 라이브러리가 여기서 돈다
- preload 스크립트: 둘 사이의 다리.
contextBridge.exposeInMainWorld()로 허용한 API(Application Programming Interface)만window에 노출한다 - IPC(Inter-Process Communication): 렌더러가
ipcRenderer.invoke()로 요청하면 메인이ipcMain.handle()로 실제 작업(파일 저장 등)을 하고 결과를 돌려준다
Renderer ──window.api.save()──▶ Preload ──ipcRenderer.invoke──▶ Main(fs 접근)보안 기본값
contextIsolation: true: preload와 페이지의 JS 컨텍스트를 분리한다nodeIntegration: false: 렌더러가 Node API를 직접 쓰지 못하게 한다. 렌더러에서 외부 콘텐츠나 XSS(Cross-Site Scripting)가 실행돼도 OS까지 닿지 않게 하려는 것이다- 메인 프로세스는 브라우저의 동일 출처 정책 같은 제약을 받지 않으므로, preload로 노출하는 API는 좁게 둔다
배포와 코드 서명(Code Signing)
macOS Gatekeeper(공증 포함)와 Windows SmartScreen은 서명 없는 앱을 막거나 경고한다. 서명은 바이너리가 변조되지 않았음을 증명하고, macOS의 자동 업데이트(autoUpdater)와 앱 스토어 배포에도 필요하다.
렌더러의 로컬 저장소로는 IndexedDB를 많이 쓴다. 원격 호출을 함수처럼 감싸는 IPC의 발상은 RPC와 닮았다.