본문 바로가기
프로그램 (PHP,Python)

브라우저 자동화를 위한 인프라 없는 서버리스 플랫폼 확장성

by 날으는물고기 2025. 8. 27.

브라우저 자동화를 위한 인프라 없는 서버리스 플랫폼 확장성

728x90

  • Kernel 아키텍처와 활용법: Playwright·Puppeteer를 위한 차세대 서버리스 플랫폼

한눈에 보기

  1. 정의
  • Kernel은 샌드박스된 Chrome 브라우저를 서버리스로 제공하여, Playwright·Puppeteer 등 CDP(Chrome DevTools Protocol) 기반 프레임워크로 바로 제어할 수 있게 합니다.
  • 개발자가 인프라 고민 없이 로컬 개발과 거의 같은 속도로 코드를 배포·실행하고, 모든 에이전트를 API로 노출해 외부에서 호출할 수 있습니다.
  1. 강점
  • 수초 내 배포, 대규모 병렬 확장(수천 인스턴스), 격리된 VM 실행, 라이브 뷰(원격 GUI)·세션 영속성·리플레이 제공.
  • Unikraft unikernel 지원으로 초고속 재시작(≈20ms), 스냅샷 복원, 스탠바이 절전 등 고성능 특화.
  1. 배포 방식
  • Docker 이미지 또는 Unikraft unikernel 2가지.
  • WebRTC 라이브 뷰는 TURN 서버가 필요할 수 있으며, unikernel은 퍼블릭 URL이 발급되므로 민감 작업 금지·사용 후 삭제 권장.

아키텍처 개념

  1. CDP 엔드포인트(포트 9222)
  • 각 브라우저 인스턴스는 /json/version 에서 webSocketDebuggerUrl을 제공합니다.
  • 원격 클라이언트(Playwright/Puppeteer)가 이 CDP WebSocket으로 연결·해제·재연결 가능합니다.
  • unikernel 환경에서는 헤더에 Host 값이 필요할 수 있습니다.
  1. 라이브 뷰(원격 GUI)
  • noVNC: 읽기/쓰기 가능, 간단·보편적.
  • WebRTC: 읽기/쓰기 + 창 크기 조절 + 복사/붙여넣기, 고성능. (오디오는 비활성/미지원일 수 있음)
  • 읽기 전용 모드 지원(환경변수 또는 URL 파라미터).
  1. 세션 영속성 & 스탠바이
  • 네트워크 활동이 없으면 스탠바이 모드 진입(자원·비용 최소화).
  • 상태 스냅샷으로 쿠키·토큰·히스토리·열어둔 탭·줌까지 그대로 복원.
  • 같은 persistence ID로 재접속하면 동일 브라우저 세션 사용.
  1. 리플레이(비디오 녹화)
  • 세션 전체를 영상으로 자동 녹화/중지/다운로드.
  • 실패·이슈 상황을 정확히 재현하고 원인 분석에 활용.

배포: Docker / Unikraft

1) Docker(헤드풀 Chromium)

# 1) 빌드
cd images/chromium-headful
IMAGE=kernel-docker ./build-docker.sh

# 2) 실행(noVNC 기본)
IMAGE=kernel-docker ./run-docker.sh

# 3) WebRTC 활성(권장: 빠름)
IMAGE=kernel-docker ENABLE_WEBRTC=true ./run-docker.sh

# 4) 읽기 전용 라이브 뷰(운영 시 안전)
IMAGE=kernel-docker ENABLE_READONLY_VIEW=true ./run-docker.sh
  • 포트: CDP(9222), 라이브 뷰(443).
  • 레코딩 API를 쓰려면 실행 시 옵션으로 활성화(아래 “리플레이” 참고).

2) Unikraft unikernel(초저지연/스냅샷)

# 1) Kraft CLI
curl -sSfL https://get.kraftkit.sh | sh

# 2) 시크릿(메트로/토큰)
export UKC_METRO=<region>
export UKC_TOKEN=<secret>

# 3) 빌드
./build-unikernel.sh

