session과 쿠키 — 웹 스토리지 관리
"Electron의 session은 Chromium의 세션 그 자체" — 쿠키, 캐시, 프록시, 다운로드까지 웹 브라우저의 세션 기능을 모두 다룰 수 있습니다.
Session 기본 개념
const { session } = require('electron');
// 기본 세션 (모든 BrowserWindow가 공유)
const defaultSession = session.defaultSession;
// 커스텀 세션 (격리된 세션)
const customSession = session.fromPartition('persist:myapp');
// 임시 세션 (앱 종료 시 삭제)
const tempSession = session.fromPartition('temp-session');
// persist: 접두사가 없으면 메모리에만 저장됩니다
윈도우별 세션 지정
const win = new BrowserWindow({
webPreferences: {
// 커스텀 세션 사용
partition: 'persist:myapp',
},
});
// 또는 세션 객체 직접 지정
const win2 = new BrowserWindow({
webPreferences: {
session: session.fromPartition('persist:user2'),
},
});
쿠키 관리
const { session } = require('electron');
// 쿠키 읽기
async function getCookies(url) {
const cookies = await session.defaultSession.cookies.get({ url });
return cookies;
}
// 쿠키 설정
async function setCookie(url, name, value) {
await session.defaultSession.cookies.set({
url,
name,
value,
expirationDate: Math.floor(Date.now() / 1000) + 86400, // 24시간
});
}
// 쿠키 삭제
async function removeCookie(url, name) {
await session.defaultSession.cookies.remove(url, name);
}
// 모든 쿠키 삭제
async function clearAllCookies() {
await session.defaultSession.cookies.flushStore();
const cookies = await session.defaultSession.cookies.get({});
for (const cookie of cookies) {
const url = `${cookie.secure ? 'https' : 'http'}://${cookie.domain}${cookie.path}`;
await session.defaultSession.cookies.remove(url, cookie.name);
}
}
쿠키 변경 감지
session.defaultSession.cookies.on('changed', (event, cookie, cause, removed) => {
console.log(`쿠키 ${removed ? '삭제' : '변경'}: ${cookie.name}`);
console.log(`원인: ${cause}`); // explicit, overwrite, expired 등
});
캐시 관리
// 캐시 크기 확인
const cacheSize = await session.defaultSession.getCacheSize();
console.log(`캐시 크기: ${(cacheSize / 1024 / 1024).toFixed(2)} MB`);
// 캐시 비우기
await session.defaultSession.clearCache();
// 스토리지 데이터 비우기 (localStorage, indexedDB 등)
await session.defaultSession.clearStorageData({
storages: ['localstorage', 'indexdb', 'cookies', 'cachestorage'],
});
// 특정 origin만 비우기
await session.defaultSession.clearStorageData({
origin: 'https://example.com',
storages: ['localstorage'],
});
프록시 설정
// 프록시 설정
await session.defaultSession.setProxy({
proxyRules: 'http://proxy.example.com:8080',
});
// SOCKS 프록시
await session.defaultSession.setProxy({
proxyRules: 'socks5://proxy.example.com:1080',
});
// 프록시 바이패스
await session.defaultSession.setProxy({
proxyRules: 'http://proxy.example.com:8080',
proxyBypassRules: 'localhost,127.0.0.1,*.internal.com',
});
// 프록시 해제
await session.defaultSession.setProxy({
proxyRules: 'direct://',
});
// 현재 프록시 확인
const proxyInfo = await session.defaultSession.resolveProxy('https://example.com');
console.log('프록시:', proxyInfo);
다운로드 관리
session.defaultSession.on('will-download', (event, item, webContents) => {
// 저장 경로 지정 (다이얼로그 없이 자동 저장)
const savePath = path.join(app.getPath('downloads'), item.getFilename());
item.setSavePath(savePath);
// 진행률 표시
item.on('updated', (event, state) => {
if (state === 'progressing') {
if (!item.isPaused()) {
const received = item.getReceivedBytes();
const total = item.getTotalBytes();
const percent = total > 0 ? Math.round((received / total) * 100) : 0;
mainWindow.setProgressBar(percent / 100);
mainWindow.webContents.send('download:progress', {
filename: item.getFilename(),
percent,
received,
total,
});
}
}
});
item.once('done', (event, state) => {
mainWindow.setProgressBar(-1); // 진행률 바 제거
if (state === 'completed') {
mainWindow.webContents.send('download:complete', {
filename: item.getFilename(),
path: item.getSavePath(),
});
} else {
mainWindow.webContents.send('download:failed', {
filename: item.getFilename(),
});
}
});
});
요청 가로채기
// 요청 헤더 수정
session.defaultSession.webRequest.onBeforeSendHeaders(
{ urls: ['https://api.example.com/*'] },
(details, callback) => {
details.requestHeaders['Authorization'] = `Bearer ${getToken()}`;
details.requestHeaders['X-Custom-Header'] = 'electron-app';
callback({ requestHeaders: details.requestHeaders });
}
);
// 응답 헤더 수정 (CORS 우회 등)
session.defaultSession.webRequest.onHeadersReceived(
(details, callback) => {
callback({
responseHeaders: {
...details.responseHeaders,
'Access-Control-Allow-Origin': ['*'],
},
});
}
);
면접 포인트 정리
session.defaultSession은 모든 윈도우가 공유하는 기본 세션persist:접두사가 있으면 디스크에 저장, 없으면 메모리만 사용- 쿠키는
cookies.get/set/remove로 CRUD 가능 will-download이벤트로 다운로드 동작을 완전히 제어webRequest로 HTTP 요청/응답을 가로채서 헤더 수정 가능
session과 쿠키를 다뤘으면, 다음은 protocol 핸들러를 알아봅시다.
댓글 로딩 중...