현재 Electron 애플리케이션에서는 계정별 WebContentsView마다 자체 이름이 지정된 세션을 부여합니다. 앱이 준비되면 메인 프로세스의 비동기 헬퍼가 뷰 하나를 구성할 수 있습니다.

const routeSession = session.fromPartition(partitionName);
await routeSession.setProxy({
  mode: 'fixed_servers',
  proxyRules: `http://${proxyHost}:${proxyPort}`,
});
const view = new WebContentsView({
  webPreferences: { session: routeSession },
});
view.webContents.on('login', (event, details, authInfo, callback) => {
  if (!authInfo.isProxy
      || authInfo.scheme.toLowerCase() !== 'basic'
      || authInfo.host !== proxyHost
      || authInfo.port !== proxyPort) return;
  event.preventDefault();
  if (details.firstAuthAttempt) callback(proxyUser, proxyPassword);
  else callback();
});

격리된 계정마다 별도의 partitionName을 제공하고 리스너 변수는 해당 뷰의 클로저에 보관합니다. persist: 가 없는 이름은 메모리 내 세션을 만듭니다. 같은 파티션을 다시 사용하면 그 세션 상태를 의도적으로 재사용합니다.

뷰를 기존 창에 연결하고 프록시와 핸들러가 준비된 뒤에만 탐색합니다. 코드는 firstAuthAttempt를 포함한 현재 login 이벤트 계약을 대상으로 하며, 거부된 재시도를 같은 계정으로 무한히 다시 보내지 않고 취소합니다.

핸들러는 챌린지가 의도한 Basic HTTP 프록시에서 왔는지 확인합니다. 웹사이트 로그인은 해당 자격 증명의 대상이 아닙니다.

프록시 규칙은 엔드포인트를 선택하고 login은 계정을 제공합니다. PAC 파일과 수동 프록시 규칙 자체는 이 callback의 비밀번호를 담지 않습니다.

이것은 HTTP 프록시 인증입니다. Chromium에 SOCKS5 인증을 추가하지 않습니다. 기존 세션 연결도 나중에 경로를 바꿀 때 일반적인 수명 주기 처리가 필요합니다.

관련 글