Skip to main content

Electron과 V8 메모리 케이지

· 13 min read

Electron 21부터 V8 메모리 케이지가 활성화되며, 이로 인해 일부 네이티브 모듈에 영향을 미칠 수 있다.


업데이트 (2022/11/01)

Electron 21 이상에서 네이티브 모듈 사용에 대한 논의를 확인하려면 electron/electron#35801을 참고하라.

Electron 21에서는 Chrome 103에서와 마찬가지로 V8 샌드박스 포인터를 활성화할 예정이다. 이로 인해 네이티브 모듈에 일부 영향을 미칠 것이다. 또한, Electron 14에서 포인터 압축이라는 관련 기술을 이미 활성화한 바 있다. 당시에는 자세히 언급하지 않았지만, 포인터 압축은 V8 힙의 최대 크기에 영향을 미친다.

이 두 기술은 활성화될 경우 보안, 성능, 메모리 사용 측면에서 상당한 이점을 제공한다. 그러나 단점도 존재한다.

샌드박스 포인터를 활성화할 때의 주요 단점은 외부("오프 힙") 메모리를 가리키는 ArrayBuffer가 더 이상 허용되지 않는다는 점이다. 이는 V8에서 이 기능에 의존하는 네이티브 모듈이 Electron 20 이상에서 동작하려면 리팩토링이 필요함을 의미한다.

포인터 압축을 활성화할 때의 주요 단점은 V8 힙의 최대 크기가 4GB로 제한된다는 점이다. 이에 대한 세부 사항은 다소 복잡하다. 예를 들어, ArrayBuffer는 V8 힙과 별도로 계산되지만 자체적인 제한이 있다.

Electron 업그레이드 워킹 그룹은 포인터 압축과 V8 메모리 케이지의 이점이 단점을 상쇄할 만큼 크다고 판단했다. 이 결정에는 세 가지 주요 이유가 있다:

  1. Electron을 Chromium에 더 가깝게 유지한다. V8 설정과 같은 복잡한 내부 세부 사항에서 Electron이 Chromium과 차이가 적을수록 버그나 보안 취약점이 발생할 가능성이 줄어든다. Chromium의 보안 팀은 매우 강력하며, 그들의 작업을 최대한 활용하는 것이 중요하다. 또한, Chromium에서 사용되지 않는 설정에만 영향을 미치는 버그는 Chromium 팀이 우선적으로 수정할 가능성이 낮다.
  2. 성능이 개선된다. 포인터 압축은 V8 힙 크기를 최대 40% 줄이고 CPU 및 GC 성능을 5%~10% 향상시킨다. 4GB 힙 크기 제한에 도달하지 않고 외부 버퍼를 필요로 하는 네이티브 모듈을 사용하지 않는 대부분의 Electron 애플리케이션에게는 이는 상당한 성능 이점이다.
  3. 보안이 강화된다. 일부 Electron 앱은 신뢰할 수 없는 JavaScript를 실행하며(바라건대 보안 권장사항을 따르기를 바란다!), 이러한 앱의 경우 V8 메모리 케이지가 활성화되면 다양한 V8 취약점으로부터 보호받을 수 있다.

마지막으로, 더 큰 힙 크기가 필요한 앱을 위한 해결책도 있다. 예를 들어, 포인터 압축이 비활성화된 Node.js를 앱에 포함시키고 메모리 집약적인 작업을 자식 프로세스로 이동할 수 있다. 다소 복잡하지만, 특정 사용 사례에 맞게 포인터 압축이 비활성화된 커스텀 버전의 Electron을 빌드하는 것도 가능하다. 또한, 머지않아 wasm64가 도입되면 웹과 Electron에서 WebAssembly로 빌드된 앱이 4GB 이상의 메모리를 사용할 수 있게 될 것이다.


자주 묻는 질문

이 변경 사항이 내 앱에 영향을 미치는지 어떻게 알 수 있나요?

Electron 20 이상 버전에서는 외부 메모리를 ArrayBuffer로 감싸려고 하면 런타임 중에 충돌이 발생합니다.

앱에서 네이티브 Node 모듈을 사용하지 않는다면 안전합니다. 순수 JavaScript로는 이 충돌을 유발할 방법이 없기 때문입니다. 이 변경 사항은 V8 힙 외부에 메모리를 할당하고(예: malloc 또는 new 사용) 그 외부 메모리를 ArrayBuffer로 감싸는 네이티브 Node 모듈에만 영향을 미칩니다. 이는 상당히 드문 사용 사례이지만, 일부 모듈은 이 기법을 사용하며, Electron 20 이상 버전과 호환되려면 이러한 모듈을 리팩토링해야 합니다.

V8 힙 메모리 사용량을 측정해 4GB 제한에 근접했는지 확인하는 방법

렌더러 프로세스에서는 performance.memory.usedJSHeapSize를 사용해 V8 힙 사용량을 바이트 단위로 확인할 수 있다. 메인 프로세스에서는 process.memoryUsage().heapUsed를 사용해 비슷한 정보를 얻을 수 있다.

V8 메모리 케이지란 무엇인가?