# 4) 실행
./run-unikernel.sh
  • 메모리 8GB 이상 권장.
  • WebRTC 사용 시 TURN 서버 필요
    ENABLE_WEBRTC=true \
    NEKO_ICESERVERS='[{"urls":["turn:turn.example.com:19302","stun:stun.example.com:19302"],"username":"name","credential":"password"}]' \
    ./run-unikernel.sh
  • 퍼블릭 URL이 자동 발급 → 민감 작업 금지, 테스트 후 인스턴스 삭제.
  • browser.close()WebSocket만 종료(브라우저 자체는 유지) → 스탠바이 후 CDP 재연결 가능.

개발자 워크플로(로컬→클라우드 “수초 내”)

  1. 로컬에서 검증: Playwright/Puppeteer 스크립트를 로컬에서 완성.
  2. 배포: Docker 또는 unikernel로 이미지/인스턴스 실행.
  3. 연결: CDP WebSocket을 가져와 원격으로 연결.
  4. 라이브 뷰/HIL: 실시간 화면 확인·수동介入(Human-In-the-Loop).
  5. 리플레이: 실패 케이스 재현·분석.
  6. API화: 에이전트가 자동으로 API 엔드포인트로 노출 → 외부 호출.
300x250

코드 예시

1) CDP 엔드포인트 조회 & 연결(Node/TypeScript)

import fetch from "node-fetch";
import puppeteer from "puppeteer";
import { chromium } from "playwright";

// 1) CDP WS URL 조회
const res = await fetch("http://localhost:9222/json/version", {
  headers: { "Host": "anything" } // unikernel일 때 필요할 수 있음
});
if (!res.ok) throw new Error(`CDP 조회 실패: ${res.status} ${await res.text()}`);
const { webSocketDebuggerUrl } = await res.json();

// 2) 연결: Puppeteer
const pBrowser = await puppeteer.connect({ browserWSEndpoint: webSocketDebuggerUrl });

// 3) 연결: Playwright
const pwBrowser = await chromium.connectOverCDP(webSocketDebuggerUrl);

// 4) 컨텍스트/페이지 확보(재사용 우선)
const ctx = pwBrowser.contexts()[0] || await pwBrowser.newContext();
const page = ctx.pages()[0] || await ctx.newPage();
await page.goto("https://example.com");

2) Kernel SDK로 브라우저 만들고 접속(권장)

import { Kernel } from "@onkernel/sdk";
import { chromium } from "playwright";

const kernel = new Kernel();
const kb = await kernel.browsers.create({
  // 세션 재사용(로그인 유지 등)
  persistence: { id: "acct-123" }
});

console.log("Live View:", kb.browser_live_view_url);  // 브라우저 화면 확인
const browser = await chromium.connectOverCDP(kb.cdp_ws_url);

const ctx = browser.contexts()[0] || await browser.newContext();
const page = ctx.pages()[0] || await ctx.newPage();
await page.goto("https://shop.example.com");

3) 다운로드/업로드 처리(2가지 전략)

A. Playwright 기본 다운로드 흐름

const [ download ] = await Promise.all([
  page.waitForEvent("download"),
  page.click("text=영수증 다운로드")
]);
const path = await download.path();  // 컨테이너 내부 경로
// 이후 Kernel 파일 API(또는 컨테이너 바운드 볼륨)로 호스트에 전달

B. CDP로 다운로드 디렉토리 지정(Chromium 전용)

const client = await ctx.newCDPSession(page);
await client.send("Browser.setDownloadBehavior", {
  behavior: "allow",
  downloadPath: "/downloads"
});

4) 리플레이 녹화 REST(로컬 이미지 API가 켜진 경우)

# 활성화 예시(도커 실행 시)
WITH_KERNEL_IMAGES_API=true ENABLE_WEBRTC=true ./run-docker.sh

# 1) 녹화 시작
curl -X POST http://localhost:10001/recording/start -d {}

# ... 에이전트 동작 ...

# 2) 녹화 중지
curl -X POST http://localhost:10001/recording/stop -d {}

# 3) 다운로드
curl http://localhost:10001/recording/download --output recording.mp4

