"Electron의 session은 Chromium의 세션 그 자체" — 쿠키, 캐시, 프록시, 다운로드까지 웹 브라우저의 세션 기능을 모두 다룰 수 있습니다.


Session 기본 개념

JAVASCRIPT
const { session } = require('electron');

// 기본 세션 (모든 BrowserWindow가 공유)
const defaultSession = session.defaultSession;

// 커스텀 세션 (격리된 세션)
const customSession = session.fromPartition('persist:myapp');

// 임시 세션 (앱 종료 시 삭제)
const tempSession = session.fromPartition('temp-session');
// persist: 접두사가 없으면 메모리에만 저장됩니다

윈도우별 세션 지정

JAVASCRIPT
const win = new BrowserWindow({
  webPreferences: {
    // 커스텀 세션 사용
    partition: 'persist:myapp',
  },
});

// 또는 세션 객체 직접 지정
const win2 = new BrowserWindow({
  webPreferences: {
    session: session.fromPartition('persist:user2'),
  },
});

쿠키 관리

JAVASCRIPT
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);
  }
}

쿠키 변경 감지

JAVASCRIPT
session.defaultSession.cookies.on('changed', (event, cookie, cause, removed) => {
  console.log(`쿠키 ${removed ? '삭제' : '변경'}: ${cookie.name}`);
  console.log(`원인: ${cause}`); // explicit, overwrite, expired 등
});

캐시 관리

JAVASCRIPT
// 캐시 크기 확인
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'],
});

프록시 설정

JAVASCRIPT
// 프록시 설정
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);

다운로드 관리

JAVASCRIPT
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(),
      });
    }
  });
});

요청 가로채기

JAVASCRIPT
// 요청 헤더 수정
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 핸들러를 알아봅시다.

댓글 로딩 중...