일부 문서에서는 이를 "V8 샌드박스"라고 부르기도 하지만, 이 용어는 크로미움에서 사용되는 다른 종류의 샌드박싱과 혼동하기 쉽기 때문에 여기서는 "메모리 케이지"라는 용어를 사용하겠다.

V8에서 자주 발생하는 공격 유형은 다음과 같다:

  1. V8의 JIT 엔진에서 버그를 찾는다. JIT 엔진은 코드를 분석해 느린 런타임 타입 검사를 생략하고 빠른 기계어 코드를 생성한다. 때로는 논리 오류로 인해 이 분석이 잘못되어 필요한 타입 검사를 생략할 수 있다. 예를 들어, x가 문자열이라고 생각하지만 실제로는 객체인 경우가 있다.
  2. 이 혼란을 악용해 V8 힙 내부의 메모리 일부를 덮어쓴다. 예를 들어, ArrayBuffer의 시작 포인터를 덮어쓸 수 있다.
  3. 이제 ArrayBuffer가 원하는 위치를 가리키게 되어, 프로세스 내의 모든 메모리를 읽고 쓸 수 있게 된다. 심지어 V8이 일반적으로 접근할 수 없는 메모리도 조작할 수 있다.

V8 메모리 케이지는 이러한 종류의 공격을 근본적으로 방지하기 위한 기술이다. 이를 위해 V8 힙 내부에 어떤 포인터도 저장하지 않는다. 대신, V8 힙 내부의 다른 메모리를 참조할 때는 예약된 영역의 시작점에서의 오프셋으로 저장한다. 이렇게 하면 공격자가 V8의 타입 혼동 오류를 악용해 ArrayBuffer의 기본 주소를 손상시키더라도, 최악의 경우 케이지 내부의 메모리만 읽고 쓸 수 있다. 이는 이미 할 수 있었던 일일 가능성이 높다.

V8 메모리 케이지가 어떻게 동작하는지에 대해 더 많은 정보가 있지만, 여기서는 더 자세히 다루지 않겠다. 가장 좋은 시작점은 크로미움 팀의 고수준 설계 문서를 참고하는 것이다.

Electron 21+에서 네이티브 모듈을 리팩터링하려면 V8 메모리 케이지를 지원하도록 코드를 수정해야 한다. 이를 위한 두 가지 주요 방법이 있다.

첫 번째 방법은 외부에서 생성된 버퍼를 JavaScript로 전달하기 전에 V8 메모리 케이지로 복사하는 것이다. 이 방법은 일반적으로 간단하지만, 버퍼가 클 경우 속도가 느려질 수 있다. 두 번째 방법은 JavaScript로 전달할 메모리를 V8의 메모리 할당자를 사용해 할당하는 것이다. 이 방법은 더 복잡하지만, 복사를 피할 수 있어 대용량 버퍼에서 성능이 향상된다.

구체적인 예시로, 외부 배열 버퍼를 사용하는 N-API 모듈을 살펴보자.

// 외부에서 할당된 버퍼 생성
// |create_external_resource|는 malloc()을 통해 메모리를 할당한다.
size_t length = 0;
void* data = create_external_resource(&length);
// 버퍼로 감싸기. 메모리 케이지가 활성화되면 실패한다!
napi_value result;
napi_create_external_buffer(
env, length, data,
finalize_external_resource, NULL, &result);

이 코드는 메모리 케이지가 활성화된 상태에서 충돌을 일으킨다. 데이터가 케이지 외부에서 할당되었기 때문이다. 데이터를 케이지로 복사하도록 리팩터링하면 다음과 같다.

size_t length = 0;
void* data = create_external_resource(&length);
// V8이 할당한 메모리로 데이터를 복사해 새 버퍼 생성
napi_value result;
void* copied_data = NULL;
napi_create_buffer_copy(env, length, data, &copied_data, &result);
// 새로 복사된 데이터에 접근해야 한다면 |copied_data|를 사용한다.

이 코드는 데이터를 V8 메모리 케이지 내부의 새로 할당된 영역으로 복사한다. 필요에 따라 N-API는 새로 복사된 데이터에 대한 포인터를 제공할 수도 있다.

V8의 메모리 할당자를 사용하도록 리팩터링하는 방법은 조금 더 복잡하다. create_external_resource 함수를 수정해 malloc 대신 V8이 할당한 메모리를 사용해야 하기 때문이다. 이는 create_external_resource의 정의를 수정할 수 있는지 여부에 따라 달라진다. 먼저 napi_create_buffer를 사용해 버퍼를 생성한 후, V8이 할당한 메모리에 리소스를 초기화한다. 리소스의 수명 동안 Buffer 객체에 대한 napi_ref를 유지하는 것이 중요하다. 그렇지 않으면 V8이 Buffer를 가비지 컬렉션할 수 있으며, 이는 use-after-free 오류를 유발할 수 있다.

Electron 19.0.0

· 4 min read

Electron 19.0.0이 출시되었다! 이번 버전은 Chromium 102, V8 10.2, 그리고 Node.js 16.14.2로 업그레이드되었다. 더 자세한 내용은 아래를 참고하라!