5) 라이브 뷰 읽기 전용 모드

  • 도커 환경변수: ENABLE_READONLY_VIEW=true
  • URL 파라미터: ?readOnly=true

운영·확장 설계

  1. 병렬 확장
  • 작업 유형을 큐(예: URL·작업ID)로 관리 → 워커가 필요 시 브라우저 생성·실행·종료.
  • 헤드리스는 대량·단주기 작업에 유리(저비용/고속), 헤드풀은 디버깅·HIL·리플레이 필요 시.
  1. 수명주기 관리
  • 스탠바이로 유휴비용 최소화, persistence ID로 장기 로그인 세션 유지.
  • TTL/유휴 타임아웃/가비지 컬렉션으로 세션 누수 방지.
  1. 품질/신뢰성
  • Idempotency 키로 중복 실행 방지, 재시도(지수 백오프), 타임아웃/회로차단기.
  • 실패 시 리플레이 링크를 알림에 첨부.
  1. 관찰성
  • 지표: 실행 수/시간, 스탠바이 진입 횟수, 연결 오류율, 스냅샷/복원 시간, 리플레이 용량.
  • 로그 스키마(예)
    {"ts":"2025-08-27T04:21:00Z","agent":"price-check","session":"acct-123","step":"login","ok":true,"latency_ms":842}

보안 점검 체크리스트

보안 원칙: “플랫폼의 격리” + “조직 내부 통제” 이중화.

1) 네트워크·접근 제어

  • CDP(9222)·라이브 뷰(443)사설망 또는 VPN으로만 노출(가능하면 프라이빗 링크/보안그룹).
  • IP 허용목록·방화벽 규칙 적용, WAF/리버스 프록시 앞단에 배치.
  • SSO/OIDC 로 라이브 뷰 접근 제어(운영계는 읽기 전용 기본).
  • mTLS(내부) 또는 JWT/HMAC 기반 프리사인드 단기 토큰으로 CDP 접속을 한시 보호.
  • Unikraft 퍼블릭 URL민감 작업 금지, 테스트 후 즉시 파기.

2) WebRTC/TURN

  • TURN 서버 필수 구성(방화벽·NAT 환경) 및 자격증명 주기적 회전.
  • TURN 시크릿은 시크릿 매니저에 저장, 환경변수 주입 시 마스킹·로그 노출 금지.

3) 세션·데이터 보호

  • persistence ID ↔ 사용자/업무 키를 보안 저장소에 매핑, 만료/휴면/강제 로그아웃 정책.
  • 민감 데이터(쿠키/토큰/다운로드 파일) 는 저장 시 암호화·분류(PII/결제 등급)·보존기간 적용.
  • 브라우저 다운로드 디렉토리는 작업별 격리 경로 사용, 처리 후 보안 삭제.

4) 감사·포렌식

  • 리플레이 영상/로그/산출물무결성 해시(SHA-256) 부여, 보존기간 준수.
  • 사용자·운영자 행위(라이브 뷰 조작, 재생, 파일 열람) 감사 로그 남기기.
  • SIEM 연동(EDR/IDS 이벤트 상관분석)으로 이상 탐지.

5) 취약점·준법

  • 이미지 다이제스트 고정, 베이스 이미지 주기 패치·SBOM 관리.
  • 사이트 약관/robots/저작권/개인정보 준수, CAPTCHA·우회도구 사용 시 법무 검토.
  • 3rd-party 확장/스크립트는 코드 리뷰·정적분석(SAST)·비밀스캔 진행.

대표 활용사례 설계 포인트

  1. 가격·재고 모니터링
  • 영속 세션으로 로그인 유지 → 스케줄러가 변동 감지 시만 실행.
  • 알림(슬랙/웹훅) 에 리플레이 링크 첨부.
  1. 웹 회귀 테스트
  • 기본 헤드리스 병렬 실행, 실패 케이스만 헤드풀+리플레이로 분석.
  • HIL 버튼으로 운영자가 라이브 뷰에 즉시介入.
  1. 증빙/정산 수집
  • 지정 경로로 다운로드 → 산출물 해시 → 아카이브/ES에 메타데이터 적재.
  • 오류 재현은 리플레이로 재확인.
  1. 사내 RPA(웹 기반)
  • 사설망 전용, SSO / 역할기반 권한 필수.
  • 표준 위임 계정·개인 토큰 금지, 권한·세션 만료 정책 준수.

