Skip to main content

세션 관리

브라우저 세션, 쿠키, 캐시, 프록시 설정 등을 관리한다.

프로세스: 메인

session 모듈을 사용해 새로운 Session 객체를 생성할 수 있다.

기존 페이지의 session에 접근하려면 WebContentssession 속성을 사용하거나 session 모듈을 활용한다.

const { BrowserWindow } = require('electron')

const win = new BrowserWindow({ width: 800, height: 600 })
win.loadURL('https://github.com')

const ses = win.webContents.session
console.log(ses.getUserAgent())

메서드

session 모듈은 다음과 같은 메서드를 제공한다:

session.fromPartition(partition[, options])

  • partition string
  • options Object (선택 사항)

Session을 반환 - partition 문자열로부터 세션 인스턴스를 가져온다. 동일한 partition을 가진 기존 Session이 존재하면 해당 세션을 반환하고, 그렇지 않으면 options를 사용해 새로운 Session 인스턴스를 생성한다.

partitionpersist:로 시작하면, 해당 페이지는 동일한 partition을 가진 앱의 모든 페이지에서 사용 가능한 영구 세션을 사용한다. persist: 접두사가 없으면, 페이지는 메모리 내 세션을 사용한다. partition이 비어 있으면 앱의 기본 세션이 반환된다.

options를 사용해 Session을 생성하려면, 해당 partition을 가진 Session이 이전에 사용된 적이 없어야 한다. 기존 Session 객체의 options를 변경할 수 없다.

session.fromPath(path[, options])

  • path string
  • options Object (선택 사항)

반환값 Session - path 문자열로 지정된 절대 경로에서 생성된 세션 인스턴스. 동일한 절대 경로를 가진 기존 Session이 존재하면 해당 세션이 반환된다. 그렇지 않으면 options를 사용해 새로운 Session 인스턴스가 생성된다. 경로가 절대 경로가 아니거나 빈 문자열이 제공된 경우 에러가 발생한다.

options를 사용해 Session을 생성하려면, 해당 path를 가진 Session이 이전에 사용된 적이 없어야 한다. 이미 존재하는 Session 객체의 options를 변경할 수 있는 방법은 없다.

속성

session 모듈은 다음 속성을 가지고 있다:

session.defaultSession

session.defaultSession는 앱의 기본 세션 객체를 나타내는 Session 객체이다.

Class: 세션

세션의 속성을 가져오고 설정한다.

프로세스: Main
이 클래스는 'electron' 모듈에서 직접 내보내지 않는다. Electron API의 다른 메서드 반환값으로만 사용할 수 있다.

session 모듈에서 Session 객체를 생성할 수 있다:

const { session } = require('electron')
const ses = session.fromPartition('persist:name')
console.log(ses.getUserAgent())

인스턴스 이벤트

Session 인스턴스에서 사용할 수 있는 이벤트는 다음과 같다:

이벤트: 'will-download'

반환값:

Electron이 webContents에서 item을 다운로드하려고 할 때 발생한다.

event.preventDefault()를 호출하면 다운로드가 취소되고, 프로세스의 다음 틱에서 item을 사용할 수 없게 된다.

const { session } = require('electron')
session.defaultSession.on('will-download', (event, item, webContents) => {
event.preventDefault()
require('got')(item.getURL()).then((response) => {
require('node:fs').writeFileSync('/somewhere', response.body)
})
})

이벤트: 'extension-loaded'

반환 값:

확장 프로그램이 로드된 후에 발생하는 이벤트이다. 이 이벤트는 확장 프로그램이 "활성화된" 확장 프로그램 집합에 추가될 때마다 발생한다. 이는 다음과 같은 경우를 포함한다:

  • Session.loadExtension을 통해 확장 프로그램이 로드되는 경우
  • 확장 프로그램이 다시 로드되는 경우:
    • 크래시 이후에 다시 로드되는 경우
    • 확장 프로그램이 직접 요청한 경우 (chrome.runtime.reload())

이벤트: 'extension-unloaded'

반환값:

확장 프로그램이 언로드된 후 발생하는 이벤트이다. 이 이벤트는 Session.removeExtension이 호출될 때 트리거된다.

이벤트: 'extension-ready'

반환값:

확장 프로그램이 로드되고, 확장 프로그램의 백그라운드 페이지를 시작하기 위해 필요한 모든 브라우저 상태가 초기화된 후에 발생한다.

이벤트: 'file-system-access-restricted'

반환값:

  • event Event
  • details Object
    • origin string - 차단된 경로에 접근을 시도한 오리진.
    • isDirectory boolean - 경로가 디렉토리인지 여부.
    • path string - 접근을 시도한 차단된 경로.
  • callback Function
    • action string - 차단된 경로 접근 시도에 대한 처리 방법.
      • allow - 차단 상태에도 불구하고 path에 접근을 허용한다.
      • deny - 접근 요청을 차단하고 AbortError를 발생시킨다.
      • tryAgain - 새로운 파일 선택기를 열어 사용자가 다른 경로를 선택할 수 있도록 한다.
const { app, dialog, BrowserWindow, session } = require('electron')

async function createWindow () {
const mainWindow = new BrowserWindow()

await mainWindow.loadURL('https://buzzfeed.com')

session.defaultSession.on('file-system-access-restricted', async (e, details, callback) => {
const { origin, path } = details
const { response } = await dialog.showMessageBox({
message: `Are you sure you want ${origin} to open restricted path ${path}?`,
title: 'File System Access Restricted',
buttons: ['Choose a different folder', 'Allow', 'Cancel'],
cancelId: 2
})

if (response === 0) {
callback('tryAgain')
} else if (response === 1) {
callback('allow')
} else {
callback('deny')
}
})

mainWindow.webContents.executeJavaScript(`
window.showDirectoryPicker({
id: 'electron-demo',
mode: 'readwrite',
startIn: 'downloads',
}).catch(e => {
console.log(e)
})`, true
)
}

app.whenReady().then(() => {
createWindow()

app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})

app.on('window-all-closed', function () {
if (process.platform !== 'darwin') app.quit()
})

이벤트: 'preconnect'

반환값:

  • event Event
  • preconnectUrl string - 렌더러가 미리 연결을 요청하는 URL
  • allowCredentials boolean - 렌더러가 자격 증명을 포함한 연결을 요청하면 true(자세한 내용은 스펙 참조)

렌더러 프로세스가 URL에 대한 미리 연결을 요청할 때 발생한다. 일반적으로 리소스 힌트로 인해 발생한다.

이벤트: 'spellcheck-dictionary-initialized'

반환값:

  • event Event
  • languageCode string - 사전 파일의 언어 코드

Hunspell 사전 파일이 성공적으로 초기화되었을 때 발생하는 이벤트다. 이 이벤트는 파일이 다운로드된 후에 트리거된다.

이벤트: 'spellcheck-dictionary-download-begin'

반환값:

  • event Event
  • languageCode string - 다운로드되는 사전 파일의 언어 코드

Hunspell 사전 파일 다운로드가 시작될 때 발생하는 이벤트이다.

이벤트: 'spellcheck-dictionary-download-success'

반환값:

  • event Event
  • languageCode string - 다운로드된 사전 파일의 언어 코드

Hunspell 사전 파일이 성공적으로 다운로드되었을 때 발생하는 이벤트

이벤트: 'spellcheck-dictionary-download-failure'

반환 값:

  • event Event
  • languageCode string - 사전 파일의 언어 코드

Hunspell 사전 파일 다운로드가 실패할 때 발생하는 이벤트다. 실패에 대한 자세한 내용을 확인하려면 netlog를 수집하고 다운로드 요청을 검사해야 한다.

이벤트: 'select-hid-device'

반환 값:

  • event Event
  • details Object
    • deviceList HIDDevice[]
    • frame WebFrameMain | null - 이 이벤트를 시작한 프레임. 프레임이 네비게이션을 했거나 파괴된 후에 접근하면 null일 수 있다.
  • callback Function
    • deviceId string | null (선택 사항)

navigator.hid.requestDevice 호출 시 HID 장치를 선택해야 할 때 발생한다. callback은 선택할 deviceId와 함께 호출해야 한다. callback에 인수를 전달하지 않으면 요청이 취소된다. 또한, navigator.hid에 대한 권한 관리는 ses.setPermissionCheckHandler(handler)ses.setDevicePermissionHandler(handler)를 사용해 추가로 관리할 수 있다.

const { app, BrowserWindow } = require('electron')

let win = null