Electron 팀은 Electron 19.0.0 출시를 발표하게 되어 기쁘게 생각한다. npm install electron@latest 명령어를 통해 npm으로 설치하거나 릴리스 웹사이트에서 다운로드할 수 있다. 이번 릴리스에 대한 자세한 내용을 계속 읽어보고, 여러분의 피드백을 공유해 주길 바란다!

주요 변경 사항

Electron 릴리스 주기 변경

Electron 프로젝트는 이전 정책으로 돌아가 최신 3개의 메이저 버전만 지원한다. Electron 버전 관리 문서에서 버전 관리 및 지원에 대한 자세한 내용을 확인할 수 있다. 이전에는 Electron 15부터 시작된 새로운 릴리스 주기에 사용자가 적응할 수 있도록 일시적으로 4개의 메이저 버전을 지원했었다. 여기에서 전체 내용을 확인할 수 있다.

스택 변경 사항

주요 변경 사항 및 API 변경점

Electron 19에서 도입된 주요 변경 사항은 다음과 같다. 이러한 변경 사항과 향후 예정된 변경에 대한 자세한 내용은 Planned Breaking Changes 페이지에서 확인할 수 있다.

Linux에서 지원되지 않는 기능: .skipTaskbar

BrowserWindow 생성자 옵션인 skipTaskbar는 더 이상 Linux에서 지원되지 않는다. 이 변경 사항은 #33226에서 적용되었다.

웹 환경 설정에서 반쯤 문서화된 preloadURL 속성이 제거되었다. #33228 이제 WebPreferences.preload를 대신 사용해야 한다.

15.x.y 및 16.x.y 지원 종료

Electron 14.x.y와 15.x.y의 지원이 종료되었다. 이로 인해 Electron은 기존 정책으로 돌아가 최신 3개의 주요 버전만 지원하게 된다. 개발자와 애플리케이션은 Electron의 최신 버전으로 업그레이드할 것을 권장한다.

E15 (2021년 9월)E16 (2021년 11월)E17 (2022년 2월)E18 (2022년 3월)E19 (2022년 5월)
15.x.y16.x.y17.x.y18.x.y19.x.y
14.x.y15.x.y16.x.y17.x.y18.x.y
13.x.y14.x.y15.x.y16.x.y17.x.y
12.x.y13.x.y14.x.y15.x.y--

다음 단계

단기적으로 팀은 Chromium, Node, V8과 같은 Electron을 구성하는 주요 컴포넌트의 개발 속도를 따라잡는 데 계속 집중할 것이다. 출시 일정에 대한 약속은 조심스럽게 하겠지만, 대략 2개월마다 이러한 컴포넌트의 새 버전과 함께 Electron의 새로운 주요 버전을 출시할 계획이다.

Electron의 공개 타임라인은 여기에서 확인할 수 있다.

향후 변경 사항에 대한 더 자세한 정보는 계획된 주요 변경 사항 페이지에서 찾을 수 있다.

S3 버킷 마이그레이션

· 3 min read

Electron이 주요 S3 버킷을 변경하고 있다. 여러분의 빌드 스크립트를 업데이트해야 할 수도 있다.

Electron의 빌드 아티팩트 상당량이 gh-contractor-zcbenz라는 S3 버킷에 업로드되어 있다. 2020년부터 시작된 인프라/소유권 이전 작업의 일환으로, 기존에 gh-contractor-zcbenz를 사용하던 모든 것을 S3에서 새로운 스토리지 시스템인 https://artifacts.electronjs.org로 이전한다. 또한 대부분의 리소스가 사용하는 경로 접두사도 약간 변경된다. 아래에 예제를 확인할 수 있다.

이전: https://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist/v17.0.0/node.lib
이후: https://artifacts.electronjs.org/headers/dist/v17.0.0/node.lib

여기서 중요한 변화는 호스트명이 변경되었고, /atom-shell 접두사가 바뀌었다는 점이다. 디버그 심볼에 대한 또 다른 예제를 살펴보자.

이전: https://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/symbols/path/to/symbol.pdb
이후: https://artifacts.electronjs.org/symbols/path/to/symbol.pdb

이번에도 호스트명이 변경되었고, /atom-shell 접두사가 사라졌다.

이 변경 사항이 여러분에게 어떤 영향을 미칠까?

대부분의 개발자는 electron-rebuild, electron-packager, @electron/get 같은 표준 빌드 도구를 사용하기 때문에 별도의 조치가 필요 없다. 이 경우가 일반적인 상황이다.

하지만 S3 버킷을 직접 참조하고 있다면, 호스트명을 업데이트하고 경로도 함께 수정해야 한다.

기존 데이터는 어떻게 되나요?

gh-contractor-zcbenz 버킷에 있던 대부분의 데이터는 새로운 스토리지 시스템으로 복제되었다. 모든 디버그 심볼과 헤더 파일이 복사되었다. 만약 해당 버킷에 있던 데이터 중 복사되지 않은 것이 있다면, electron/electron에 이슈를 등록해 알려주기 바란다.

현재 gh-contractor-zcbenz S3 버킷은 즉시 삭제되지 않는다. 하지만 이 버킷이 얼마나 오래 유지될지 보장할 수 없다. 가능한 한 빨리 새로운 버킷을 사용하도록 업데이트하는 것을 강력히 권장한다.

