TRENDSHIFT 딥다이브 · 2026-06-27

Lakr233/AssppWeb 딥다이브
— Apple ID로 App Store 앱을 셀프호스팅 서버에서 받아 iOS에 설치하는 Zero-Trust 웹앱

Apple 자격증명이 서버에 절대 전달되지 않는다 — 이것이 AssppWeb의 핵심 약속이다. 브라우저 안에서 WebAssembly로 빌드된 libcurl(Mbed TLS 1.3)이 Apple 서버와 직접 암호화 통신하고, 서버는 Wisp 프로토콜로 TCP를 맹목적으로 중계할 뿐이다. (저장소: Lakr233/AssppWeb · 스택: React 19 + Vite + Tailwind / Node.js Express · 배포: Docker · Cloudflare Workers+Containers · Railway · MIT 라이선스 · TrendShift 셀프호스팅 트렌딩) ⚠ 공개 인스턴스는 프론트엔드 변조 위험이 있으므로 직접 셀프호스팅하거나 신뢰할 수 있는 파트너의 인스턴스만 사용할 것을 레포 자체가 강력히 권장한다.
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항 · 설치
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

이 레포가 무엇을 하는 물건인가.

핵심 메시지

"서버에 Apple ID를 절대 보내지 않으면서, App Store 앱 IPA를 내 서버에서 받아 iOS 기기에 설치한다 — Zero-Trust 셀프호스팅 앱 취득 도구"

AssppWeb은 Apple ID로 로그인해 App Store 앱의 라이선스를 취득하고, 해당 IPA 파일을 서버에 컴파일하여 itms-services:// 프로토콜로 iOS 기기에 직접 설치할 수 있게 해주는 셀프호스팅 웹 도구다.

핵심 차별점은 브라우저 안의 WebAssembly(libcurl.js)가 Apple 서버와 TLS 1.3으로 직접 통신한다는 것 — 서버(백엔드)는 암호화된 Wisp TCP 스트림을 맹목적으로 중계할 뿐, Apple 자격증명을 절대 볼 수 없다.

용어
IPA (iOS Package Archive)
iOS 앱 설치 파일 형식. 안드로이드의 APK에 해당한다. 실체는 ZIP 압축 파일이며 Payload/앱이름.app/ 구조를 담고 있다. 앱스토어 외 배포 시 DRM 서명 파일(SINF)이 포함되어야 실행된다.
용어
SINF (Signature Info File)
Apple의 FairPlay DRM이 특정 Apple ID 계정에 묶인 앱 라이선스를 증명하는 바이너리 파일. IPA 내부 SC_Info/ 폴더에 위치한다. AssppWeb 서버는 이 SINF를 브라우저에서 받아 CDN에서 내려받은 IPA에 주입한다.
용어
Wisp 프로토콜
WebSocket 위에서 TCP 스트림을 멀티플렉싱하는 오픈 프로토콜. 브라우저는 Wisp WebSocket 연결을 통해 임의의 TCP 서버(여기서는 Apple API 서버)에 마치 직접 접속한 것처럼 통신할 수 있다. 서버는 패킷 내용을 해독하지 못한다.

2왜 주목받는가

트렌딩 이유, 유사 도구 대비 장점.

AssppWeb이 TrendShift에서 주목받는 데는 두 가지 맥락이 있다.

첫째, Lakr233이라는 작성자의 명성이다. Lakr233은 iOS/macOS 생태계에서 Asspp(앱스토어 앱 취득 CLI), Reveil(iOS 시스템 정보 앱), Copilot for Xcode 등 다수의 인기 오픈소스 도구로 알려진 개발자다. AssppWeb은 그의 기존 CLI 도구 Asspp웹 기반 후속작이다.

둘째, Zero-Trust 아키텍처라는 기술적 차별성이다. 유사한 앱 취득 도구(예: ipatool, 과거의 다양한 스크립트들)는 서버나 로컬 환경에 Apple ID/비밀번호를 평문으로 전달하는 경우가 많았다. AssppWeb은 libcurl.js(WebAssembly)와 Mbed TLS를 브라우저 안에 탑재해 이 문제를 정면으로 해결한다.

함정
공개 인스턴스 신뢰 문제

Zero-Trust 아키텍처는 서버 측 도청을 막지만, 악의적인 호스트가 변조된 프론트엔드를 배포하면 브라우저가 암호화하기 전에 자격증명을 탈취당할 수 있다. 레포는 이를 명시하며 공개 인스턴스 사용을 강하게 경고한다.