app.whenReady().then(() => {
win = new BrowserWindow()

win.webContents.session.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => {
if (permission === 'hid') {
// HID 선택을 허용할지 결정하는 로직을 추가한다
return true
}
return false
})

// 선택적으로, 이전에 허용된 장치를 영구 저장소에서 가져온다
const grantedDevices = fetchGrantedDevices()

win.webContents.session.setDevicePermissionHandler((details) => {
if (new URL(details.origin).hostname === 'some-host' && details.deviceType === 'hid') {
if (details.device.vendorId === 123 && details.device.productId === 345) {
// 항상 이 타입의 장치를 허용한다 (이렇게 하면 `navigator.hid.requestDevice` 호출을 먼저 건너뛸 수 있다)
return true
}

// 이전에 허용된 장치 목록을 검색한다
return grantedDevices.some((grantedDevice) => {
return grantedDevice.vendorId === details.device.vendorId &&
grantedDevice.productId === details.device.productId &&
grantedDevice.serialNumber && grantedDevice.serialNumber === details.device.serialNumber
})
}
return false
})

win.webContents.session.on('select-hid-device', (event, details, callback) => {
event.preventDefault()
const selectedDevice = details.deviceList.find((device) => {
return device.vendorId === 9025 && device.productId === 67
})
callback(selectedDevice?.deviceId)
})
})

이벤트: 'hid-device-added'

반환 값:

  • event Event
  • details Object
    • device HIDDevice
    • frame WebFrameMain | null - 이 이벤트를 시작한 프레임.
      프레임이 이동되거나 제거된 후에 접근하면 null이 될 수 있다.

navigator.hid.requestDevice가 호출되고 select-hid-device 이벤트가 발생한 후, 새로운 장치가 select-hid-device의 콜백이 호출되기 전에 사용 가능해지면 이 이벤트가 발생한다. 이 이벤트는 사용자에게 장치를 선택하도록 요청하는 UI를 사용할 때, 새로 추가된 장치로 UI를 업데이트할 수 있도록 하기 위해 사용된다.

이벤트: 'hid-device-removed'

반환값:

  • event Event
  • details Object
    • device HIDDevice
    • frame WebFrameMain | null - 이 이벤트를 시작한 프레임.
      프레임이 네비게이션을 진행했거나 소멸된 이후에 접근하면 null이 될 수 있다.

navigator.hid.requestDevice가 호출되고 select-hid-device 이벤트가 발생한 후,
select-hid-device의 콜백이 호출되기 전에 장치가 제거되면 이 이벤트가 발생한다.
이 이벤트는 사용자에게 장치를 선택하도록 요청하는 UI를 사용할 때,
지정된 장치를 UI에서 제거하기 위해 업데이트할 수 있도록 의도되었다.

이벤트: 'hid-device-revoked'

반환 값:

  • event Event
  • details Object
    • device HIDDevice
    • origin string (선택 사항) - 장치가 해제된 오리진

HIDDevice.forget() 메서드가 호출된 후에 발생한다. 이 이벤트는 setDevicePermissionHandler를 사용할 때 권한을 지속적으로 저장하는 데 도움을 줄 수 있다.

이벤트: 'select-serial-port'

반환값:

navigator.serial.requestPort 호출 시 시리얼 포트를 선택해야 할 때 발생하는 이벤트다. callback을 호출할 때 선택할 portId를 전달해야 한다. 빈 문자열을 callback에 전달하면 요청을 취소한다. 또한, navigator.serial에 대한 권한 관리는 ses.setPermissionCheckHandler(handler)serial 권한과 함께 사용하여 처리할 수 있다.

const { app, BrowserWindow } = require('electron')

let win = null

app.whenReady().then(() => {
win = new BrowserWindow({
width: 800,
height: 600
})

win.webContents.session.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => {
if (permission === 'serial') {
// 시리얼 포트 선택을 허용할지 여부를 결정하는 로직을 추가
return true
}
return false
})

// 선택적으로, 이전에 허용된 장치를 영구 저장소에서 가져옴
const grantedDevices = fetchGrantedDevices()

win.webContents.session.setDevicePermissionHandler((details) => {
if (new URL(details.origin).hostname === 'some-host' && details.deviceType === 'serial') {
if (details.device.vendorId === 123 && details.device.productId === 345) {
// 항상 이 타입의 장치를 허용 (`navigator.serial.requestPort` 호출을 우회)
return true
}

// 이전에 허용된 장치 목록을 검색
return grantedDevices.some((grantedDevice) => {
return grantedDevice.vendorId === details.device.vendorId &&
grantedDevice.productId === details.device.productId &&
grantedDevice.serialNumber && grantedDevice.serialNumber === details.device.serialNumber
})
}
return false
})

win.webContents.session.on('select-serial-port', (event, portList, webContents, callback) => {
event.preventDefault()
const selectedPort = portList.find((device) => {
return device.vendorId === '9025' && device.productId === '67'
})
if (!selectedPort) {
callback('')
} else {
callback(selectedPort.portId)
}
})
})

이벤트: 'serial-port-added'

반환값:

navigator.serial.requestPort가 호출되고 select-serial-port 이벤트가 발생한 후, select-serial-port의 콜백이 호출되기 전에 새로운 시리얼 포트가 사용 가능해지면 이 이벤트가 발생한다. 이 이벤트는 사용자에게 포트를 선택하도록 요청하는 UI를 사용할 때, 새로 추가된 포트로 UI를 업데이트할 수 있도록 하기 위한 목적으로 사용된다.

이벤트: 'serial-port-removed'

반환 값:

navigator.serial.requestPort가 호출된 후, 그리고 select-serial-port가 발생한 이후에 시리얼 포트가 제거되면 이 이벤트가 발생한다. 이 이벤트는 사용자에게 포트를 선택하도록 요청하는 UI를 사용할 때, 해당 포트를 UI에서 제거할 수 있도록 업데이트하기 위해 사용된다.

이벤트: 'serial-port-revoked'

반환값:

  • event Event
  • details Object
    • port SerialPort
    • frame WebFrameMain | null - 이 이벤트를 발생시킨 프레임. 프레임이 네비게이션을 수행하거나 파괴된 후에 접근하면 null이 될 수 있다.
    • origin string - 디바이스 접근 권한이 취소된 오리진.

SerialPort.forget()가 호출된 후에 발생한다. 이 이벤트는 setDevicePermissionHandler를 사용할 때 권한 정보를 지속적으로 저장하는 데 활용할 수 있다.

// 브라우저 프로세스
const { app, BrowserWindow } = require('electron')

app.whenReady().then(() => {
const win = new BrowserWindow({
width: 800,
height: 600
})

win.webContents.session.on('serial-port-revoked', (event, details) => {
console.log(`오리진 ${details.origin}에서 시리얼 디바이스 접근 권한이 취소되었습니다.`)
})
})
// 렌더러 프로세스

const portConnect = async () => {
// 포트 요청
const port = await navigator.serial.requestPort()

// 시리얼 포트가 열릴 때까지 대기
await port.open({ baudRate: 9600 })

// ...이후, 시리얼 포트 접근 권한 취소
await port.forget()
}

이벤트: 'select-usb-device'

반환값:

  • event Event
  • details Object
    • deviceList USBDevice[]
    • frame WebFrameMain | null - 이 이벤트를 발생시킨 프레임. 프레임이 네비게이션을 했거나 파괴된 후에 접근하면 null이 될 수 있다.
  • callback Function
    • deviceId string (선택 사항)

이 이벤트는 navigator.usb.requestDevice 호출 시 USB 장치를 선택해야 할 때 발생한다. callback은 선택된 deviceId와 함께 호출되어야 하며, callback에 인수를 전달하지 않으면 요청이 취소된다. 또한, navigator.usb에 대한 권한 관리는 ses.setPermissionCheckHandler(handler)ses.setDevicePermissionHandler(handler)를 사용하여 더 세밀히 제어할 수 있다.

const { app, BrowserWindow } = require('electron')

let win = null

app.whenReady().then(() => {
win = new BrowserWindow()

win.webContents.session.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => {
if (permission === 'usb') {
// USB 선택을 허용할지 여부를 결정하는 로직을 추가한다.
return true
}
return false
})

// 선택적으로, 이전에 허용된 장치를 영구 저장소에서 가져온다 (fetchGrantedDevices는 개발자가 구현해야 한다).
const grantedDevices = fetchGrantedDevices()

win.webContents.session.setDevicePermissionHandler((details) => {
if (new URL(details.origin).hostname === 'some-host' && details.deviceType === 'usb') {
if (details.device.vendorId === 123 && details.device.productId === 345) {
// 항상 이 타입의 장치를 허용한다 (이렇게 하면 `navigator.usb.requestDevice` 호출을 건너뛸 수 있다).
return true
}

// 이전에 허용된 장치 목록을 검색한다.
return grantedDevices.some((grantedDevice) => {
return grantedDevice.vendorId === details.device.vendorId &&
grantedDevice.productId === details.device.productId &&
grantedDevice.serialNumber && grantedDevice.serialNumber === details.device.serialNumber
})
}
return false
})

win.webContents.session.on('select-usb-device', (event, details, callback) => {
event.preventDefault()
const selectedDevice = details.deviceList.find((device) => {
return device.vendorId === 9025 && device.productId === 67
})
if (selectedDevice) {
// 선택적으로, 이 장치를 영구 저장소에 추가한다 (updateGrantedDevices는 개발자가 구현해야 한다).
grantedDevices.push(selectedDevice)
updateGrantedDevices(grantedDevices)
}
callback(selectedDevice?.deviceId)
})
})