Electron 18.0.0

· 6 min read

Electron 18.0.0이 출시되었습니다! 이번 버전은 Chromium 100, V8 10.0, 그리고 Node.js 16.13.2로 업그레이드되었습니다. 자세한 내용은 아래에서 확인하세요!


Electron 팀은 Electron 18.0.0의 출시를 기쁘게 알립니다. npm install electron@latest 명령어를 통해 npm으로 설치하거나 릴리스 웹사이트에서 직접 다운로드할 수 있습니다. 이번 릴리스에 대한 자세한 내용을 계속 읽어보시고, 여러분의 피드백을 공유해 주세요!

주요 변경 사항

Electron 릴리스 주기 변경

Electron 15부터는 매 8주마다 새로운 메이저 안정 버전을 출시한다. 자세한 내용은 여기에서 확인할 수 있다.

또한, Electron은 2022년 5월까지 지원 버전을 최신 3개 버전에서 최신 4개 버전으로 변경했다. Electron 버전 관리에 대한 자세한 내용은 버전 관리 문서를 참고한다. 2022년 5월 이후에는 다시 최신 3개 버전을 지원할 예정이다.

스택 변경 사항

주요 기능

  • ses.setCodeCachePath() API를 추가해 코드 캐시 디렉토리를 설정할 수 있게 되었다. #33286
  • 기존 BrowserWindowProxy 기반의 window.open 구현을 제거했다. 이로 인해 webPreferences에서 nativeWindowOpen 옵션도 함께 제거되었다. #29405
  • WebContents에 'focus'와 'blur' 이벤트를 추가했다. #25873
  • macOS에서 Substitutions 메뉴 역할을 추가했다: showSubstitutions, toggleSmartQuotes, toggleSmartDashes, toggleTextReplacement. #32024
  • app.requestSingleInstanceLock() 플로우에 first-instance-ack 이벤트를 추가해 첫 번째 인스턴스에서 두 번째 인스턴스로 데이터를 원활하게 전송할 수 있게 되었다. #31460
  • setBackgroundColor에서 더 많은 색상 형식을 지원하도록 기능을 추가했다. #33364

새로운 기능과 변경 사항의 전체 목록은 18.0.0 릴리스 노트를 참고한다.

주요 변경 사항 및 API 변경점

Electron 18에서 도입된 주요 변경 사항은 다음과 같다. 이러한 변경 사항과 앞으로 예정된 변경에 대한 더 자세한 정보는 Planned Breaking Changes 페이지에서 확인할 수 있다.

Electron 15 이전에는 window.open이 기본적으로 BrowserWindowProxy를 사용하도록 구현되어 있었다. 이로 인해 window.open('about:blank')과 같은 코드가 동기적으로 스크립트 가능한 자식 윈도우를 열지 못하는 등 여러 호환성 문제가 발생했다. Electron 15부터는 nativeWindowOpen이 기본적으로 활성화되었다.

자세한 내용은 Electron의 window.open 문서를 참고한다. 이 변경 사항은 #29405에서 제거되었다.

14.x.y 버전 지원 종료

Electron 14.x.y 버전은 프로젝트의 지원 정책에 따라 지원이 종료되었다. 개발자와 애플리케이션은 더 새로운 버전의 Electron으로 업그레이드할 것을 권장한다.

Electron 15부터는 2022년 5월 Electron 19까지 지원 버전을 최신 3개 버전에서 최신 4개 버전으로 변경했다. Electron 19 이후에는 다시 최신 3개 버전을 지원할 예정이다. 이 버전 지원 변경은 새로운 릴리스 주기 변경의 일부이다. 자세한 내용은 블로그 포스트를 참고한다.

E15 (2021년 9월)E16 (2021년 11월)E17 (2022년 2월)E18 (2022년 3월)E19 (2022년 5월)
15.x.y16.x.y17.x.y18.x.y19.x.y
14.x.y15.x.y16.x.y17.x.y18.x.y
13.x.y14.x.y15.x.y16.x.y17.x.y
12.x.y13.x.y14.x.y15.x.y--

앞으로의 계획

단기적으로, 팀은 Electron을 구성하는 주요 컴포넌트인 Chromium, Node, V8의 개발 속도를 따라잡는 데 계속 집중할 예정이다. 출시 일정에 대해 약속을 하지는 않지만, 대략 2개월마다 이들 컴포넌트의 새 버전과 함께 Electron의 주요 버전을 출시할 계획이다.

Electron의 공개 타임라인은 여기에서 확인할 수 있다.

앞으로 예정된 변경 사항에 대한 더 자세한 정보는 예정된 주요 변경 사항 페이지에서 찾을 수 있다.

Google Summer of Code 2022

· 3 min read

Electron 팀은 올해 처음으로 Google Summer of Code에 참여하게 되어 매우 기쁘게 생각한다!

구글 서머 오브 코드란?

구글 서머 오브 코드(GSoC)는 오픈소스 소프트웨어 프로젝트와 잠재적인 기여자를 연결하는 연간 멘토링 프로그램이다. 이전에는 학생만 참여할 수 있었지만, 이제는 18세 이상의 누구나 GSoC에 등록할 수 있다.