또한 Apple의 이용약관상 서드파티를 통한 앱 취득은 허용되지 않을 수 있다. 학습 목적 이상의 사용은 개인이 책임져야 한다.

해결책
직접 셀프호스팅 + SSL 인증서 검증

Docker Compose 한 줄(docker compose up -d)로 내 서버에 배포하고, SSL 인증서를 직접 확인하는 것이 유일한 안전한 사용법이다. Cloudflare Workers+Containers 배포는 클릭 한 번으로 가능하다.

유사 도구 대비 비교

도구방식서버 자격증명 노출배포 방법
AssppWebWebAssembly TLS + Wisp 중계없음 (Zero-Trust)Docker / Cloudflare / Railway
ipatool (CLI)로컬 CLI, Apple ID 직접 입력로컬 프로세스에만로컬 설치
기존 웹 스크립트들서버가 Apple API 직접 호출서버에 평문 전달됨다양
AltStore / Sideloadly데스크탑 앱 + Apple ID로컬 앱에만데스크탑 설치

3기술 스택 전체 지도

실제 package.json과 Dockerfile을 분석한 결과.

프론트엔드

기술버전역할
React19.0UI 컴포넌트 트리. Account · Search · Download · Settings 4개 주요 페이지
TypeScript5.7전 소스 타입 안전성 — Apple 프로토콜 타입까지 엄격 정의
Vite6.0빌드 도구 · 개발 서버. ESM 네이티브, 빠른 HMR
Tailwind CSS4.0유틸리티 CSS. Vite 플러그인으로 통합
React Router7.1SPA 라우팅 — /accounts /search /downloads /settings
Zustand5.0전역 상태 관리 — accounts · downloads · settings · toast 4개 스토어
libcurl.js0.7.4핵심! WebAssembly로 컴파일된 libcurl + Mbed TLS 1.3. 브라우저에서 Apple API와 직접 TLS 통신
idb8.0IndexedDB 래퍼. Apple ID 자격증명·세션 쿠키를 브라우저 로컬에 암호화 저장
i18next23.10다국어(en-US / zh-CN / zh-TW / ja / ko / ru) 지원
qrcode.react4.2iOS 설치 URL QR코드 표시
Vitest4.0프론트엔드 단위 테스트 — Apple 프로토콜 파싱·인증·쿠키 테스트

백엔드