이벤트: 'usb-device-added'

반환 값:

navigator.usb.requestDevice가 호출된 후, 그리고 select-usb-device 이벤트가 발생한 상태에서, select-usb-device의 콜백이 호출되기 전에 새로운 장치가 추가되면 이 이벤트가 발생한다. 이 이벤트는 사용자에게 장치를 선택하도록 요청하는 UI를 사용할 때, 새로 추가된 장치로 UI를 업데이트할 수 있도록 하기 위해 사용된다.

이벤트: 'usb-device-removed'

반환값:

navigator.usb.requestDevice가 호출된 후, select-usb-device 이벤트가 발생했지만 콜백이 실행되기 전에 장치가 제거된 경우 이 이벤트가 발생한다. 이 이벤트는 사용자에게 장치를 선택하도록 요청하는 UI를 사용할 때, 지정된 장치를 UI에서 제거하기 위해 활용할 수 있다.

이벤트: 'usb-device-revoked'

반환값:

  • event Event
  • details Object
    • device USBDevice
    • origin string (옵션) - 디바이스가 해제된 오리진

USBDevice.forget() 메서드가 호출된 후 발생한다. 이 이벤트는 setDevicePermissionHandler를 사용할 때 권한 정보를 지속적으로 저장하는 데 활용할 수 있다.

인스턴스 메서드

다음은 Session 인스턴스에서 사용할 수 있는 메서드들이다:

ses.getCacheSize()

Promise<Integer>를 반환한다. 현재 세션의 캐시 크기를 바이트 단위로 나타낸다.

ses.clearCache()

Promise<void>를 반환한다. 캐시 삭제 작업이 완료되면 resolve 된다.

세션의 HTTP 캐시를 모두 지운다.

ses.clearStorageData([options])

  • options Object (선택 사항)
    • origin string (선택 사항) - window.location.origin의 표현 방식인 scheme://host:port를 따라야 한다.
    • storages string[] (선택 사항) - 삭제할 스토리지 타입을 지정할 수 있다. 가능한 값은 cookies, filesystem, indexdb, localstorage, shadercache, websql, serviceworkers, cachestorage이다. 지정하지 않으면 모든 스토리지 타입을 삭제한다.
    • quotas string[] (선택 사항) - 삭제할 할당량(quota) 타입을 지정할 수 있다. 가능한 값은 temporary, syncable이다. 지정하지 않으면 모든 할당량을 삭제한다.

반환값: Promise<void> - 스토리지 데이터가 삭제되면 resolve된다.

ses.flushStorageData()

아직 디스크에 쓰지 않은 DOMStorage 데이터를 모두 저장한다.

ses.setProxy(config)

Promise<void>를 반환한다. 프록시 설정이 완료되면 이 Promise가 해결된다.

프록시 설정을 지정한다.

현재 진행 중인 연결이 이전 프록시를 사용하는 풀링된 소켓이 미래의 요청에 재사용되지 않도록 하려면, ses.closeAllConnections을 호출하여 모든 연결을 닫아야 할 수 있다.

ses.resolveHost(host, [options])

  • host string - 해결할 호스트명.
  • options Object (선택사항)
    • queryType string (선택사항) - 요청할 DNS 쿼리 타입. 지정하지 않으면 리졸버가 IPv4/IPv6 설정에 따라 A 또는 AAAA 레코드를 선택한다:
      • A - A 레코드만 가져온다.
      • AAAA - AAAA 레코드만 가져온다.
    • source string (선택사항) - 해결된 주소를 가져올 소스. 기본값은 리졸버가 적절한 소스를 선택한다. 주로 큰 외부 소스(예: 시스템 호출 또는 DNS 사용)에 영향을 미친다. 소스를 지정하더라도 캐시, "localhost" 해결, IP 리터럴 등에서 결과를 가져올 수 있다. 다음 값 중 하나를 사용한다:
      • any (기본값) - 리졸버가 적절한 소스를 선택한다. 결과는 DNS, MulticastDNS, HOSTS 파일 등에서 올 수 있다.
      • system - 결과는 시스템 또는 OS에서만 가져온다. 예를 들어 getaddrinfo() 시스템 호출을 통해 가져온다.
      • dns - 결과는 DNS 쿼리에서만 가져온다.
      • mdns - 결과는 Multicast DNS 쿼리에서만 가져온다.
      • localOnly - 외부 소스를 사용하지 않는다. 결과는 소스 설정에 관계없이 항상 사용 가능한 빠른 로컬 소스(예: 캐시, hosts 파일, IP 리터럴 해결 등)에서만 가져온다.
    • cacheUsage string (선택사항) - DNS 캐시 항목을 사용할지 여부를 지정한다. 다음 값 중 하나를 사용한다:
      • allowed (기본값) - 캐시가 신선한 경우 결과를 캐시에서 가져올 수 있다.
      • staleAllowed - 캐시가 오래되었더라도(만료 또는 네트워크 변경으로 인해) 결과를 캐시에서 가져올 수 있다.
      • disallowed - 결과를 캐시에서 가져오지 않는다.
    • secureDnsPolicy string (선택사항) - 이 요청에 대한 리졸버의 Secure DNS 동작을 제어한다. 다음 값 중 하나를 사용한다:
      • allow (기본값)
      • disable

Promise<ResolvedHost>를 반환한다 - host에 대한 해결된 IP 주소와 함께 이행된다.

ses.resolveProxy(url)

  • url URL

Promise<string>를 반환한다. url에 대한 프록시 정보를 제공한다.

ses.forceReloadProxyConfig()

Promise<void>를 반환한다. 프록시 서비스의 모든 내부 상태가 초기화되고, 이미 사용 가능한 경우 최신 프록시 설정이 다시 적용되면 이 Promise가 해결된다. 프록시 모드가 pac_script인 경우, pacScript에서 PAC 스크립트를 다시 가져온다.

ses.setDownloadPath(path)

  • path string - 다운로드 위치

다운로드 저장 위치를 설정한다. 기본적으로 다운로드 디렉터리는 해당 앱 폴더 아래의 Downloads 디렉터리로 지정된다.

ses.enableNetworkEmulation(options)

  • options Object
    • offline boolean (선택 사항) - 네트워크 중단을 에뮬레이션할지 여부. 기본값은 false.
    • latency Double (선택 사항) - RTT를 밀리초 단위로 지정. 기본값은 0이며, 이 경우 지연 제어가 비활성화됨.
    • downloadThroughput Double (선택 사항) - 다운로드 속도를 Bps 단위로 지정. 기본값은 0이며, 이 경우 다운로드 제어가 비활성화됨.
    • uploadThroughput Double (선택 사항) - 업로드 속도를 Bps 단위로 지정. 기본값은 0이며, 이 경우 업로드 제어가 비활성화됨.

주어진 설정으로 session에 대해 네트워크 에뮬레이션을 활성화한다.

const win = new BrowserWindow()

// 50kbps 처리량과 500ms 지연 시간을 가진 GPRS 연결을 에뮬레이션.
win.webContents.session.enableNetworkEmulation({
latency: 500,
downloadThroughput: 6400,
uploadThroughput: 6400
})

// 네트워크 중단을 에뮬레이션.
win.webContents.session.enableNetworkEmulation({ offline: true })

ses.preconnect(options)

  • options Object
    • url string - 미리 연결할 URL. 소켓을 열기 위해선 오리진만 중요하다.
    • numSockets number (선택사항) - 미리 연결할 소켓의 수. 1에서 6 사이여야 한다. 기본값은 1이다.

주어진 수의 소켓을 특정 오리진에 미리 연결한다.

ses.closeAllConnections()

Promise<void>를 반환한다. 모든 연결이 닫히면 이 Promise가 이행된다.

참고: 이 메서드는 현재 진행 중인 모든 요청을 종료하거나 실패하게 만든다.

ses.fetch(input[, init])

반환값: Promise<GlobalResponse> - Response 참조

렌더러에서 fetch()가 작동하는 방식과 유사하게 Chrome의 네트워크 스택을 사용해 요청을 보낸다. Node.js의 HTTP 스택을 사용하는 Node의 fetch()와는 다르다.

예제:

async function example () {
const response = await net.fetch('https://my.app')
if (response.ok) {
const body = await response.json()
// ... 결과를 사용한다.
}
}