더 자세한 정보는 Summer of Code 홈페이지에서 확인할 수 있다.

어떻게 신청하나요?

Electron과 함께 협업하고 싶은가요? 오픈소스 기여자가 처음이거나 초보자라도 환영합니다!

Google Summer of Code의 Electron 기여자로 선정되려면 신청서를 제출해야 합니다. 신청 기간은 2022년 4월 4일부터 2022년 4월 19일까지입니다. Google Summer of Code 신청 가이드라인 업데이트는 여기서 확인할 수 있습니다.

신청하고 싶다면 먼저 다섯 가지 프로젝트 아이디어 초안을 확인해 보세요. 나열된 모든 아이디어는 현재 제안을 받고 있습니다. 또한 제안된 프로젝트 목록에 없는 새로운 아이디어도 환영합니다.

신청서에는 다음 내용이 포함되어야 합니다:

  • 여름 동안 달성하고자 하는 계획을 상세히 설명한 제안서
  • 개발자로서의 배경. 이력서가 있다면 사본을 포함하고, 그렇지 않다면 관련 기술 경험을 중심으로 과거 경험을 설명

Electron 신청서 제출에 대한 상세 가이드는 여기서 확인할 수 있습니다.

또한 공식 GSoC 학생/기여자 가이드를 읽어보면 제안서 준비에 유용한 팁을 얻을 수 있습니다.

프로젝트 제안에 대해 논의하거나 질문이 있다면 #gsoc-general Discord 채널에 참여해 보세요!

참고 자료

Electron 17.0.0

· 6 min read

Electron 17.0.0이 출시되었다! 이번 버전은 Chromium 98, V8 9.8, 그리고 Node.js 16.13.0으로 업그레이드되었다. 자세한 내용은 아래를 확인해 보자!


Electron 팀은 Electron 17.0.0의 출시를 발표하게 되어 기쁘게 생각한다. 여러분은 npm install electron@latest 명령어를 통해 npm으로 설치하거나 릴리스 웹사이트에서 직접 다운로드할 수 있다. 이번 릴리스에 대한 자세한 내용을 계속 읽어보고, 여러분의 피드백을 공유해 주길 바란다!

주요 변경 사항

Electron 릴리즈 주기 변경

Electron 15부터는 매 8주마다 새로운 주요 안정 버전이 출시된다. 자세한 내용은 여기에서 확인할 수 있다.

또한, Electron은 2022년 5월까지 지원 버전을 최신 3개 버전에서 최신 4개 버전으로 변경했다. Electron 버전 관리에 대한 자세한 정보는 버전 관리 문서를 참고한다. 2022년 5월 이후에는 다시 최신 3개 버전을 지원할 예정이다.

스택 변경 사항

주요 기능

  • webContents.getMediaSourceId()가 추가되었다. 이 기능은 getUserMedia와 함께 사용해 WebContents의 스트림을 얻을 수 있다. #31204
  • webContents.getPrinters()는 더 이상 사용되지 않으며, 대신 webContents.getPrintersAsync()가 도입되었다. #31023
  • desktopCapturer.getSources는 이제 메인 프로세스에서만 사용 가능하다. #30720

새로운 기능과 변경 사항의 전체 목록은 17.0.0 릴리스 노트를 참고한다.

주요 변경 사항

Electron 17에서 도입된 주요 변경 사항은 다음과 같다. 이 내용과 향후 예정된 변경 사항에 대한 자세한 정보는 Planned Breaking Changes 페이지에서 확인할 수 있다.

렌더러 프로세스에서의 desktopCapturer.getSources

desktopCapturer.getSources API는 이제 메인 프로세스에서만 사용할 수 있다. 이 변경은 Electron 앱의 기본 보안을 강화하기 위해 이루어졌다.

API 변경 사항

Electron 17에서는 API 변경 사항이 없다.

제거/사용 중단된 변경 사항

  • 렌더러에서 desktopCapturer.getSources API 사용이 제거되었다. 앱에서 이 API를 대체하는 방법에 대한 자세한 내용은 여기를 참고한다.

13.x.y 버전 지원 종료

Electron 13.x.y 버전은 프로젝트의 지원 정책에 따라 지원이 종료되었다. 개발자와 애플리케이션은 더 새로운 버전의 Electron으로 업그레이드할 것을 권장한다.

Electron 15부터는 지원 버전을 최신 3개 버전에서 최신 4개 버전으로 변경했으며, 이 정책은 Electron 19까지 2022년 5월까지 유지된다. Electron 19 이후에는 다시 최신 3개 버전을 지원하는 방식으로 돌아갈 예정이다. 이 버전 지원 변경은 새로운 릴리스 주기 변경의 일부이다. 자세한 내용은 블로그 포스트를 참고한다.

E15 (2021년 9월)E16 (2021년 11월)E17 (2022년 2월)E18 (2022년 3월)E19 (2022년 5월)
15.x.y16.x.y17.x.y18.x.y19.x.y
14.x.y15.x.y16.x.y17.x.y18.x.y
13.x.y14.x.y15.x.y16.x.y17.x.y
12.x.y13.x.y14.x.y15.x.y--

다음 단계