기술버전역할
Node.js20 LTS런타임 (Alpine Linux Docker 이미지)
Express4.21HTTP API 서버. /api/* 라우트 처리
@mercuryworkshop/wisp-js0.4.1Wisp 서버 — WebSocket으로 들어오는 암호화 TCP를 Apple 서버로 맹목적 중계
yauzl-promise4.0비동기 ZIP/IPA 파일 읽기 (스트리밍)
adm-zip0.5ZIP 파일에 SINF · iTunesMetadata.plist 주입
bplist-parser / bplist-creator최신Apple 바이너리 plist 파싱 및 생성
plist3.1XML plist 파싱 (Info.plist · Manifest.plist)
uuid11.0다운로드 작업 고유 ID 생성
Vitest (backend)4.0백엔드 단위 테스트 — Wisp 프록시·라우트·SINF 주입 테스트

인프라 · 배포

레이어기술설명
컨테이너화Docker (멀티스테이지)3단계 빌드: ① 프론트엔드 빌드 ② 백엔드 빌드 ③ 런타임 통합. 최종 이미지에 zip CLI 포함 (SINF 주입용)
컨테이너 레지스트리GitHub Container Registryghcr.io/lakr233/assppweb:latest 공개 이미지
로컬 셀프호스팅Docker Composecompose.yml 한 파일로 서비스 · 볼륨 · 환경변수 정의
클라우드 배포 1Cloudflare Workers + Containerswrangler.jsonc + Durable Objects. 유료 플랜 필요
클라우드 배포 2RailwayGHCR 이미지 직접 배포. 볼륨 마운트 + 환경변수 설정
CI/CDGitHub Actions.github/workflows/docker.yml — GHCR 이미지 자동 빌드·푸시
리버스 프록시Caddy / Nginx (선택)iOS 설치(itms-services://)에 HTTPS 필수 — TLS 종료
WebSocket 필수Wisp over WS (/wisp/)CDN·프록시에서 WebSocket 업그레이드 허용 필수

4아키텍처 심화 분석

Zero-Trust 설계의 실제 작동 흐름.

전체 시스템 구조도

┌─────────────────────────────────────────────────────────────────┐ │ 브라우저 (신뢰 경계 내) │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ IndexedDB (암호화 저장) │ │ │ │ · Apple ID / 비밀번호 │ │ │ │ · 세션 쿠키 / passwordToken / DSID │ │ │ │ · pod 번호 / deviceIdentifier │ │ │ └──────────────────────────────────────────┘ │ │ ↕ (읽기/쓰기) │ │ ┌──────────────────────────────────────────┐ │ │ │ libcurl.js (WebAssembly + Mbed TLS 1.3) │ │ │ │ ① Bag fetch → /api/bag?guid=... │ │ │ │ ② Authenticate → Apple 인증 서버 │ │ │ │ ③ Purchase → Apple 구매 서버 │ │ │ │ ④ Download Info → CDN URL + SINFs │ │ │ │ ⑤ Version Listing/Lookup │ │ │ └──────────────────┬───────────────────────┘ │ │ │ TLS 1.3 암호화 (서버 해독 불가) │ └─────────────────────┼───────────────────────────────────────────┘ │ WebSocket (Wisp 프로토콜) ┌─────────────────────▼───────────────────────────────────────────┐ │ 백엔드 서버 (맹목 중계) │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ Wisp 서버 (/wisp/) │ │ │ │ → 암호화 TCP 패킷을 Apple 서버로 중계 │ │ │ │ → 내용 해독 불가, 자격증명 미노출 │ │ │ └──────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ Bag 프록시 (/api/bag?guid=...) │ │ │ │ → Apple init.itunes.apple.com/bag.xml │ │ │ │ → 공개 서비스 URL만 반환 (자격증명 없음) │ │ │ └──────────────────────────────────────────┘ │ │ │ │ 브라우저가 CDN URL + SINFs + 메타데이터 POST │ │ ↓ │ │ ┌──────────────────────────────────────────┐ │ │ │ 다운로드 관리자 │ │ │ │ ① Apple CDN에서 IPA 다운로드 (공개 URL) │ │ │ │ ② SINF 파일 IPA에 주입 (sinfInjector) │ │ │ │ ③ iTunesMetadata.plist 주입 │ │ │ │ ④ /data/packages/ 에 IPA 저장 │ │ │ └──────────────────┬───────────────────────┘ │ │ │ │ │ ┌──────────────────▼───────────────────────┐ │ │ │ 설치 매니페스트 (/api/install/:id) │ │ │ │ itms-services://manifest.plist 생성 │ │ │ │ → iOS Safari가 직접 다운로드·설치 │ │ │ └──────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘

핵심 설계 패턴 1: 브라우저-사이드 Apple 프로토콜

frontend/src/apple/ 폴더가 전체 Apple 프로토콜 스택을 담는다. authenticate.ts가 로그인 흐름을, purchase.ts가 라이선스 취득을, download.ts가 CDN URL·SINF 수집을 담당한다. 이 모든 HTTP 요청은 request.ts를 통해 libcurl.js WebAssembly로 실행된다 — 브라우저 내장 fetch()가 아니다.

핵심 설계 패턴 2: Pod 기반 라우팅

Apple 인증 후 서버는 pod 헤더를 반환한다. 이후 모든 Store/Purchase API 호출은 p{pod}-buy.itunes.apple.com으로 라우팅된다. IndexedDB의 Account 객체가 pod 번호를 저장하며, storeAPIHost(pod?)·purchaseAPIHost(pod?) 함수가 동적으로 호스트를 결정한다.

핵심 설계 패턴 3: SINF 주입 프로세스

서버의 sinfInjector.ts는 IPA(ZIP) 파일을 열어 Manifest.plist에서 SINF 경로를 읽고, 브라우저에서 받은 base64 SINF 데이터를 임시 디렉토리에 쓴 뒤 시스템 zip 명령으로 IPA에 갱신한다. 경로 순회(path traversal) 공격 방어 로직도 포함되어 있다.

비유로 이해하기

택배 봉투 봉인 비유: 브라우저는 Apple에게 보내는 편지(자격증명)를 스스로 봉투에 넣고 봉인한다. 서버(Wisp)는 그 봉인된 봉투를 그냥 Apple 주소로 배달만 한다 — 봉투를 열어볼 수 없다. Apple이 답장(SINF, CDN URL)을 보내면 브라우저가 직접 뜯어보고 서버에는 공개 정보(CDN URL, SINF)만 전달한다. 서버는 CDN에서 앱 본체를 내려받아 SINF 도장을 찍어 iOS 기기에 전달하는 '포장·배달부' 역할이다.

5디렉토리 구조 해부

실제 레포 구조를 직접 확인한 결과.

AssppWeb/ ├── frontend/ # React SPA (Vite + TypeScript + Tailwind) │ ├── src/ │ │ ├── apple/ # ★ Apple 프로토콜 구현 (핵심) │ │ │ ├── authenticate.ts # Apple ID 로그인 흐름 │ │ │ ├── purchase.ts # 앱 라이선스 취득 │ │ │ ├── download.ts # CDN URL + SINF 수집 │ │ │ ├── versionLookup.ts# 앱 버전 정보 조회 │ │ │ ├── bag.ts # Apple bag.xml 프록시 요청 │ │ │ ├── config.ts # Pod 기반 호스트 결정 │ │ │ ├── request.ts # libcurl.js WebAssembly 래퍼 │ │ │ ├── plist.ts # plist 파싱 유틸 │ │ │ └── cookies.ts # Apple 세션 쿠키 관리 │ │ ├── components/ # UI 컴포넌트 │ │ │ ├── Account/ # Apple ID 계정 관리 UI │ │ │ ├── Search/ # App Store 검색 · 상세 · 버전 히스토리 │ │ │ ├── Download/ # 다운로드 목록 · 상세 · 추가 │ │ │ ├── Settings/ # 서버 설정 페이지 │ │ │ └── common/ # 공통 컴포넌트(Modal, Toast, Badge 등) │ │ ├── store/ # Zustand 전역 상태 │ │ │ ├── accounts.ts # Apple ID 계정 목록 │ │ │ ├── downloads.ts # 진행 중 다운로드 상태 │ │ │ └── settings.ts # 서버 설정 │ │ ├── api/ # 백엔드 REST API 클라이언트 │ │ └── locales/ # 6개 언어 번역 파일 │ ├── tests/ # Vitest 단위 테스트 │ └── package.json # React 19, libcurl.js, Zustand 등 │ ├── backend/ # Node.js/Express 서버 (TypeScript) │ ├── src/ │ │ ├── index.ts # 앱 진입점 · 미들웨어 조립 │ │ ├── config.ts # 환경변수 파싱 │ │ ├── routes/ # REST API 라우트 │ │ │ ├── auth.ts # /api/auth (미사용 — 인증은 브라우저 직접) │ │ │ ├── search.ts # /api/search (iTunes API 프록시) │ │ │ ├── downloads.ts # /api/downloads (다운로드 관리) │ │ │ ├── packages.ts # /api/packages (IPA 목록) │ │ │ ├── install.ts # /api/install/:id (설치 매니페스트) │ │ │ ├── bag.ts # /api/bag (Apple bag.xml 프록시) │ │ │ └── settings.ts # /api/settings (서버 정보) │ │ ├── services/ │ │ │ ├── wsProxy.ts # Wisp WebSocket 프록시 │ │ │ ├── sinfInjector.ts # IPA에 SINF 주입 │ │ │ ├── downloadManager.ts # 병렬 다운로드 관리 │ │ │ ├── chunkedDownloader.ts # 청크 다운로드 │ │ │ └── manifestBuilder.ts # itms-services 매니페스트 생성 │ │ └── middleware/ │ │ ├── httpsRedirect.ts# HTTP→HTTPS 리다이렉트 │ │ └── accessAuth.ts # ACCESS_PASSWORD 검증 │ └── package.json # Express, wisp-js, bplist 등 │ ├── cloudflare/ # Cloudflare Workers 진입점 │ └── src/index.ts # Durable Object → Container 라우팅 │ ├── Dockerfile # 3단계 멀티스테이지 빌드 ├── compose.yml # Docker Compose 로컬 배포 ├── wrangler.jsonc # Cloudflare Workers 배포 설정 ├── AGENTS.md → CLAUDE.md # 에이전트/AI 코딩 지침 (symlink) └── README.md

주목할 폴더: frontend/src/apple/

이 폴더가 AssppWeb의 핵심이다. Apple iTunes Store 프로토콜을 TypeScript로 완전히 재구현했으며, Swift 참조 구현(references/ApplePackage/)을 소스 오브 트루스로 삼아 CodingKeys·인증 흐름·bag 엔드포인트를 동기화한다. 웹 표준 Fetch API 대신 libcurl.js WebAssembly를 사용하기 때문에 실제 curl의 TLS 스택이 브라우저 안에서 실행된다.

6학습 포인트

이 레포에서 무엇을 배울 수 있는가.

1. WebAssembly를 실제 프로젝트에 통합하는 방법

libcurl.js 패키지는 libcurl C 라이브러리를 Emscripten으로 WebAssembly로 컴파일한 것이다. frontend/src/apple/libcurl-init.tsrequest.ts를 읽으면 브라우저에서 WASM 모듈을 초기화하고 C 함수를 JavaScript에서 호출하는 패턴을 배울 수 있다.

2. Zero-Trust 아키텍처 설계 원칙

자격증명을 서버에 절대 보내지 않는 설계는 보안 아키텍처의 교과서적 사례다. Wisp 프로토콜을 통한 맹목 TCP 중계, IndexedDB를 이용한 브라우저-사이드 비밀 저장, TLS 1.3 세션을 브라우저가 직접 관리하는 패턴 — 이 세 가지를 함께 공부하면 된다.

3. IndexedDB를 통한 영구 상태 관리

idb 라이브러리로 Apple 세션 정보(쿠키, 토큰, DSID)를 브라우저 로컬에 영구 저장하는 패턴. Zustand 인메모리 상태와 IndexedDB 영구 상태를 함께 쓰는 방식을 store/accounts.ts에서 볼 수 있다.

4. Docker 멀티스테이지 빌드

프론트엔드(Node Alpine)·백엔드(Node Alpine + python3/make/g++)·런타임 세 단계로 분리하여 최종 이미지 크기를 최소화하는 패턴. Dockerfile이 교과서적 예시다.

5. Cloudflare Workers + Containers (신기술)

wrangler.jsonccloudflare/src/index.ts는 Cloudflare의 Durable Objects가 Container 인스턴스를 관리하는 새로운 배포 모델을 보여준다. 2026년 현재 비교적 새로운 기능으로, 실제 사용 사례를 탐구하기 좋다.

6. Apple 독점 프로토콜 역공학

references/ApplePackage/(Swift 참조 구현)와 TypeScript 구현을 대조하면 iTunes Store API의 비공개 프로토콜(bag.xml, pod 라우팅, SINF 형식, bplist 형식)을 학습할 수 있다. 단, 이는 역공학 결과물이며 Apple의 공식 문서가 없는 영역이다.

7시스템 요구사항 · 설치

직접 배포하는 세 가지 방법.

요구사항

항목최소 요구사항비고
서버 OSLinux (Alpine 권장), macOSDocker 컨테이너 내부는 Alpine Linux 3.x
DockerDocker Engine 24+, Compose v2단독 배포 필수. 빌드 시 python3·make·g++ 필요(자동 설치)
HTTPS유효한 SSL/TLS 인증서iOS itms-services:// 설치에 HTTPS 필수. Let's Encrypt + Caddy 추천
WebSocket리버스 프록시 WS 업그레이드 허용Wisp 프로토콜 필수 경로: /wisp/
디스크IPA 파일 크기에 따라 수 GBDATA_DIR에 마운트된 볼륨 권장
Cloudflare 배포Workers 유료 플랜Containers 기능이 Free 플랜 미지원
클라이언트iOS Safari (앱 설치 시)앱 검색·다운로드는 일반 브라우저 가능

방법 1: Docker Compose (가장 간단)

# compose.yml 받기
curl -O https://raw.githubusercontent.com/Lakr233/AssppWeb/main/compose.yml

# 시작 (포트 8080, /mnt/asspp-data 에 IPA 저장)
docker compose up -d

# 비밀번호 설정 (선택)
# compose.yml 환경변수에 ACCESS_PASSWORD=your_password 추가

방법 2: Cloudflare Workers + Containers (클릭 한 번)

README의 "Deploy to Cloudflare" 버튼을 클릭하면 Workers Scripts Edit + Containers Edit + Cloudchamber Edit 권한을 가진 API 토큰을 요구한다. 유료 플랜 필수.

방법 3: Railway (무료 트라이얼 가능)

# 1. railway.com/new/image 에서 이미지 입력
ghcr.io/lakr233/assppweb:latest

# 2. Settings → Healthcheck Path: /api/settings
# 3. 볼륨 마운트: /data  →  환경변수: DATA_DIR=/data
# 4. Networking → 퍼블릭 도메인 생성

환경변수 전체 목록

변수기본값설명
PORT8080서버 리슨 포트
DATA_DIR./data컴파일된 IPA 저장 디렉토리
PUBLIC_BASE_URL자동감지설치 매니페스트 URL 생성용 공개 도메인
ACCESS_PASSWORD(없음)웹 UI 및 API 접근 비밀번호 (빈 값 = 비활성화)
DOWNLOAD_THREADS8IPA 병렬 다운로드 스레드 수 (1~32)
AUTO_CLEANUP_DAYS0N일 이상 된 IPA 자동 삭제 (0=비활성)
AUTO_CLEANUP_MAX_MB0최대 캐시 크기 초과 시 오래된 IPA 삭제 (0=비활성)
MAX_DOWNLOAD_MB0이 크기 초과 다운로드 거부 (0=무제한)
UNSAFE_DANGEROUSLY_DISABLE_HTTPS_REDIRECTfalseHTTP→HTTPS 리다이렉트 비활성화 (위험, 최후 수단)

8직접 해볼 수 있는 실습 과제

난이도별 3~5개 과제.

LV.1 — 입문

Docker Compose로 로컬 배포 후 UI 탐색

공식 Docker 이미지를 받아 로컬에서 띄우고 웹 UI를 탐색해본다. 프론트엔드 구조(Account · Search · Download 탭)와 네트워크 탭에서 /wisp/ WebSocket 연결이 어떻게 열리는지 확인한다.

docker compose up -d → 브라우저 http://localhost:8080 → Chrome DevTools Network 탭 → WS 연결 확인
LV.2 — 초급

소스코드 직접 빌드 + 개발 서버 실행

레포를 클론해 프론트엔드(npm run dev)와 백엔드(npm run dev)를 별도 터미널에서 동시에 실행한다. frontend/src/apple/config.ts에서 Pod 라우팅 함수를 읽고 어떤 Apple 서버 주소가 생성되는지 이해한다.

cd frontend && npm install && npm run dev
cd backend && npm install && npm run dev
LV.3 — 중급

Wisp 프로토콜 분석 — WebSocket 패킷 덤프

Chrome DevTools의 Network 탭 → WS → Messages에서 Wisp 메시지를 캡처한다. backend/src/services/wsProxy.ts 소스와 대조하며 @mercuryworkshop/wisp-js 라이브러리가 어떻게 TCP를 멀티플렉싱하는지 분석한다. 실제 패킷이 암호화되어 있어 내용은 보이지 않음을 확인한다(Zero-Trust 증명).

LV.4 — 중급~고급

SINF 주입 코드 분석 + 단위 테스트 작성

backend/src/services/sinfInjector.ts를 읽고 IPA(ZIP) 파일에서 Manifest.plist를 찾아 SINF 경로를 추출하는 로직을 이해한다. backend/tests/sinfInjector.test.ts를 참고해 테스트용 더미 IPA를 만들고 SINF 주입이 올바르게 동작하는지 검증하는 추가 테스트를 작성한다.

cd backend && npm test
LV.5 — 고급

libcurl.js WASM 초기화 과정 분석 + 대안 구현 탐색

frontend/src/apple/libcurl-init.tsrequest.ts를 분석해 WebAssembly 모듈 로딩·초기화·C 함수 바인딩 과정을 정리한다. 브라우저 내장 fetch()와 어떻게 다른지(TLS 세션 제어, 쿠키 관리 수준) 비교 문서를 작성한다. 선택적으로 libcurl.js npm 패키지 소스(libcurl.js)도 탐색한다.

9관련 기술 심화 학습 로드맵

AssppWeb을 완전히 이해하기 위한 주차별 학습 계획.

주차주제학습 자료 / 실습
1주차React 19 + TypeScript 기초공식 React 문서 → frontend/src/components/ 컴포넌트 읽기. Zustand 공식 문서 → store/accounts.ts 분석
2주차Vite + Tailwind CSS 4Vite 공식 가이드 → frontend/vite.config.ts 분석. Tailwind 4의 Vite 플러그인 방식(PostCSS 불필요)을 기존 방식과 비교
3주차IndexedDB + idb 라이브러리MDN IndexedDB API → idb 패키지 README → store/accounts.ts에서 계정 저장 코드 분석. LocalStorage와의 차이(용량·트랜잭션·비동기)
4주차WebAssembly 기초 + EmscriptenMDN WebAssembly 가이드 → Emscripten 공식 문서 → libcurl.js 레포 → libcurl-init.ts 분석
5주차WebSocket + Wisp 프로토콜MDN WebSocket API → @mercuryworkshop/wisp-js GitHub → wsProxy.ts 분석. TCP 멀티플렉싱 개념 이해
6주차TLS/SSL 심화Cloudflare의 TLS 1.3 학습 자료 → Mbed TLS 개요 → 브라우저 내장 TLS와 libcurl.js WASM TLS의 차이
7주차Node.js Express + TypeScriptExpress 4 공식 문서 → backend/src/routes/ 전체 읽기 → middleware/ 패턴 이해
8주차Docker 멀티스테이지 빌드Docker 공식 멀티스테이지 문서 → Dockerfile 분해 → compose.yml 실습 배포
9주차Cloudflare Workers + Durable ObjectsCloudflare Workers 공식 문서 → Durable Objects 가이드 → cloudflare/src/index.ts + wrangler.jsonc 분석
10주차Apple 이진 포맷 (plist · IPA)Apple plist 포맷 문서 → bplist-parser 소스 → sinfInjector.ts에서 바이너리/XML plist 파싱 비교 분석

10핵심 키워드 사전

이 레포를 읽으며 만나는 핵심 개념 정리.

키워드설명
Zero-Trust Architecture서버를 신뢰하지 않는 설계 원칙. 자격증명·민감 데이터를 서버에 전달하지 않고 클라이언트가 직접 처리
libcurl.jslibcurl C 라이브러리를 Emscripten + WebAssembly로 컴파일한 npm 패키지. 브라우저에서 실제 TLS 스택 실행 가능
Wisp 프로토콜WebSocket 위에서 여러 TCP 연결을 다중화하는 프로토콜. 브라우저가 임의 TCP 서버와 통신하는 터널 역할
IPA (iOS Package Archive)iOS 앱 배포 패키지. 확장자 .ipa. 내부는 ZIP 구조로 Payload/.app 디렉토리 포함
SINF (Signature Info)Apple FairPlay DRM 라이선스 바이너리. 특정 Apple ID에 묶인 앱 소유 증명 파일
plist (Property List)Apple의 설정·데이터 직렬화 포맷. XML 형식과 바이너리(bplist) 형식 두 가지 존재
itms-services://Apple OTA(Over-The-Air) 앱 설치 URL 스킴. HTTPS 서버에 manifest.plist가 있어야 함
Apple bag.xmlApple 서비스 URL 디렉토리. init.itunes.apple.com/bag.xml — 다양한 Apple API 엔드포인트 URL을 반환
Pod 라우팅Apple 인증 후 반환되는 pod 번호에 따라 p{N}-buy.itunes.apple.com으로 API 라우팅하는 Apple 내부 메커니즘
IndexedDB브라우저 내장 NoSQL 데이터베이스. LocalStorage보다 용량이 크고 트랜잭션 지원. AssppWeb이 Apple 세션을 저장하는 곳
ZustandReact용 경량 전역 상태 관리 라이브러리. Redux보다 보일러플레이트가 적음
Durable ObjectsCloudflare Workers에서 상태를 영구 보존하는 서버리스 인스턴스. AssppWeb은 Container를 1개 DO로 관리
EmscriptenC/C++ 코드를 WebAssembly로 컴파일하는 툴체인. libcurl을 브라우저에서 실행 가능하게 만드는 데 사용됨
멀티스테이지 Docker 빌드하나의 Dockerfile에 여러 FROM을 써서 빌드 의존성을 최종 이미지에서 제거하는 패턴
Mbed TLSARM이 관리하는 경량 TLS 구현체. libcurl.js가 브라우저 WASM 환경에서 TLS 1.3을 구현하는 데 사용

11참고 링크

출처 · 정리 기준일 2026-06-27 · 솔직한 한계 명시.