참고: net.fetch()기본 세션에서 요청을 발행하는 편의 메서드이다.

자세한 내용은 MDN 문서의 fetch()를 참조한다.

제한 사항:

  • net.fetch()data: 또는 blob: 스키마를 지원하지 않는다.
  • integrity 옵션의 값은 무시된다.
  • 반환된 Response 객체의 .type.url 값이 정확하지 않다.

기본적으로 net.fetch를 사용한 요청은 file:커스텀 프로토콜에도 가능하며, webRequest 핸들러가 존재하면 이를 트리거한다. RequestInit에 비표준 옵션인 bypassCustomProtocolHandlers가 설정되면, 해당 요청에 대해 커스텀 프로토콜 핸들러가 호출되지 않는다. 이를 통해 가로챈 요청을 내장 핸들러로 전달할 수 있다. 커스텀 프로토콜을 우회할 때도 webRequest 핸들러는 여전히 트리거된다.

protocol.handle('https', (req) => {
if (req.url === 'https://my-app.com') {
return new Response('<body>my app</body>')
} else {
return net.fetch(req, { bypassCustomProtocolHandlers: true })
}
})

ses.disableNetworkEmulation()

session에 활성화된 모든 네트워크 에뮬레이션을 비활성화한다. 원래의 네트워크 설정으로 초기화된다.

ses.setCertificateVerifyProc(proc)

  • proc Function | null
    • request Object
      • hostname string
      • certificate Certificate
      • validatedCertificate Certificate
      • isIssuedByKnownRoot boolean - 크로미움이 루트 CA를 표준 루트로 인식하면 true. 그렇지 않다면 이 인증서는 로컬에 설치된 MITM 프록시(예: 회사 프록시)에 의해 생성된 것일 가능성이 높다. verificationResultOK가 아닌 경우 이 인증서를 신뢰해서는 안 된다.
      • verificationResult string - 인증서가 신뢰할 수 있는 경우 OK, 그렇지 않으면 CERT_REVOKED와 같은 오류.
      • errorCode Integer - 오류 코드.
    • callback Function
      • verificationResult Integer - 값은 여기의 인증서 오류 코드 중 하나가 될 수 있다. 인증서 오류 코드 외에도 다음과 같은 특수 코드를 사용할 수 있다.
        • 0 - 성공을 나타내며 Certificate Transparency 검증을 비활성화한다.
        • -2 - 실패를 나타낸다.
        • -3 - 크로미움의 검증 결과를 사용한다.

session에 대한 인증서 검증 프로시저를 설정한다. 서버 인증서 검증이 요청될 때마다 proc(request, callback)으로 proc이 호출된다. callback(0)을 호출하면 인증서를 수락하고, callback(-2)를 호출하면 거부한다.

setCertificateVerifyProc(null)을 호출하면 기본 인증서 검증 프로시저로 되돌린다.

const { BrowserWindow } = require('electron')
const win = new BrowserWindow()

win.webContents.session.setCertificateVerifyProc((request, callback) => {
const { hostname } = request
if (hostname === 'github.com') {
callback(0)
} else {
callback(-2)
}
})

참고: 이 프로시저의 결과는 네트워크 서비스에 의해 캐시된다.

ses.setPermissionRequestHandler(handler)

  • handler Function | null
    • webContents WebContents - 권한을 요청하는 WebContents. 요청이 서브프레임에서 온 경우, requestingUrl을 사용해 요청 오리진을 확인해야 한다.
    • permission string - 요청된 권한의 타입.
      • clipboard-read - 클립보드에서 읽기 권한 요청.
      • clipboard-sanitized-write - 클립보드에 쓰기 권한 요청.
      • display-capture - Screen Capture API를 통해 화면 캡처 권한 요청.
      • fullscreen - Fullscreen API를 통해 앱의 전체 화면 상태 제어 권한 요청.
      • geolocation - Geolocation API를 통해 사용자 위치 정보 접근 권한 요청.
      • idle-detection - IdleDetector API를 통해 사용자의 유휴 상태 접근 권한 요청.
      • media - 카메라, 마이크, 스피커와 같은 미디어 장치 접근 권한 요청.
      • mediaKeySystem - DRM 보호 콘텐츠 접근 권한 요청.
      • midi - Web MIDI API를 통해 MIDI 접근 권한 요청.
      • midiSysex - Web MIDI API를 통해 시스템 독점 메시지 사용 권한 요청.
      • notifications - Notifications API를 통해 알림 생성 및 시스템 트레이에 표시 권한 요청.
      • pointerLock - Pointer Lock API를 통해 마우스 움직임을 직접 입력으로 해석하는 권한 요청. 이 요청은 항상 메인 프레임에서 발생한다.
      • keyboardLock - Keyboard Lock API를 통해 물리적 키보드의 키 입력을 캡처하는 권한 요청. 이 요청은 항상 메인 프레임에서 발생한다.
      • openExternal - 외부 애플리케이션에서 링크 열기 권한 요청.
      • speaker-selection - speaker-selection permissions policy를 통해 오디오 출력 장치 열거 및 선택 권한 요청.
      • storage-access - Storage Access API를 통해 서드파티 컨텍스트에서 로드된 콘텐츠가 서드파티 쿠키 접근 권한을 요청할 수 있도록 허용.
      • top-level-storage-access - Storage Access API를 통해 최상위 사이트가 동일한 관련 웹사이트 세트 내의 다른 사이트에서 발생한 임베디드 콘텐츠를 대신해 서드파티 쿠키 접근 권한을 요청할 수 있도록 허용.
      • window-management - getScreenDetails API를 통해 화면 열거 권한 요청.
      • unknown - 인식되지 않은 권한 요청.
      • fileSystem - File System API를 통해 파일 읽기, 쓰기 및 관리 기능 접근 권한 요청.
    • callback Function
      • permissionGranted boolean - 권한 허용 또는 거부.
    • details PermissionRequest | FilesystemPermissionRequest | MediaAccessPermissionRequest | OpenExternalPermissionRequest - 요청된 권한에 대한 추가 정보.

session에 대한 권한 요청을 처리할 핸들러를 설정한다. callback(true)를 호출하면 권한을 허용하고, callback(false)를 호출하면 거부한다. 핸들러를 제거하려면 setPermissionRequestHandler(null)을 호출한다. 완전한 권한 처리를 위해 setPermissionCheckHandler도 구현해야 한다. 대부분의 웹 API는 권한 확인을 수행하고, 확인이 거부되면 권한 요청을 한다.

const { session } = require('electron')
session.fromPartition('some-partition').setPermissionRequestHandler((webContents, permission, callback) => {
if (webContents.getURL() === 'some-host' && permission === 'notifications') {
return callback(false) // 거부.
}

callback(true)
})

ses.setPermissionCheckHandler(handler)

  • handler Function<boolean> | null
    • webContents (WebContents | null) - 권한을 확인하는 WebContents. 요청이 서브프레임에서 오는 경우 requestingUrl을 사용해 요청 오리진을 확인해야 한다. 크로스 오리진 서브프레임이 권한을 확인할 때는 이 핸들러에 null WebContents가 전달된다. notifications와 같은 특정 권한 확인은 항상 null을 전달한다. embeddingOriginrequestingOrigin을 사용해 소유 프레임과 요청 프레임의 오리진을 각각 확인할 수 있다.
    • permission string - 확인할 권한의 타입.
      • clipboard-read - 클립보드에서 읽기 권한 요청.
      • clipboard-sanitized-write - 클립보드에 쓰기 권한 요청.
      • geolocation - Geolocation API를 통해 사용자의 위치 데이터에 접근.
      • fullscreen - Fullscreen API를 통해 앱의 전체 화면 상태를 제어.
      • hid - WebHID API를 통해 HID 장치를 조작.
      • idle-detection - IdleDetector API를 통해 사용자의 유휴 상태에 접근.
      • media - 카메라, 마이크, 스피커와 같은 미디어 장치에 접근.
      • mediaKeySystem - DRM으로 보호된 콘텐츠에 접근.
      • midi - Web MIDI API를 통해 MIDI 접근 활성화.
      • midiSysex - Web MIDI API에서 시스템 독점 메시지 사용.
      • notifications - Notifications API를 통해 데스크톱 알림을 구성하고 표시.
      • openExternal - 외부 애플리케이션에서 링크 열기.
      • pointerLock - Pointer Lock API를 통해 마우스 이동을 직접 입력으로 해석. 이러한 요청은 항상 메인 프레임에서 발생한 것으로 간주.
      • serial - Web Serial API를 통해 시리얼 장치에서 읽고 쓰기.
      • storage-access - Storage Access API를 통해 서드파티 컨텍스트에서 로드된 콘텐츠가 서드파티 쿠키에 접근 요청.
      • top-level-storage-access - Storage Access API를 통해 최상위 사이트가 동일한 관련 웹사이트 세트에서 다른 사이트에서 오는 임베디드 콘텐츠를 대신해 서드파티 쿠키 접근 요청.
      • usb - WebUSB API를 통해 비표준 USB 호환 장치 서비스를 웹에 노출.
    • requestingOrigin string - 권한 확인 요청의 오리진 URL.
    • details Object - 일부 속성은 특정 권한 타입에서만 사용 가능.
      • embeddingOrigin string (optional) - 권한 확인을 요청한 프레임을 임베드한 프레임의 오리진. 크로스 오리진 서브프레임이 권한을 확인할 때만 설정.
      • securityOrigin string (optional) - media 확인의 보안 오리진.
      • mediaType string (optional) - 요청된 미디어 접근 타입. video, audio, unknown 중 하나.
      • requestingUrl string (optional) - 요청 프레임이 마지막으로 로드한 URL. 크로스 오리진 서브프레임이 권한을 확인할 때는 제공되지 않음.
      • isMainFrame boolean - 요청을 보낸 프레임이 메인 프레임인지 여부.