단기적으로, Electron 팀은 Chromium, Node, V8 등 Electron을 구성하는 주요 컴포넌트의 개발 속도를 따라가기 위해 계속 노력할 것이다. 릴리스 일정에 대한 약속은 조심스럽게 다루지만, 대략 2개월마다 새로운 버전의 컴포넌트와 함께 Electron의 새로운 주요 버전을 출시할 계획이다.

Electron의 공개 타임라인은 여기에서 확인할 수 있다.

향후 변경 사항에 대한 자세한 내용은 계획된 주요 변경 사항 페이지에서 찾아볼 수 있다.

Spectron Deprecation Notice

· 4 min read

Spectron은 2022년 2월 1일부터 더 이상 지원되지 않는다.


2022년 2월부터 Spectron은 Electron 팀에 의해 공식적으로 지원이 중단된다.

Spectron이 deprecated되는 이유

Spectron은 Electron의 각 새 버전마다 새로운 릴리즈를 꾸준히 제공해왔다. 하지만 이 프로젝트는 1년 이상 동안 유지보수와 개선이 거의 이루어지지 않았으며, 현재 전담 관리자가 없다. Electron 14에서 remote 모듈이 Electron 코어에서 외부 모듈로 이동하면서, Spectron이 안정적으로 동작하려면 대대적인 재작성이 필요하다.

Spectron의 지속적인 유지보수를 위한 여러 옵션을 검토한 후, Electron 팀은 2022년에 Spectron을 deprecated하기로 결정했다.

지원 중단 일정

다음은 지원 중단 계획에 대한 일정이다:

  • 2021년 11월 - 2022년 1월: Electron 팀은 커뮤니티로부터 풀 리퀘스트를 계속 받는다.
  • 2022년 1월: Spectron 지원 중단에 대한 최종 공지가 발표된다.
  • 2022년 2월 1일: Spectron 저장소가 "보관됨"으로 표시된다. 더 이상 풀 리퀘스트를 받지 않는다.

2022년 2월 1일 이후에도 Electron은 Spectron 저장소를 무기한 유지할 예정이다. 이를 통해 다른 프로젝트에서 Spectron 코드를 포크하거나 사용할 수 있도록 한다. Spectron에 여전히 의존하는 프로젝트들이 원활히 전환할 수 있기를 바란다.

Spectron 대체 솔루션

현재 프로젝트에서 Spectron을 사용 중이고 다른 테스트 솔루션으로 전환하고 싶다면, 자동화 테스트 가이드를 참고한다.

Spectron 대신 사용할 수 있는 여러 추천 대체 솔루션이 있다. Playwright와 WebDriverIO가 대표적이다. 각 옵션에 대한 공식 튜토리얼은 자동화 테스트 문서에서 확인할 수 있다.

다음 단계

Electron 팀은 여러분이 Spectron과 Electron을 사용해 주셔서 감사하게 생각한다. 많은 분들이 앱 테스트를 위해 Spectron에 의존하고 있다는 것을 잘 알고 있으며, 이번 전환 과정을 가능한 한 원활하게 진행하려고 최선을 다하고 있다. Electron을 선택해 주셔서 다시 한번 감사드린다!

Electron 16.0.0

· 7 min read

Electron 16.0.0이 출시되었습니다! 이번 버전은 Chromium 96, V8 9.6, Node.js 16.9.1로 업그레이드되었습니다. 자세한 내용은 아래에서 확인하세요!


Electron 팀은 Electron 16.0.0 출시를 기쁘게 발표합니다! npm install electron@latest 명령어를 통해 npm으로 설치하거나 릴리스 웹사이트에서 다운로드할 수 있습니다. 이번 릴리스에 대한 자세한 정보를 계속 읽어보시고 여러분의 피드백을 공유해 주세요!

주요 변경 사항

Electron 릴리즈 주기 변경

Electron 15부터는 매 8주마다 새로운 주요 안정 버전을 출시한다. 자세한 내용은 여기에서 확인할 수 있다.

또한, Electron은 2022년 5월까지 지원 버전을 최신 3개 버전에서 최신 4개 버전으로 변경했다. Electron의 버전 관리에 대한 자세한 정보는 버전 관리 문서를 참조한다. 2022년 5월 이후에는 다시 최신 3개 버전을 지원할 예정이다.

스택 변경 사항

주요 기능

  • 이제 WebHID API를 지원한다. #30213
  • app.requestSingleInstanceLock에 데이터 파라미터를 추가해 인스턴스 간 데이터를 공유할 수 있다. #30891
  • 미디어 권한 요청 핸들러에 securityOrigin을 전달한다. #31357
  • commandLine.removeSwitch를 추가했다. #30933

새로운 기능과 변경 사항의 전체 목록은 16.0.0 릴리스 노트에서 확인할 수 있다.

주요 변경 사항

아래는 Electron 16에서 도입된 주요 변경 사항이다. 이와 관련된 자세한 정보와 향후 예정된 변경 사항은 Planned Breaking Changes 페이지에서 확인할 수 있다.

네이티브 모듈 빌드

프로젝트에서 node-gyp를 사용해 네이티브 모듈을 빌드하는 경우, 프로젝트 설정과 Electron 버전에 따라 --force-process-config 옵션을 추가해야 할 수 있다. 이 변경 사항에 대한 자세한 내용은 #2497에서 확인할 수 있다.

