세션 관리
브라우저 세션, 쿠키, 캐시, 프록시 설정 등을 관리한다.
프로세스: 메인
session
모듈을 사용해 새로운 Session
객체를 생성할 수 있다.
기존 페이지의 session
에 접근하려면 WebContents
의 session
속성을 사용하거나 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
Session
을 반환 - partition
문자열로부터 세션 인스턴스를 가져온다. 동일한 partition
을 가진 기존 Session
이 존재하면 해당 세션을 반환하고, 그렇지 않으면 options
를 사용해 새로운 Session
인스턴스를 생성한다.
partition
이 persist:
로 시작하면, 해당 페이지는 동일한 partition
을 가진 앱의 모든 페이지에서 사용 가능한 영구 세션을 사용한다. persist:
접두사가 없으면, 페이지는 메모리 내 세션을 사용한다. partition
이 비어 있으면 앱의 기본 세션이 반환된다.
options
를 사용해 Session
을 생성하려면, 해당 partition
을 가진 Session
이 이전에 사용된 적이 없어야 한다. 기존 Session
객체의 options
를 변경할 수 없다.
session.fromPath(path[, options])
path
string
반환값 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'
반환값:
event
Eventitem
DownloadItemwebContents
WebContents
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'
반환 값:
event
Eventextension
Extension
확장 프로그램이 로드된 후에 발생하는 이벤트이다. 이 이벤트는 확장 프로그램이 "활성화된" 확장 프로그램 집합에 추가될 때마다 발생한다. 이는 다음과 같은 경우를 포함한다:
Session.loadExtension
을 통해 확장 프로그램이 로드되는 경우- 확장 프로그램이 다시 로드되는 경우:
- 크래시 이후에 다시 로드되는 경우
- 확장 프로그램이 직접 요청한 경우 (
chrome.runtime.reload()
)
이벤트: 'extension-unloaded'
반환값:
event
Eventextension
Extension
확장 프로그램이 언로드된 후 발생하는 이벤트이다. 이 이벤트는 Session.removeExtension
이 호출될 때 트리거된다.
이벤트: 'extension-ready'
반환값:
event
Eventextension
Extension
확장 프로그램이 로드되고, 확장 프로그램의 백그라운드 페이지를 시작하기 위해 필요한 모든 브라우저 상태가 초기화된 후에 발생한다.
이벤트: 'file-system-access-restricted'
반환값:
event
Eventdetails
Objectorigin
string - 차단된 경로에 접근을 시도한 오리진.isDirectory
boolean - 경로가 디렉토리인지 여부.path
string - 접근을 시도한 차단된 경로.
callback
Functionaction
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
EventpreconnectUrl
string - 렌더러가 미리 연결을 요청하는 URLallowCredentials
boolean - 렌더러가 자격 증명을 포함한 연결을 요청하면 true(자세한 내용은 스펙 참조)
렌더러 프로세스가 URL에 대한 미리 연결을 요청할 때 발생한다. 일반적으로 리소스 힌트로 인해 발생한다.
이벤트: 'spellcheck-dictionary-initialized'
반환값:
event
EventlanguageCode
string - 사전 파일의 언어 코드
Hunspell 사전 파일이 성공적으로 초기화되었을 때 발생하는 이벤트다. 이 이벤트는 파일이 다운로드된 후에 트리거된다.
이벤트: 'spellcheck-dictionary-download-begin'
반환값:
event
EventlanguageCode
string - 다운로드되는 사전 파일의 언어 코드
Hunspell 사전 파일 다운로드가 시작될 때 발생하는 이벤트이다.
이벤트: 'spellcheck-dictionary-download-success'
반환값:
event
EventlanguageCode
string - 다운로드된 사전 파일의 언어 코드
Hunspell 사전 파일이 성공적으로 다운로드되었을 때 발생하는 이벤트
이벤트: 'spellcheck-dictionary-download-failure'
반환 값:
event
EventlanguageCode
string - 사전 파일의 언어 코드
Hunspell 사전 파일 다운로드가 실패할 때 발생하는 이벤트다. 실패에 대한 자세한 내용을 확인하려면 netlog를 수집하고 다운로드 요청을 검사해야 한다.
이벤트: 'select-hid-device'
반환 값:
event
Eventdetails
ObjectdeviceList
HIDDevice[]frame
WebFrameMain | null - 이 이벤트를 시작한 프레임. 프레임이 네비게이션을 했거나 파괴된 후에 접근하면null
일 수 있다.
callback
FunctiondeviceId
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
Eventdetails
Objectdevice
HIDDeviceframe
WebFrameMain | null - 이 이벤트를 시작한 프레임.
프레임이 이동되거나 제거된 후에 접근하면null
이 될 수 있다.
navigator.hid.requestDevice
가 호출되고 select-hid-device
이벤트가 발생한 후, 새로운 장치가 select-hid-device
의 콜백이 호출되기 전에 사용 가능해지면 이 이벤트가 발생한다. 이 이벤트는 사용자에게 장치를 선택하도록 요청하는 UI를 사용할 때, 새로 추가된 장치로 UI를 업데이트할 수 있도록 하기 위해 사용된다.
이벤트: 'hid-device-removed'
반환값:
event
Eventdetails
Objectdevice
HIDDeviceframe
WebFrameMain | null - 이 이벤트를 시작한 프레임.
프레임이 네비게이션을 진행했거나 소멸된 이후에 접근하면null
이 될 수 있다.
navigator.hid.requestDevice
가 호출되고 select-hid-device
이벤트가 발생한 후,
select-hid-device
의 콜백이 호출되기 전에 장치가 제거되면 이 이벤트가 발생한다.
이 이벤트는 사용자에게 장치를 선택하도록 요청하는 UI를 사용할 때,
지정된 장치를 UI에서 제거하기 위해 업데이트할 수 있도록 의도되었다.
이벤트: 'hid-device-revoked'
반환 값:
event
Eventdetails
Objectdevice
HIDDeviceorigin
string (선택 사항) - 장치가 해제된 오리진
HIDDevice.forget()
메서드가 호출된 후에 발생한다. 이 이벤트는 setDevicePermissionHandler
를 사용할 때 권한을 지속적으로 저장하는 데 도움을 줄 수 있다.
이벤트: 'select-serial-port'
반환값:
event
EventportList
SerialPort[]webContents
WebContentscallback
FunctionportId
string
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'
반환값:
event
Eventport
SerialPortwebContents
WebContents
navigator.serial.requestPort
가 호출되고 select-serial-port
이벤트가 발생한 후, select-serial-port
의 콜백이 호출되기 전에 새로운 시리얼 포트가 사용 가능해지면 이 이벤트가 발생한다. 이 이벤트는 사용자에게 포트를 선택하도록 요청하는 UI를 사용할 때, 새로 추가된 포트로 UI를 업데이트할 수 있도록 하기 위한 목적으로 사용된다.
이벤트: 'serial-port-removed'
반환 값:
event
Eventport
SerialPortwebContents
WebContents
navigator.serial.requestPort
가 호출된 후, 그리고 select-serial-port
가 발생한 이후에 시리얼 포트가 제거되면 이 이벤트가 발생한다. 이 이벤트는 사용자에게 포트를 선택하도록 요청하는 UI를 사용할 때, 해당 포트를 UI에서 제거할 수 있도록 업데이트하기 위해 사용된다.
이벤트: 'serial-port-revoked'
반환값:
event
Eventdetails
Objectport
SerialPortframe
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
Eventdetails
ObjectdeviceList
USBDevice[]frame
WebFrameMain | null - 이 이벤트를 발생시킨 프레임. 프레임이 네비게이션을 했거나 파괴된 후에 접근하면null
이 될 수 있다.
callback
FunctiondeviceId
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'
반환 값:
event
Eventdevice
USBDevicewebContents
WebContents
navigator.usb.requestDevice
가 호출된 후, 그리고 select-usb-device
이벤트가 발생한 상태에서, select-usb-device
의 콜백이 호출되기 전에 새로운 장치가 추가되면 이 이벤트가 발생한다. 이 이벤트는 사용자에게 장치를 선택하도록 요청하는 UI를 사용할 때, 새로 추가된 장치로 UI를 업데이트할 수 있도록 하기 위해 사용된다.
이벤트: 'usb-device-removed'
반환값:
event
Eventdevice
USBDevicewebContents
WebContents
navigator.usb.requestDevice
가 호출된 후, select-usb-device
이벤트가 발생했지만 콜백이 실행되기 전에 장치가 제거된 경우 이 이벤트가 발생한다. 이 이벤트는 사용자에게 장치를 선택하도록 요청하는 UI를 사용할 때, 지정된 장치를 UI에서 제거하기 위해 활용할 수 있다.
이벤트: 'usb-device-revoked'
반환값:
event
Eventdetails
Objectdevice
USBDeviceorigin
string (옵션) - 디바이스가 해제된 오리진
USBDevice.forget()
메서드가 호출된 후 발생한다. 이 이벤트는 setDevicePermissionHandler
를 사용할 때 권한 정보를 지속적으로 저장하는 데 활용할 수 있다.
인스턴스 메서드
다음은 Session
인스턴스에서 사용할 수 있는 메서드들이다:
ses.getCacheSize()
Promise<Integer>
를 반환한다. 현재 세션의 캐시 크기를 바이트 단위로 나타낸다.
ses.clearCache()
Promise<void>
를 반환한다. 캐시 삭제 작업이 완료되면 resolve 된다.
세션의 HTTP 캐시를 모두 지운다.
ses.clearStorageData([options])
반환값: Promise<void>
- 스토리지 데이터가 삭제되면 resolve된다.
ses.flushStorageData()
아직 디스크에 쓰지 않은 DOMStorage 데이터를 모두 저장한다.
ses.setProxy(config)
config
ProxyConfig
Promise<void>
를 반환한다. 프록시 설정이 완료되면 이 Promise가 해결된다.
프록시 설정을 지정한다.
현재 진행 중인 연결이 이전 프록시를 사용하는 풀링된 소켓이 미래의 요청에 재사용되지 않도록 하려면, ses.closeAllConnections
을 호출하여 모든 연결을 닫아야 할 수 있다.
ses.resolveHost(host, [options])
host
string - 해결할 호스트명.
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)
주어진 설정으로 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)
주어진 수의 소켓을 특정 오리진에 미리 연결한다.
ses.closeAllConnections()
Promise<void>
를 반환한다. 모든 연결이 닫히면 이 Promise가 이행된다.
참고: 이 메서드는 현재 진행 중인 모든 요청을 종료하거나 실패하게 만든다.
ses.fetch(input[, init])
input
string | GlobalRequestinit
RequestInit & { bypassCustomProtocolHandlers?: boolean } (옵션)
반환값: 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 | nullrequest
Objecthostname
stringcertificate
CertificatevalidatedCertificate
CertificateisIssuedByKnownRoot
boolean - 크로미움이 루트 CA를 표준 루트로 인식하면true
. 그렇지 않다면 이 인증서는 로컬에 설치된 MITM 프록시(예: 회사 프록시)에 의해 생성된 것일 가능성이 높다.verificationResult
가OK
가 아닌 경우 이 인증서를 신뢰해서는 안 된다.verificationResult
string - 인증서가 신뢰할 수 있는 경우OK
, 그렇지 않으면CERT_REVOKED
와 같은 오류.errorCode
Integer - 오류 코드.
callback
FunctionverificationResult
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 | nullwebContents
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
FunctionpermissionGranted
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> | nullwebContents
(WebContents | null) - 권한을 확인하는 WebContents. 요청이 서브프레임에서 오는 경우requestingUrl
을 사용해 요청 오리진을 확인해야 한다. 크로스 오리진 서브프레임이 권한을 확인할 때는 이 핸들러에null
WebContents가 전달된다.notifications
와 같은 특정 권한 확인은 항상null
을 전달한다.embeddingOrigin
과requestingOrigin
을 사용해 소유 프레임과 요청 프레임의 오리진을 각각 확인할 수 있다.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 | nullrequest
Objectframe
WebFrameMain | null - 미디어 접근을 요청하는 프레임. 프레임이 네비게이션되거나 파괴된 후에 접근하면null
이 될 수 있다.securityOrigin
String - 요청을 만든 페이지의 오리진.videoRequested
Boolean - 웹 콘텐츠가 비디오 스트림을 요청했으면true
.audioRequested
Boolean - 웹 콘텐츠가 오디오 스트림을 요청했으면true
.userGesture
Boolean - 이 요청이 트리거될 때 사용자 제스처가 활성화되었는지 여부.
callback
Functionstreams
Objectvideo
Object | WebFrameMain (optional)id
String - 허용되는 스트림의 ID. 일반적으로 DesktopCapturerSource 객체에서 가져온다.name
String - 허용되는 스트림의 이름. 일반적으로 DesktopCapturerSource 객체에서 가져온다.
audio
String | WebFrameMain (optional) - 문자열이 지정되면loopback
또는loopbackWithMute
가 될 수 있다. 루프백 장치를 지정하면 시스템 오디오를 캡처하며, 현재는 Windows에서만 지원된다. WebFrameMain이 지정되면 해당 프레임에서 오디오를 캡처한다.enableLocalEcho
Boolean (optional) -audio
가 WebFrameMain이고 이 값이true
로 설정되면, 오디오의 로컬 재생이 음소거되지 않는다 (예:MediaRecorder
를 사용하여WebFrameMain
을 녹음할 때 이 플래그를true
로 설정하면 녹음 중에도 스피커로 오디오가 전달된다). 기본값은false
.
opts
Object (optional) macOS ExperimentaluseSystemPicker
Boolean - 사용 가능한 네이티브 시스템 선택기를 사용할지 여부. 기본값은false
. macOS Experimental
이 핸들러는 웹 콘텐츠가 navigator.mediaDevices.getDisplayMedia
API를 통해 디스플레이 미디어 접근을 요청할 때 호출된다. desktopCapturer API를 사용하여 접근을 허용할 스트림을 선택한다.
useSystemPicker
는 애플리케이션이 getSources
에서 특정 비디오 소스를 제공하는 대신 시스템 선택기를 사용할 수 있게 한다. 이 옵션은 실험적이며, 현재 MacOS 15+에서만 사용 가능하다. 시스템 선택기가 사용 가능하고 useSystemPicker
가 true
로 설정되면 핸들러가 호출되지 않는다.
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> | nulldetails
ObjectdeviceType
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[]> | nulldetails
ObjectprotectedClasses
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 | nulldetails
ObjectdeviceId
stringpairingKind
string - 요청된 페어링 프롬프트의 타입. 다음 값 중 하나:confirm
이 프롬프트는 Bluetooth 장치를 페어링할지 확인을 요청한다.confirmPin
이 프롬프트는 제공된 PIN이 장치에 표시된 PIN과 일치하는지 확인을 요청한다.providePin
이 프롬프트는 장치에 대한 PIN을 제공하도록 요청한다.
frame
WebFrameMain | null - 이 핸들러를 시작한 프레임. 프레임이 네비게이션을 했거나 파괴된 후에 접근하면null
일 수 있다.pin
string (optional) -pairingKind
가confirmPin
일 경우 검증할 PIN 값.
callback
Functionresponse
Objectconfirmed
boolean - 다이얼로그가 취소된 경우false
를 전달해야 한다.pairingKind
가confirm
또는confirmPin
인 경우, 이 값은 페어링이 확인되었는지 나타낸다.pairingKind
가providePin
인 경우, 값이 제공되면true
여야 한다.pin
string | null (optional) -pairingKind
가providePin
인 경우, 이 값은 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
stringacceptLanguages
string (선택 사항)
이 세션의 userAgent
와 acceptLanguages
를 재정의한다.
acceptLanguages
는 쉼표로 구분된 언어 코드의 순서 목록이어야 한다. 예를 들어 "en-US,fr,de,ko,zh-CN,ja"
와 같은 형식이다.
이 설정은 기존의 WebContents
에는 영향을 미치지 않는다. 각 WebContents
는 webContents.setUserAgent
를 사용해 세션 전체의 사용자 에이전트를 재정의할 수 있다.
ses.isPersistent()
boolean
타입의 값을 반환한다. 이 세션이 영구적인지 여부를 나타낸다. BrowserWindow
의 기본 webContents
세션은 영구적이다. 파티션에서 세션을 생성할 때, persist:
로 시작하는 세션은 영구적이며, 그 외의 세션은 임시적이다.
ses.getUserAgent()
string
타입을 반환한다. 이 세션에 대한 사용자 에이전트(user agent)를 나타낸다.
ses.setSSLConfig(config)
config
ObjectminVersion
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
주어진 url
에 위치한 리소스의 다운로드를 시작한다. 이 API는 will-download 이벤트를 통해 접근할 수 있는 DownloadItem을 생성한다.
참고: 이 메서드는 webContents.downloadURL
과 달리 페이지의 오리진과 관련된 보안 검사를 수행하지 않는다.
ses.createInterruptedDownload(options)
이전 Session
에서 취소
되었거나 중단
된 다운로드를 다시 시작할 수 있게 한다. 이 API는 will-download 이벤트를 통해 접근할 수 있는 DownloadItem을 생성한다. DownloadItem은 WebContents
와 연결되지 않으며, 초기 상태는 중단
상태가 된다. 다운로드는 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: true
와 standard: true
를 반드시 지정해야 한다.
ses.clearCodeCaches(options)
Promise<void>
를 반환한다 - 코드 캐시 삭제 작업이 완료되면 resolve된다.
ses.getSharedDictionaryUsageInfo()
Promise<SharedDictionaryUsageInfo[]>
를 반환한다. 이는 Chromium 네트워킹 서비스의 저장소에 있는 공유 사전 정보 항목들의 배열이다.
공유 사전은 Brotli와 ZStandard를 통해 전송되는 데이터의 고급 압축 기능을 지원한다. Electron에서 이 고급 웹 기능을 사용하기 위해 공유 사전 API를 직접 호출할 필요는 없다. 하지만 이를 사용하면 압축 해제 과정에서 사용되는 공유 사전을 더 세밀하게 제어하고 검사할 수 있다.
특정 공유 사전 항목에 대한 자세한 정보를 얻으려면 getSharedDictionaryInfo(options)
를 호출한다.
ses.getSharedDictionaryInfo(options)
Promise<SharedDictionaryInfo[]>
를 반환한다 - Chromium 네트워킹 서비스의 저장소에 있는 공유 사전 정보 항목들의 배열이다.
현재 존재하는 모든 공유 사전에 대한 정보를 얻으려면 getSharedDictionaryUsageInfo()
를 호출한다.
ses.clearSharedDictionaryCache()
Promise<void>
를 반환한다. 이 Promise는 메모리와 디스크에 저장된 사전 캐시가 모두 삭제되면 이행된다.
ses.clearSharedDictionaryCacheForIsolationKey(options)
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 - 압축 해제된 크롬 확장 프로그램이 포함된 디렉토리 경로
반환값 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])
반환값: 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)
})