session에 대한 권한 확인에 응답할 핸들러를 설정한다. true를 반환하면 권한을 허용하고, false를 반환하면 거부한다. 완전한 권한 처리를 위해 setPermissionRequestHandler도 구현해야 한다. 대부분의 웹 API는 권한 확인을 수행한 후 확인이 거부되면 권한 요청을 한다. 핸들러를 제거하려면 setPermissionCheckHandler(null)을 호출한다.

const { session } = require('electron')
const url = require('url')
session.fromPartition('some-partition').setPermissionCheckHandler((webContents, permission, requestingOrigin) => {
if (new URL(requestingOrigin).hostname === 'some-host' && permission === 'notifications') {
return true // 허용
}

return false // 거부
})

ses.setDisplayMediaRequestHandler(handler[, opts])

  • handler Function | null
    • request Object
      • frame WebFrameMain | null - 미디어 접근을 요청하는 프레임. 프레임이 네비게이션되거나 파괴된 후에 접근하면 null이 될 수 있다.
      • securityOrigin String - 요청을 만든 페이지의 오리진.
      • videoRequested Boolean - 웹 콘텐츠가 비디오 스트림을 요청했으면 true.
      • audioRequested Boolean - 웹 콘텐츠가 오디오 스트림을 요청했으면 true.
      • userGesture Boolean - 이 요청이 트리거될 때 사용자 제스처가 활성화되었는지 여부.
    • callback Function
      • streams Object
        • video Object | WebFrameMain (optional)
          • id String - 허용되는 스트림의 ID. 일반적으로 DesktopCapturerSource 객체에서 가져온다.
          • name String - 허용되는 스트림의 이름. 일반적으로 DesktopCapturerSource 객체에서 가져온다.
        • audio String | WebFrameMain (optional) - 문자열이 지정되면 loopback 또는 loopbackWithMute가 될 수 있다. 루프백 장치를 지정하면 시스템 오디오를 캡처하며, 현재는 Windows에서만 지원된다. WebFrameMain이 지정되면 해당 프레임에서 오디오를 캡처한다.
        • enableLocalEcho Boolean (optional) - audioWebFrameMain이고 이 값이 true로 설정되면, 오디오의 로컬 재생이 음소거되지 않는다 (예: MediaRecorder를 사용하여 WebFrameMain을 녹음할 때 이 플래그를 true로 설정하면 녹음 중에도 스피커로 오디오가 전달된다). 기본값은 false.
  • opts Object (optional) macOS Experimental
    • useSystemPicker Boolean - 사용 가능한 네이티브 시스템 선택기를 사용할지 여부. 기본값은 false. macOS Experimental

이 핸들러는 웹 콘텐츠가 navigator.mediaDevices.getDisplayMedia API를 통해 디스플레이 미디어 접근을 요청할 때 호출된다. desktopCapturer API를 사용하여 접근을 허용할 스트림을 선택한다.

useSystemPicker는 애플리케이션이 getSources에서 특정 비디오 소스를 제공하는 대신 시스템 선택기를 사용할 수 있게 한다. 이 옵션은 실험적이며, 현재 MacOS 15+에서만 사용 가능하다. 시스템 선택기가 사용 가능하고 useSystemPickertrue로 설정되면 핸들러가 호출되지 않는다.

const { session, desktopCapturer } = require('electron')

session.defaultSession.setDisplayMediaRequestHandler((request, callback) => {
desktopCapturer.getSources({ types: ['screen'] }).then((sources) => {
// 찾은 첫 번째 화면에 접근을 허용한다.
callback({ video: sources[0] })
})
// 사용 가능한 경우 시스템 선택기를 사용한다.
// 참고: 이 기능은 현재 실험적이다. 시스템 선택기가
// 사용 가능하면, 미디어 요청 핸들러는 호출되지 않는다.
}, { useSystemPicker: true })

WebFrameMain 객체를 비디오 또는 오디오 스트림으로 전달하면 해당 프레임에서 비디오 또는 오디오 스트림을 캡처한다.

const { session } = require('electron')

session.defaultSession.setDisplayMediaRequestHandler((request, callback) => {
// 탭이 자신을 캡처하도록 허용한다.
callback({ video: request.frame })
})

함수 대신 null을 전달하면 핸들러를 기본 상태로 재설정한다.

ses.setDevicePermissionHandler(handler)

  • handler Function<boolean> | null
    • details Object
      • deviceType string - 권한을 요청하는 장치의 타입. hid, serial, usb 중 하나일 수 있다.
      • origin string - 장치 권한 확인을 요청한 오리진 URL.
      • device HIDDevice | SerialPort | USBDevice - 권한을 요청하는 장치.

session에 대한 장치 권한 확인 요청에 응답할 수 있는 핸들러를 설정한다. true를 반환하면 장치 권한을 허용하고, false를 반환하면 거부한다. 핸들러를 제거하려면 setDevicePermissionHandler(null)을 호출한다.

이 핸들러는 장치 권한을 먼저 요청하지 않고도 기본 권한을 제공하는 데 사용할 수 있다 (예: navigator.hid.requestDevice). 이 핸들러가 정의되지 않으면, 장치 선택을 통해 부여된 기본 장치 권한이 사용된다 (예: navigator.hid.requestDevice). 또한, Electron의 기본 동작은 부여된 장치 권한을 메모리에 저장한다. 장기 저장이 필요한 경우, 개발자는 부여된 장치 권한을 저장할 수 있다 (예: select-hid-device 이벤트 처리 시) 그리고 setDevicePermissionHandler를 통해 해당 저장소에서 읽어올 수 있다.

const { app, BrowserWindow } = require('electron')

let win = null

app.whenReady().then(() => {
win = new BrowserWindow()

win.webContents.session.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => {
if (permission === 'hid') {
// HID 선택을 허용할지 여부를 결정하는 로직을 추가한다
return true
} else if (permission === 'serial') {
// 시리얼 포트 선택을 허용할지 여부를 결정하는 로직을 추가한다
} else if (permission === 'usb') {
// USB 장치 선택을 허용할지 여부를 결정하는 로직을 추가한다
}
return false
})

// 선택적으로, 이전에 저장된 장치를 영구 저장소에서 가져온다
const grantedDevices = fetchGrantedDevices()

win.webContents.session.setDevicePermissionHandler((details) => {
if (new URL(details.origin).hostname === 'some-host' && details.deviceType === 'hid') {
if (details.device.vendorId === 123 && details.device.productId === 345) {
// 항상 이 타입의 장치를 허용한다 (이를 통해 `navigator.hid.requestDevice` 호출을 먼저 하지 않아도 된다)
return true
}

// 이전에 권한이 부여된 장치 목록을 검색한다
return grantedDevices.some((grantedDevice) => {
return grantedDevice.vendorId === details.device.vendorId &&
grantedDevice.productId === details.device.productId &&
grantedDevice.serialNumber && grantedDevice.serialNumber === details.device.serialNumber
})
} else if (details.deviceType === 'serial') {
if (details.device.vendorId === 123 && details.device.productId === 345) {
// 항상 이 타입의 장치를 허용한다 (이를 통해 `navigator.hid.requestDevice` 호출을 먼저 하지 않아도 된다)
return true
}
}
return false
})

win.webContents.session.on('select-hid-device', (event, details, callback) => {
event.preventDefault()
const selectedDevice = details.deviceList.find((device) => {
return device.vendorId === 9025 && device.productId === 67
})
callback(selectedDevice?.deviceId)
})
})