“에이전트 = API” 활용 예시

1) 에이전트 핸들러(개념 설계)

// 예: 상품 가격 조회 에이전트
export async function handler(req: { url: string }) {
  // 1) 영속 브라우저 연결
  const kb = await kernel.browsers.create({ persistence: { id: "acct-merchant" }});
  const browser = await chromium.connectOverCDP(kb.cdp_ws_url);
  const ctx = browser.contexts()[0] || await browser.newContext();
  const page = ctx.pages()[0] || await ctx.newPage();

  // 2) 업무 로직
  await page.goto(req.url, { waitUntil: "domcontentloaded" });
  const price = await page.textContent("[data-price]");
  // 3) 결과 반환(필요 시 리플레이/스크린샷 첨부)
  return { price, liveView: kb.browser_live_view_url };
}

2) 외부 호출(cURL 예시, 개념)

curl -X POST https://<agent-endpoint>/price-check \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://shop.example.com/item/123"}'

트러블슈팅 FAQ

  • 9222 연결 실패: 방화벽/보안그룹·IP ACL 확인, unikernel은 Host 헤더 필요 여부 점검.
  • 라이브 뷰 검은 화면/연결 지연: TURN 자격증명/포트 확인, 읽기 전용 플래그·브라우저 창 크기 재조정.
  • 다운로드 파일이 안 보임: 컨테이너 내부 경로 확인, 권한/마운트·파일 API로 호스트 반출.
  • QuickTime 재생 문제: 다른 플레이어 사용(mp4 H.264).
  • 브라우저가 “닫힌 것처럼” 보임: browser.close()는 WS만 끊김 → 스탠바이 후 재연결.

도입 SOP(표준 운영절차) 초안

  1. 설계
  • 요구사항(성능·보안·준법) 정리 → 헤드리스/헤드풀·Docker/Unikraft 매트릭스 결정.
  • CDP/라이브 뷰 노출 정책, SSO·WAF·IP ACL 확정.
  1. 프로비저닝
  • 시크릿(TURN·계정) 저장소 등록, 이미지 빌드·서명, IaC 템플릿(Terraform/Helm) 작성.
  • 로그/리플레이 저장소(S3/GCS 등)·수명주기 정책 구성.
  1. 배포
  • 스테이징 → 카나리(1~5%) → 전면 배포.
  • 알림(실패/지연/과금 급증) 설정.
  1. 운영
  • 메트릭 대시보드(실행수/성공률/지연/스탠바이/비용)·SLI/SLO.
  • 월간 패치ウ 창구: 브라우저·OS 업데이트/취약점 점검.
  1. 사고 대응
  • 즉시 차단(IP/토큰 폐기), 리플레이·로그 확보, 해시 검증, 재발 방지 RCA.
  • 데이터 삭제/만료/DSR 대응 절차.

구성 선택 가이드(요약)

  • Unikraft: 극저지연·장수명·스냅샷·즉시 확장(단, 퍼블릭 URL 주의).
  • Docker: 사설망·커스텀 이미지·운영 일관성.
  • 헤드리스: 대량·단주기·저비용.
  • 헤드풀: 디버깅/HIL/리플레이 필수 시.

바로 적용 가능한 보안 점검표(요약)

  • 사설망·IP ACL·WAF·SSO 배치, 운영계 읽기 전용 라이브 뷰
  • CDP 9222는 한시 토큰+mTLS 조합, 로깅 최소화
  • TURN 비밀 보관/회전, 환경변수 마스킹, 로그 금지
  • 세션 영속성 TTL/휴면/강제 종료 정책, 민감데이터 암호화·분류
  • 리플레이/로그 해시·보존정책, SIEM·EDR 연계
  • 이미지 다이제스트 고정, 패치/취약점·SBOM 관리
  • 사이트 약관·개인정보·봇탐지 우회 관련 법무 검토
728x90
그리드형(광고전용)

댓글