변경된 동작: Linux에서 crashReporter 구현이 Crashpad로 전환됨

Linux에서 crashReporter API의 내부 구현이 Breakpad에서 Crashpad로 변경되었다. 이로 인해 Windows와 Mac과 동일한 방식으로 동작하게 되었다. 이 변경으로 인해 자식 프로세스가 자동으로 모니터링되며, Node 자식 프로세스에서 process.crashReporter.start를 호출할 필요가 없어졌다(또한, 호출하지 않는 것이 좋다. 두 번째 Crashpad 리포터 인스턴스가 시작될 수 있기 때문이다).

또한, Linux에서 어노테이션(annotation)이 보고되는 방식에도 몇 가지 미묘한 변화가 생겼다. 이전에는 긴 값이 __1, __2 등으로 분할되어 추가되었지만, 이제는 (새롭고 더 긴) 어노테이션 값 제한에 따라 잘리게 된다.

API 변경 사항

Electron 16에서는 API 변경 사항이 없었다.

제거/사용 중단된 변경 사항

  • 렌더러에서 desktopCapturer.getSources API 사용이 중단되었으며, 앞으로 제거될 예정이다. 이 변경은 Electron 앱의 기본 보안을 강화하기 위한 조치다. 이 API를 대체하는 방법에 대한 자세한 내용은 여기를 참고한다.

12.x.y 지원 종료

Electron 12.x.y는 프로젝트의 지원 정책에 따라 지원이 종료되었다. 개발자와 애플리케이션은 더 새로운 버전의 Electron으로 업그레이드하는 것을 권장한다.

Electron 15부터는 지원 버전을 최신 3개 버전에서 최신 4개 버전으로 변경했으며, 이 정책은 Electron 19까지 2022년 5월까지 유지된다. Electron 19 이후에는 다시 최신 3개 버전을 지원하는 방식으로 돌아갈 예정이다. 이 버전 지원 변경은 새로운 릴리스 주기 변경의 일부이다. 자세한 내용은 블로그 포스트를 참고한다.

E15 (2021년 9월)E16 (2021년 11월)E17 (2022년 2월)E18 (2022년 3월)E19 (2022년 5월)
15.x.y16.x.y17.x.y18.x.y19.x.y
14.x.y15.x.y16.x.y17.x.y18.x.y
13.x.y14.x.y15.x.y16.x.y17.x.y
12.x.y13.x.y14.x.y15.x.y--

다음 단계

단기적으로 팀은 Chromium, Node, V8과 같은 Electron을 구성하는 주요 컴포넌트의 개발 속도를 따라잡는 데 계속 집중할 것이다. 릴리스 일정에 대해 약속하지 않도록 주의하지만, 대략 2개월마다 이러한 컴포넌트의 새 버전과 함께 Electron의 새로운 주요 버전을 출시할 계획이다.

Electron의 공개 타임라인은 여기에서 확인할 수 있다.

향후 변경 사항에 대한 자세한 정보는 계획된 주요 변경 사항 페이지에서 찾을 수 있다.