ses.setUSBProtectedClassesHandler(handler)

  • handler Function<string[]> | null
    • details Object
      • protectedClasses string[] - 현재 보호된 USB 클래스 목록. 가능한 클래스 값은 다음과 같다:
        • audio
        • audio-video
        • hid
        • mass-storage
        • smart-card
        • video
        • wireless

이 메서드는 보호된 USB 클래스를 재정의할 수 있는 핸들러를 설정한다. 핸들러의 반환 값은 보호되어야 할 USB 클래스의 문자열 배열이다 (예: 렌더러에서 사용할 수 없음). 배열의 유효한 값은 다음과 같다:

  • audio
  • audio-video
  • hid
  • mass-storage
  • smart-card
  • video
  • wireless

핸들러에서 빈 문자열 배열을 반환하면 모든 USB 클래스를 허용한다. 전달된 배열을 그대로 반환하면 기본 보호된 USB 클래스 목록을 유지한다 (이것은 핸들러가 정의되지 않았을 때의 기본 동작이기도 하다). 핸들러를 제거하려면 setUSBProtectedClassesHandler(null)을 호출한다.

const { app, BrowserWindow } = require('electron')

let win = null

app.whenReady().then(() => {
win = new BrowserWindow()

win.webContents.session.setUSBProtectedClassesHandler((details) => {
// 모든 클래스를 허용:
// return []
// 현재 보호된 클래스 목록 유지:
// return details.protectedClasses
// 선택적으로 클래스 제거:
return details.protectedClasses.filter((usbClass) => {
// 오디오 클래스를 제외한 모든 클래스 제외
return usbClass.indexOf('audio') === -1
})
})
})

ses.setBluetoothPairingHandler(handler) Windows Linux

  • handler Function | null
    • details Object
      • deviceId string
      • pairingKind string - 요청된 페어링 프롬프트의 타입. 다음 값 중 하나:
        • confirm 이 프롬프트는 Bluetooth 장치를 페어링할지 확인을 요청한다.
        • confirmPin 이 프롬프트는 제공된 PIN이 장치에 표시된 PIN과 일치하는지 확인을 요청한다.
        • providePin 이 프롬프트는 장치에 대한 PIN을 제공하도록 요청한다.
      • frame WebFrameMain | null - 이 핸들러를 시작한 프레임. 프레임이 네비게이션을 했거나 파괴된 후에 접근하면 null일 수 있다.
      • pin string (optional) - pairingKindconfirmPin일 경우 검증할 PIN 값.
    • callback Function
      • response Object
        • confirmed boolean - 다이얼로그가 취소된 경우 false를 전달해야 한다. pairingKindconfirm 또는 confirmPin인 경우, 이 값은 페어링이 확인되었는지 나타낸다. pairingKindprovidePin인 경우, 값이 제공되면 true여야 한다.
        • pin string | null (optional) - pairingKindprovidePin인 경우, 이 값은 Bluetooth 장치에 필요한 PIN이어야 한다.

Bluetooth 페어링 요청에 응답할 핸들러를 설정한다. 이 핸들러를 통해 개발자는 페어링 전 추가 검증이 필요한 장치를 처리할 수 있다. 핸들러가 정의되지 않은 경우, Linux나 Windows에서 추가 검증이 필요한 페어링은 자동으로 취소된다. macOS는 자동으로 페어링을 처리하므로 핸들러가 필요 없다. 핸들러를 지우려면 setBluetoothPairingHandler(null)을 호출한다.

const { app, BrowserWindow, session } = require('electron')
const path = require('node:path')

function createWindow () {
let bluetoothPinCallback = null

const mainWindow = new BrowserWindow({
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})

mainWindow.webContents.session.setBluetoothPairingHandler((details, callback) => {
bluetoothPinCallback = callback
// 사용자에게 페어링 확인을 요청하기 위해 렌더러로 IPC 메시지를 보낸다.
// 이 메시지를 처리하고 사용자에게 프롬프트를 표시하는 로직이 렌더러에 필요하다.
mainWindow.webContents.send('bluetooth-pairing-request', details)
})

// Bluetooth 페어링에 대한 응답을 얻기 위해 렌더러로부터 IPC 메시지를 수신한다.
mainWindow.webContents.ipc.on('bluetooth-pairing-response', (event, response) => {
bluetoothPinCallback(response)
})
}

app.whenReady().then(() => {
createWindow()
})

ses.clearHostResolverCache()

Promise<void>를 반환한다. 작업이 완료되면 프로미스가 해결된다.

호스트 리졸버 캐시를 지운다.

ses.allowNTLMCredentialsForDomains(domains)

  • domains string - 통합 인증이 활성화된 서버 목록을 쉼표로 구분한 문자열

HTTP NTLM 또는 Negotiate 인증을 위해 항상 자격 증명을 보낼지 여부를 동적으로 설정한다.

const { session } = require('electron')
// `example.com`, `foobar.com`, `baz`로 끝나는 모든 URL에 대해
// 통합 인증을 고려한다.
session.defaultSession.allowNTLMCredentialsForDomains('*example.com, *foobar.com, *baz')

// 모든 URL에 대해 통합 인증을 고려한다.
session.defaultSession.allowNTLMCredentialsForDomains('*')

ses.setUserAgent(userAgent[, acceptLanguages])

  • userAgent string
  • acceptLanguages string (선택 사항)

이 세션의 userAgentacceptLanguages를 재정의한다.

acceptLanguages는 쉼표로 구분된 언어 코드의 순서 목록이어야 한다. 예를 들어 "en-US,fr,de,ko,zh-CN,ja"와 같은 형식이다.

이 설정은 기존의 WebContents에는 영향을 미치지 않는다. 각 WebContentswebContents.setUserAgent를 사용해 세션 전체의 사용자 에이전트를 재정의할 수 있다.

ses.isPersistent()

boolean 타입의 값을 반환한다. 이 세션이 영구적인지 여부를 나타낸다. BrowserWindow의 기본 webContents 세션은 영구적이다. 파티션에서 세션을 생성할 때, persist:로 시작하는 세션은 영구적이며, 그 외의 세션은 임시적이다.

ses.getUserAgent()

string 타입을 반환한다. 이 세션에 대한 사용자 에이전트(user agent)를 나타낸다.

ses.setSSLConfig(config)

  • config Object
    • minVersion string (선택 사항) - tls1, tls1.1, tls1.2 또는 tls1.3 중 하나를 지정할 수 있다. 원격 서버에 연결할 때 허용할 최소 SSL 버전을 설정한다. 기본값은 tls1이다.
    • maxVersion string (선택 사항) - tls1.2 또는 tls1.3 중 하나를 지정할 수 있다. 원격 서버에 연결할 때 허용할 최대 SSL 버전을 설정한다. 기본값은 tls1.3이다.
    • disabledCipherSuites Integer[] (선택 사항) - 네트워크 내장 정책에 의해 이미 비활성화된 암호화 스위트 외에 추가로 사용을 금지할 암호화 스위트 목록을 지정한다. 지원되는 형식: 0xAABB, 여기서 AA는 cipher_suite[0]이고 BB는 cipher_suite[1]이며, RFC 2246 섹션 7.4.1.2에 정의된 대로 사용한다. 이 형식으로 인식할 수 없지만 파싱 가능한 암호화 스위트는 오류를 반환하지 않는다. 예: TLS_RSA_WITH_RC4_128_MD5를 비활성화하려면 0x0004를 지정하고, TLS_ECDH_ECDSA_WITH_RC4_128_SHA를 비활성화하려면 0xC002를 지정한다. 단, TLSv1.3 암호화 스위트는 이 메커니즘으로 비활성화할 수 없다.

이 메서드는 세션의 SSL 구성을 설정한다. 이후의 모든 네트워크 요청은 새로운 구성을 사용한다. 기존의 네트워크 연결(예: WebSocket 연결)은 종료되지 않지만, 풀에 있는 기존 소켓은 새로운 연결에 재사용되지 않는다.

ses.getBlobData(identifier)

  • identifier string - 유효한 UUID.

Promise<Buffer>를 반환한다. 이 Promise는 블롭 데이터로 해결된다.

ses.downloadURL(url[, options])

  • url string
  • options Object (옵션)
    • headers Record<string, string> (옵션) - HTTP 요청 헤더.

주어진 url에 위치한 리소스의 다운로드를 시작한다. 이 API는 will-download 이벤트를 통해 접근할 수 있는 DownloadItem을 생성한다.

참고: 이 메서드는 webContents.downloadURL과 달리 페이지의 오리진과 관련된 보안 검사를 수행하지 않는다.

ses.createInterruptedDownload(options)

  • options Object
    • path string - 다운로드 파일의 절대 경로.
    • urlChain string[] - 다운로드를 위한 전체 URL 체인.
    • mimeType string (선택 사항)
    • offset Integer - 다운로드의 시작 범위.
    • length Integer - 다운로드의 전체 길이.
    • lastModified string (선택 사항) - Last-Modified 헤더 값.
    • eTag string (선택 사항) - ETag 헤더 값.
    • startTime Double (선택 사항) - UNIX epoch 이후 초 단위로 표현된 다운로드 시작 시간.

이전 Session에서 취소되었거나 중단된 다운로드를 다시 시작할 수 있게 한다. 이 API는 will-download 이벤트를 통해 접근할 수 있는 DownloadItem을 생성한다. DownloadItemWebContents와 연결되지 않으며, 초기 상태는 중단 상태가 된다. 다운로드는 DownloadItem에서 resume API를 호출할 때만 시작된다.

ses.clearAuthCache()

Promise<void>를 반환한다. 세션의 HTTP 인증 캐시가 지워지면 이 Promise가 해결된다.

ses.setPreloads(preloads)

  • preloads string[] - 미리 실행할 스크립트의 절대 경로 배열

이 세션과 연결된 모든 웹 콘텐츠에서 일반 preload 스크립트가 실행되기 직전에 실행될 스크립트를 추가한다.

ses.getPreloads()

등록된 미리 로드 스크립트의 경로 배열(string[])을 반환한다.

ses.setCodeCachePath(path)

  • path String - 렌더러에서 생성된 V8 JS 코드 캐시를 저장할 절대 경로

이 세션에서 생성된 JS 코드 캐시를 저장할 디렉토리를 설정한다. 이 메서드를 호출하기 전에 사용자가 디렉토리를 미리 생성할 필요는 없다. 런타임이 디렉토리가 존재하지 않으면 자동으로 생성하며, 이미 존재하는 경우 기존 디렉토리를 사용한다. 디렉토리를 생성할 수 없는 경우, 코드 캐시는 사용되지 않으며 코드 캐시와 관련된 모든 작업은 런타임 내에서 조용히 실패한다. 기본적으로 디렉토리는 각 사용자 데이터 폴더 아래의 Code Cache로 설정된다.

기본적으로 코드 캐시는 http(s) URL에 대해서만 활성화된다. 커스텀 프로토콜에서 코드 캐시를 활성화하려면, 프로토콜을 등록할 때 codeCache: truestandard: true를 반드시 지정해야 한다.

ses.clearCodeCaches(options)

  • options Object
    • urls String[] (선택 사항) - 생성된 코드 캐시를 제거해야 하는 리소스에 해당하는 URL 배열이다. 이 목록이 비어 있으면 캐시 디렉토리의 모든 항목이 제거된다.

Promise<void>를 반환한다 - 코드 캐시 삭제 작업이 완료되면 resolve된다.

ses.getSharedDictionaryUsageInfo()

Promise<SharedDictionaryUsageInfo[]>를 반환한다. 이는 Chromium 네트워킹 서비스의 저장소에 있는 공유 사전 정보 항목들의 배열이다.

공유 사전은 Brotli와 ZStandard를 통해 전송되는 데이터의 고급 압축 기능을 지원한다. Electron에서 이 고급 웹 기능을 사용하기 위해 공유 사전 API를 직접 호출할 필요는 없다. 하지만 이를 사용하면 압축 해제 과정에서 사용되는 공유 사전을 더 세밀하게 제어하고 검사할 수 있다.

특정 공유 사전 항목에 대한 자세한 정보를 얻으려면 getSharedDictionaryInfo(options)를 호출한다.

ses.getSharedDictionaryInfo(options)

  • options Object
    • frameOrigin string - 요청이 시작된 프레임의 오리진을 나타낸다. 이 값은 요청을 만드는 개별 프레임에 특정되며, 스키마, 호스트, 포트로 정의된다. 실제로는 URL 형태로 나타난다.
    • topFrameSite string - 최상위 브라우징 컨텍스트(요청을 포함하는 메인 프레임 또는 탭)의 사이트를 나타낸다. frameOrigin보다 덜 세분화되며, 더 넓은 "사이트" 범위에 초점을 맞춘다. 실제로는 URL 형태로 나타난다.

Promise<SharedDictionaryInfo[]>를 반환한다 - Chromium 네트워킹 서비스의 저장소에 있는 공유 사전 정보 항목들의 배열이다.

현재 존재하는 모든 공유 사전에 대한 정보를 얻으려면 getSharedDictionaryUsageInfo()를 호출한다.

ses.clearSharedDictionaryCache()

Promise<void>를 반환한다. 이 Promise는 메모리와 디스크에 저장된 사전 캐시가 모두 삭제되면 이행된다.

ses.clearSharedDictionaryCacheForIsolationKey(options)

  • options Object
    • frameOrigin string - 요청이 발생한 프레임의 오리진. 요청을 만드는 개별 프레임에 특정되며, 스키마, 호스트, 포트로 정의된다. 실제로는 URL 형태로 나타난다.
    • topFrameSite string - 최상위 브라우징 컨텍스트(요청을 포함하는 메인 프레임 또는 탭)의 사이트. frameOrigin보다 덜 세분화되며, 더 넓은 "사이트" 범위에 초점을 맞춘다. 실제로는 URL 형태로 나타난다.

Promise<void>를 반환한다. 지정된 isolation key에 대한 딕셔너리 캐시가 메모리와 디스크에서 모두 삭제되면 이 Promise는 이행된다.

ses.setSpellCheckerEnabled(enable)

  • enable boolean

내장 스펠 체커를 활성화할지 여부를 설정한다.

ses.isSpellCheckerEnabled()

boolean 값을 반환한다. 내장된 맞춤법 검사기가 활성화되어 있는지 여부를 나타낸다.

ses.setSpellCheckerLanguages(languages)

  • languages string[] - 맞춤법 검사기를 활성화할 언어 코드 배열

기본 제공 맞춤법 검사기는 사용자가 입력하는 언어를 자동으로 감지하지 않는다. 맞춤법 검사기가 단어를 올바르게 검사하려면 이 API를 호출해 언어 코드 배열을 전달해야 한다. 지원되는 언어 코드 목록은 ses.availableSpellCheckerLanguages 속성으로 확인할 수 있다.

참고: macOS에서는 운영체제의 맞춤법 검사기를 사용하며, 언어를 자동으로 감지한다. 따라서 이 API는 macOS에서 아무런 동작을 하지 않는다.

ses.getSpellCheckerLanguages()

string[] 타입의 값을 반환한다. 이 값은 맞춤법 검사기가 활성화된 언어 코드의 배열이다. 만약 이 배열이 비어 있다면, 맞춤법 검사기는 기본적으로 en-US를 사용한다. 일반적으로 애플리케이션을 처음 실행할 때 이 설정이 비어 있다면, Electron은 현재 운영체제의 로케일을 기반으로 이 설정을 자동으로 채우려고 시도한다. 이 설정은 재시작 후에도 유지된다.

참고: macOS에서는 운영체제의 맞춤법 검사기를 사용하며, 이는 자체적인 언어 목록을 가지고 있다. macOS에서 이 API는 운영체제에 의해 설정된 언어 목록을 반환한다.

ses.setSpellCheckerDictionaryDownloadURL(url)

  • url string - Electron이 hunspell 사전을 다운로드할 기본 URL

기본적으로 Electron은 Chromium CDN에서 hunspell 사전을 다운로드한다. 이 동작을 변경하려면 이 API를 사용해 직접 호스팅한 hunspell 사전 버전을 가리킬 수 있다. 각 릴리스마다 hunspell_dictionaries.zip 파일을 제공하며, 이 파일에는 호스팅에 필요한 파일들이 포함되어 있다.

파일 서버는 대소문자를 구분하지 않아야 한다. 이를 지원하지 않는 경우, 각 파일을 두 번 업로드해야 한다: ZIP 파일에 있는 대소문자 그대로 한 번, 그리고 파일명을 모두 소문자로 한 번.

hunspell_dictionaries.zip 파일의 내용이 https://example.com/dictionaries/language-code.bdic에서 제공된다면, 이 API를 ses.setSpellCheckerDictionaryDownloadURL('https://example.com/dictionaries/')와 같이 호출해야 한다. 끝에 슬래시를 포함해야 한다. 사전 파일의 URL은 ${url}${filename} 형식으로 구성된다.

참고: macOS에서는 OS의 맞춤법 검사기를 사용하므로, 사전 파일을 다운로드하지 않는다. 이 API는 macOS에서 아무런 동작을 하지 않는다.

ses.listWordsInSpellCheckerDictionary()

Promise<string[]>를 반환한다. 이는 앱의 커스텀 사전에 있는 모든 단어를 담은 배열이다. 전체 사전이 디스크에서 로드되면 이 Promise가 이행된다.

ses.addWordToSpellCheckerDictionary(word)

  • word string - 사전에 추가할 단어