A Quiet Place (Dec'21)

· 3 min read

Electron 프로젝트는 2021년 12월 한 달 동안 잠시 휴식기에 들어간 후, 2022년 1월부터 다시 전속력으로 운영될 예정이다.

via GIPHY


12월에도 변하지 않는 사항

  1. 제로데이 및 기타 주요 보안 관련 릴리스는 필요에 따라 공개된다. 보안 이슈는 SECURITY.md를 통해 보고해야 한다.
  2. 행동 강령 관련 보고와 조정은 계속 이어질 것이다.

12월에 달라지는 점

  1. 12월에는 새로운 베타나 안정 버전이 출시되지 않는다. 12월 마지막 2주 동안은 나이틀리 버전도 출시되지 않는다.
  2. 몇 가지 예외를 제외하고, 풀 리퀘스트 리뷰나 병합 작업이 진행되지 않는다.
  3. 모든 저장소에서 이슈 트래커 업데이트가 중단된다.
  4. 메인테이너들이 디스코드에서 디버깅 도움을 제공하지 않는다.
  5. 소셜 미디어 콘텐츠 업데이트가 이루어지지 않는다.

이 현상이 발생하는 이유는?

간단히 말해, 프로젝트 관리자들은 여전히 프로젝트에 열정적이고 적극적으로 참여하고 있지만, 세상은 지쳐 있다. 12월은 대부분의 회사에서 조용한 시기이기 때문에, 우리는 관리자들이 재충전할 기회를 제공하고자 한다. 다른 프로젝트들도 비슷한 조치를 고려해 보길 권한다.

Electron의 미래에 대해 걱정해야 할까?

아니다. 우리가 이 단계를 밟을 수 있는 이유는 프로젝트가 안정적인 상태이기 때문이다. 모두가 2022년을 기대하고 있으며, 좋은 일들이 일어날 것으로 예상한다!

Electron 15.0.0

· 7 min read

Electron 15.0.0이 출시되었습니다! 이번 버전은 Chromium 94, V8 9.4, 그리고 Node.js 16.5.0으로 업그레이드되었습니다. 또한 window.open API 업데이트, 버그 수정, 그리고 전반적인 개선 사항이 포함되었습니다. 자세한 내용은 아래를 참고하세요!


Electron 팀은 Electron 15.0.0 출시를 발표하게 되어 기쁩니다! npm install electron@latest 명령어를 통해 npm으로 설치하거나 릴리스 웹사이트에서 다운로드할 수 있습니다. 이번 릴리스에 대한 자세한 내용을 계속 읽어보시고, 여러분의 피드백을 공유해 주세요!

주요 변경 사항

Electron 릴리스 주기 변경

Electron 15부터는 8주마다 새로운 주요 안정 버전을 출시한다. 자세한 내용은 여기에서 확인할 수 있다.

또한, 2022년 5월까지 지원 버전을 최신 3개 버전에서 최신 4개 버전으로 확대한다. Electron의 버전 관리에 대한 더 자세한 정보는 버전 관리 문서를 참고한다.

스택 변경사항

주요 기능

  • nativeWindowOpen: true는 더 이상 실험적 기능이 아니며, 이제 기본값으로 설정되었다.
  • 문자열 암호화 API인 safeStorage가 추가되었다. #30430
  • 페이지 내에서 프레임이 생성될 때 발생하는 'frame-created' 이벤트가 WebContents에 추가되었다. #30801
  • BrowserWindowwill-resize 이벤트에 리사이징 edge 정보가 추가되었다. #29199

새로운 기능과 변경 사항의 전체 목록은 15.0.0 릴리스 노트에서 확인할 수 있다.

주요 변경 사항

아래는 Electron 15에서 도입된 주요 변경 사항이다. 이러한 변경 사항과 향후 예정된 변경에 대한 자세한 내용은 Planned Breaking Changes 페이지에서 확인할 수 있다.

Electron 15 이전에는 window.open이 기본적으로 BrowserWindowProxy를 사용하도록 구현되었다. 이로 인해 window.open('about:blank')과 같은 코드가 동기적으로 스크립트 가능한 자식 윈도우를 열지 못하는 등 여러 호환성 문제가 발생했다. 이제 nativeWindowOpen: true는 더 이상 실험적 기능이 아니며, 기본값으로 설정되었다.

자세한 내용은 Electron의 window.open 문서를 참고한다.

API 변경 사항

  • 페이지 내에서 프레임이 생성될 때 발생하는 'frame-created' 이벤트를 WebContents에 추가했다. #30801
  • 문자열 암호화를 위한 safeStorage API를 추가했다. #30430
  • dialog.showMessageBoxsignal 옵션을 추가했다. #26102
  • 애플리케이션이 로드하는 app.asar 파일에 대한 코드 서명을 강제하는 Electron Fuse를 추가했다. 최신 asar 모듈(v3.1.0 이상)이 필요하다. #30900
  • 패키징된 앱에서 NODE_OPTIONS--inspect 디버그 인수를 비활성화하는 Fuse를 추가했다. #30420
  • 사용자가 할당한 macOS 단축키 오버라이드를 읽기 위한 새로운 MenuItem.userAccelerator 속성을 추가했다. #26682
  • Apple Silicon에서 Rosetta 또는 Windows for ARM에서 WOW로 실행 중인지 감지하기 위한 새로운 app.runningUnderARM64Translation 속성을 추가했다. #29168
  • 이미지 애니메이션 방식을 제어하기 위한 새로운 imageAnimationPolicy 웹 환경 설정을 추가했다. #29095
  • 컨텍스트 브리지를 통해 Blob을 전송하는 기능을 추가했다. #29247

제거/사용 중단된 변경 사항

제거되거나 사용 중단된 API는 없다.

지원 버전

Electron 15부터 2022년 5월 Electron 19까지 지원 버전을 최신 3개에서 최신 4개로 변경한다. Electron 19 이후에는 다시 최신 3개 버전을 지원할 예정이다. 이 버전 지원 변경은 새로운 릴리즈 주기 변경의 일부다. 자세한 내용은 블로그 포스트를 참고한다.

개발자와 애플리케이션은 최신 버전의 Electron으로 업그레이드할 것을 권장한다.

E15 (2021년 9월)E16 (2021년 11월)E17 (2022년 2월)E18 (2022년 3월)E19 (2022년 5월)
15.x.y16.x.y17.x.y18.x.y19.x.y
14.x.y15.x.y16.x.y17.x.y18.x.y
13.x.y14.x.y15.x.y16.x.y17.x.y
12.x.y13.x.y14.x.y15.x.y--

다음 단계

단기적으로, 팀은 Chromium, Node, V8과 같은 Electron을 구성하는 주요 컴포넌트의 개발 속도를 따라가기 위해 계속 노력할 것이다. 정확한 출시 일정에 대한 약속은 하지 않지만, 대략 분기별로 이들 컴포넌트의 새 버전과 함께 Electron의 새로운 주요 버전을 출시할 계획이다.

Electron의 공개 타임라인은 여기서 확인할 수 있다.

향후 예정된 변경 사항에 대한 자세한 정보는 계획된 주요 변경 사항 페이지에서 찾아볼 수 있다.