반환값 boolean - 단어가 커스텀 사전에 성공적으로 추가되었는지 여부. 이 API는 비영구적(메모리 내) 세션에서는 동작하지 않는다.

참고: macOS와 Windows 10에서는 이 단어가 OS의 커스텀 사전에도 추가된다.

ses.removeWordFromSpellCheckerDictionary(word)

  • word string - 사용자 정의 사전에서 제거할 단어

boolean을 반환한다. 단어가 사용자 정의 사전에서 성공적으로 제거되었는지 여부를 나타낸다. 이 API는 비영구적(메모리 내) 세션에서는 작동하지 않는다.

참고: macOS와 Windows 10에서는 이 단어가 OS의 사용자 정의 사전에서도 제거된다.

ses.loadExtension(path[, options])

  • path string - 압축 해제된 크롬 확장 프로그램이 포함된 디렉토리 경로
  • options Object (선택 사항)
    • allowFileAccess boolean - 확장 프로그램이 file:// 프로토콜을 통해 로컬 파일을 읽고 file:// 페이지에 콘텐츠 스크립트를 주입할 수 있도록 허용할지 여부. 예를 들어 file:// URL에서 개발자 도구 확장 프로그램을 로드할 때 필요하다. 기본값은 false.

반환값 Promise<Extension> - 확장 프로그램이 로드되면 해결된다.

확장 프로그램을 로드할 수 없는 경우 이 메서드는 예외를 발생시킨다. 확장 프로그램을 설치할 때 경고가 발생하면 (예: Electron에서 지원하지 않는 API를 요청한 경우) 콘솔에 로그가 기록된다.

Electron은 크롬 확장 프로그램 API의 전체 범위를 지원하지 않는다. 지원되는 API에 대한 자세한 내용은 Supported Extensions APIs를 참조한다.

이전 버전의 Electron에서는 로드된 확장 프로그램이 애플리케이션의 이후 실행에서도 유지되었다. 이제는 더 이상 그렇지 않다: 확장 프로그램을 로드하려면 앱을 실행할 때마다 loadExtension을 호출해야 한다.

const { app, session } = require('electron')
const path = require('node:path')

app.whenReady().then(async () => {
await session.defaultSession.loadExtension(
path.join(__dirname, 'react-devtools'),
// file:// URL에서 개발자 도구 확장 프로그램을 로드하려면 allowFileAccess가 필요하다.
{ allowFileAccess: true }
)
// React DevTools 확장 프로그램을 사용하려면 확장 프로그램을 다운로드하고 압축을 해제해야 한다.
})

이 API는 패키지된 (.crx) 확장 프로그램을 로드하는 것을 지원하지 않는다.

참고: 이 API는 app 모듈의 ready 이벤트가 발생하기 전에 호출할 수 없다.

참고: 메모리 내 (비영구적) 세션에 확장 프로그램을 로드하는 것은 지원되지 않으며 오류가 발생한다.

ses.removeExtension(extensionId)

  • extensionId string - 제거할 확장 기능의 ID

확장 기능을 언로드한다.

참고: 이 API는 app 모듈의 ready 이벤트가 발생하기 전에 호출할 수 없다.

ses.getExtension(extensionId)

  • extensionId string - 조회할 확장 프로그램의 ID

Extension | null을 반환한다. 주어진 ID에 해당하는 로드된 확장 프로그램을 가리킨다.

참고: 이 API는 app 모듈의 ready 이벤트가 발생하기 전에 호출할 수 없다.

ses.getAllExtensions()

Extension[] 타입을 반환한다. 현재 로드된 모든 확장 프로그램의 목록을 반환한다.

참고: 이 API는 app 모듈의 ready 이벤트가 발생하기 전에 호출할 수 없다.

ses.getStoragePath()

string | null 타입을 반환한다. 이 함수는 현재 세션의 데이터가 디스크에 저장된 절대 파일 시스템 경로를 반환한다. 메모리 내 세션의 경우 null을 반환한다.

ses.clearData([options])

  • options Object (선택 사항)
    • dataTypes String[] (선택 사항) - 삭제할 데이터 타입을 지정한다. 기본적으로 모든 타입의 데이터를 삭제한다. 여기에 명시되지 않은 데이터 타입도 포함될 수 있다. (전체 목록은 Chromium의 BrowsingDataRemover를 참조한다.)
      • backgroundFetch - 백그라운드 페치
      • cache - 캐시 (cachestorageshadercache 포함)
      • cookies - 쿠키
      • downloads - 다운로드
      • fileSystems - 파일 시스템
      • indexedDB - IndexedDB
      • localStorage - 로컬 스토리지
      • serviceWorkers - 서비스 워커
      • webSQL - WebSQL
    • origins String[] (선택 사항) - 특정 오리진의 데이터만 삭제한다. excludeOrigins와 함께 사용할 수 없다.
    • excludeOrigins String[] (선택 사항) - 특정 오리진을 제외한 모든 오리진의 데이터를 삭제한다. origins와 함께 사용할 수 없다.
    • avoidClosingConnections boolean (선택 사항) - 현재 네트워크 연결을 끊을 수 있는 쿠키 삭제를 건너뛴다. (기본값: false)
    • originMatchingMode String (선택 사항) - 오리진과 데이터를 매칭하는 동작 방식을 지정한다.
      • third-parties-included (기본값) - 첫 번째 파티 컨텍스트에서는 오리진을 기준으로, 서드 파티 컨텍스트에서는 최상위 사이트를 기준으로 스토리지를 매칭한다.
      • origin-in-all-contexts - 모든 컨텍스트에서 오리진만을 기준으로 스토리지를 매칭한다.

반환값: Promise<void> - 모든 데이터가 삭제되면 해결된다.

여러 타입의 데이터를 삭제한다.

이 메서드는 clearStorageData 메서드보다 더 많은 타입의 데이터를 삭제하며, 더 철저하게 처리한다.

참고: 쿠키는 오리진보다 더 넓은 범위로 저장된다. origins (또는 excludeOrigins)로 필터링하여 쿠키를 삭제할 경우, 쿠키는 등록 가능 도메인 수준에서 삭제된다. 예를 들어, https://really.specific.origin.example.com/ 오리진의 쿠키를 삭제하면 example.com 도메인의 모든 쿠키가 삭제된다. https://my.website.example.co.uk/ 오리진의 쿠키를 삭제하면 example.co.uk 도메인의 모든 쿠키가 삭제된다.

참고: 캐시 데이터를 삭제하면 공유 사전 캐시도 함께 삭제된다. 이는 압축에 사용된 사전이 캐시 삭제 후 다시 로드될 수 있음을 의미한다. 공유 사전 캐시만 삭제하고 다른 캐시 데이터는 그대로 유지하려면 clearSharedDictionaryCache 메서드를 사용할 수 있다.

더 자세한 정보는 Chromium의 BrowsingDataRemover 인터페이스를 참조한다.

인스턴스 속성

Session 인스턴스에서 사용할 수 있는 속성은 다음과 같다:

ses.availableSpellCheckerLanguages 읽기 전용

ses.availableSpellCheckerLanguages는 모든 사용 가능한 맞춤법 검사 언어를 포함하는 string[] 배열이다. setSpellCheckerLanguages API에 이 배열에 없는 언어 코드를 제공하면 오류가 발생한다.

ses.spellCheckerEnabled

내장된 맞춤법 검사기가 활성화되었는지 여부를 나타내는 boolean 값이다.

ses.storagePath 읽기 전용

이 속성은 string | null 타입으로, 현재 세션의 데이터가 디스크에 저장된 절대 파일 시스템 경로를 나타낸다. 메모리 내 세션의 경우 null을 반환한다.

ses.cookies 읽기 전용

이 세션에 대한 Cookies 객체이다.

ses.serviceWorkers 읽기 전용

이 세션에 대한 ServiceWorkers 객체이다.

ses.webRequest 읽기 전용

이 세션에 대한 WebRequest 객체이다.

ses.protocol 읽기 전용

이 세션에 대한 Protocol 객체를 나타낸다.

const { app, session } = require('electron')
const path = require('node:path')

app.whenReady().then(() => {
const protocol = session.fromPartition('some-partition').protocol
if (!protocol.registerFileProtocol('atom', (request, callback) => {
const url = request.url.substr(7)
callback({ path: path.normalize(path.join(__dirname, url)) })
})) {
console.error('Failed to register protocol')
}
})

ses.netLog Readonly

이 세션에 대한 NetLog 객체를 나타낸다.

const { app, session } = require('electron')

app.whenReady().then(async () => {
const netLog = session.fromPartition('some-partition').netLog
netLog.startLogging('/path/to/net-log')
// 네트워크 이벤트 발생 후
const path = await netLog.stopLogging()
console.log('Net-logs written to', path)
})