REA를 Claude Code에 연결해 내 JavaScript·Electron 앱 빌드 결과물 분석하기: 설치 범위, 정적 분석, 결과 줄이는 법
프로젝트 한정 등록, analyze-javascript-application 실행, 170만 토큰짜리 결과를 필요한 필드만 남기는 방법, Electron 보안 점검 프롬프트

핵심 요약
- REA는 바이너리·JS·Electron·.NET·웹 분석 도구를 MCP로 묶어 Claude Code 같은 에이전트에 연결하는 오픈소스 도구다.
- 공식 setup은 모든 프로젝트에 등록되므로, 분석용 폴더에서만 쓰려면 claude mcp add --scope local로 버전을 고정해 등록한다.
- JS·Electron 정적 분석은 디컴파일러 없이 analyze-javascript-application 하나로 시작할 수 있다.
- 48KB 소스에서 7.4MB·약 174만 토큰 결과가 나오므로 --filter-output이나 jq로 summary·statistics·limitations부터 읽는다.
- 본인 소유이거나 권한을 받은 소프트웨어만 분석하고, 실행형 도구는 범위를 명시해 쓴다.
REA(Reverse Engineer Anything)는 네이티브 바이너리, JavaScript·Electron 앱, .NET 어셈블리, 웹사이트를 분석하는 도구를 MCP 서버로 묶어 코딩 에이전트에 연결해 주는 오픈소스 프로젝트다(MIT 라이선스, npm 패키지 rea-agents). Claude Code에서는 "이 앱의 IPC 구조를 근거와 함께 설명해 줘"처럼 말로 요청하면 에이전트가 REA 도구를 호출해 결과를 읽고 답한다. 분석은 로컬에서 실행된다.
이 글은 REA의 여러 기능 중 내가 만든 JavaScript·Electron 앱의 빌드 결과물을 정적 분석하는 용도에 집중한다. 별도 디컴파일러(Hopper·Ghidra·IDA)가 필요 없어 바로 시작할 수 있고, 배포 산출물에 무엇이 들어갔는지 확인하는 일은 자기 코드에서도 쓸모가 있기 때문이다. 아래 명령과 출력은 REA 6.5.0을 macOS·Node.js 26에서 이 사이트의 빌드 스크립트(우리가 작성한 Node 코드)에 직접 실행해 확인한 것이다.
먼저: 분석해도 되는 대상인지
REA 저장소의 DISCLAIMER는 허용 용도를 보안 연구, 악성코드 분석, CTF·교육, 상호운용성, 소프트웨어 보존, 그리고 본인 소유이거나 분석 권한을 받은 소프트웨어의 디버깅·감사로 한정한다. DRM·라이선스 검사·안티치트 우회, 게임 치트, 독점 소프트웨어 복제는 지원하지 않는다고 명시한다. 파일을 갖고 있다는 사실만으로 모든 분석이 허락되는 것은 아니며, 리버스 엔지니어링은 관할 지역의 법이나 대상 소프트웨어의 라이선스로 제한될 수 있다. 이 글의 예제는 모두 자기 프로젝트 산출물을 대상으로 한다.
준비물과 지원 범위
| 항목 | 내용 |
|---|---|
| Node.js | 22.x(22.19 이상), 24.x(24.11 이상), 또는 26 이상 + npm |
| JS·Electron 정적 분석 | 추가 도구 불필요(Linux는 procps 호환 ps 필요) |
| 네이티브 바이너리 | Hopper·Ghidra·IDA 중 하나. 상용 도구는 정식 라이선스 필요 |
| 지원 에이전트 | Claude Code, Codex, Cursor, Gemini CLI 등 로컬 MCP를 지원하는 클라이언트 |
1단계: 설치 범위를 먼저 정한다
공식 설치 명령 npx rea-agents setup은 편하지만, Claude Code에 대해서는 ~/.claude.json의 사용자 단위 mcpServers.rea와 ~/.claude/skills 아래 스킬을 함께 설치한다. 즉 Claude Code로 여는 모든 프로젝트에서 REA 도구가 보인다. 분석 작업용 폴더에서만 쓰려면 문서가 안내하는 프로젝트 한정(local scope) 등록이 낫다. MCP 범위의 차이는 Claude Code에 MCP 서버 연결하기: local·project·user 범위와 .mcp.json 관리에서 정리했다.
| 방식 | 명령 | 적용 범위 | 스킬 설치 |
|---|---|---|---|
| 공식 setup | npx rea-agents setup | 모든 프로젝트(사용자 단위) | 예 |
| 프로젝트 한정 | claude mcp add --scope local ... | 등록한 폴더에서만 | 아니오 |
| 별도 프로필 | CLAUDE_CONFIG_DIR=~/.claude-rea + setup | 그 프로필로 띄운 세션 | 예 |
- 분석 전용 폴더를 만들고 그 안에서
CLAUDE_CONFIG_DIR가 비어 있는지 확인한다. 문서는 등록부터 제거까지 이 변수를 설정하지 않은 상태로 유지하라고 한다. - 버전을 고정해 local scope로 등록한다.
claude mcp list로 이 폴더에서만rea가 보이는지 확인한다.
mkdir ~/rea-workspace && cd ~/rea-workspace
unset CLAUDE_CONFIG_DIR
claude mcp add --scope local rea -- npx -y [email protected] mcp
claude mcp list
문서는 --scope project를 피하라고 한다. 저장소에 .mcp.json이 만들어져 커밋·복사될 수 있기 때문이다. local 등록은 rea update나 rea doctor가 관리하지 않으므로 버전을 올릴 때는 등록을 지우고(claude mcp remove --scope local rea) 새 버전으로 다시 등록한다. 또 이 방식은 REA가 제공하는 워크플로 스킬을 설치하지 않으므로, 에이전트가 도구를 고르는 안내가 필요하면 별도 프로필 방식을 쓴다.
2단계: 터미널에서 먼저 한 번 돌려 본다
에이전트에게 맡기기 전에 CLI로 결과의 모양을 보는 것이 좋다. 대상은 압축을 푼 앱 폴더나 .asar 파일이며 절대 경로로 넘긴다.
npx -y [email protected] analyze-javascript-application /abs/path/to/app --json > out.json
이 사이트의 scripts/ 폴더(JS 파일 7개, 약 48KB)로 실행한 결과는 다음과 같았다. 첫 실행은 패키지 내려받기를 포함해 약 11초 걸렸다.
| 값 | 결과 | 뜻 |
|---|---|---|
parsed_javascript_files | 7 | 파싱한 JS 파일 수 |
parse_failures | 0 | 파싱 실패(난독화·문법 문제 시 늘어남) |
| 그래프 노드 / 엣지 | 70 / 100 | 모듈·자산·패키지와 그 관계 |
| 엣지 종류 | imports 79, contains 16, exposes 5 | import 관계, 포함 관계, export 노출 |
--json 출력 크기 | 약 7.4MB | 증거 위치·해시까지 모두 포함 |
눈여겨볼 것은 마지막 줄이다. 48KB짜리 소스에서 7.4MB 결과가 나왔고, --token-count 옵션으로 재 보니 약 174만 토큰이었다. 관계 하나하나에 소스 위치, 파일 해시, 추출기 정보, 한계 설명이 붙기 때문이다. 이 양은 어떤 모델의 컨텍스트에도 한 번에 들어가지 않는다.
3단계: 결과를 필요한 필드만 남겨 읽는다
REA CLI에는 출력 범위를 줄이는 전역 옵션이 있다. 요약 통계와 Electron 경계 요약만 보려면 --filter-output에 키 경로를 쉼표로 넘긴다.
npx -y [email protected] analyze-javascript-application /abs/path/to/app \
--filter-output normalized_result.statistics,normalized_result.summary,normalized_result.limitations
| 옵션 | 용도 |
|---|---|
--filter-output <keys> | 지정한 키 경로만 출력(예: a.b,c[0,3]) |
--token-count | 출력 대신 출력의 토큰 수만 표시 |
--token-limit / --token-offset | 토큰 단위로 잘라 나눠 읽기 |
--format | toon, json, yaml, md, jsonl |
이미 저장한 out.json은 jq로 다시 자르면 재분석 없이 바로 읽힌다(7.4MB 파일에서 0.05초).
# 통계와 한계만
jq '.normalized_result | {statistics, limitations}' out.json
# 관계 종류별 개수 (실행 결과: contains 16, exposes 5, imports 79)
jq -c '[.normalized_result.graph.edges[].relation] | group_by(.) | map({(.[0]): length}) | add' out.json
limitations는 꼭 읽는다. 이번 실행에서는 "코드를 실행하지 않고 텍스트로만 파싱했다", "정적 import·엔드포인트 관계가 실제 실행을 증명하지 않는다", "동적 표현식이나 난독화된 경로는 풀리지 않을 수 있다" 같은 다섯 문장이 나왔다. REA의 결론은 이 한계 안에서만 유효하다.
4단계: Claude Code에 맡길 때의 요청 문장
에이전트는 MCP로 같은 도구를 호출하므로, 요청에 범위와 출력 형식을 함께 적어 주면 큰 결과를 통째로 읽으려다 컨텍스트를 낭비하는 일을 줄일 수 있다. 아래는 자기 Electron 앱의 빌드 산출물을 점검할 때 쓰는 요청 예시다.
dist/mac-arm64/MyApp.app/Contents/Resources/app.asar 는 우리 팀이 만든 앱의 빌드 결과물이다.
REA의 analyze-javascript-application 으로 정적 분석하되, 전체 그래프를 읽지 말고
summary, statistics, limitations 부터 확인해.
그다음 아래 항목을 표로 정리해 줘. 각 항목은 근거가 된 파일:줄을 붙이고,
근거가 없으면 "확인 불가"라고 써.
1) preload에서 contextBridge로 노출한 API 목록
2) renderer가 보내는 IPC 채널 중 main에 대응 handler가 없는 것
3) main handler 중 sender 검증 코드가 보이지 않는 것
코드를 실행하거나 앱을 띄우지는 마.
세 항목은 결과의 summary 필드와 맞춰 고른 것이다. 실제 출력에는 context_bridge_apis, exposed_api_members, ipc.main_handlers, ipc.unpaired_literal_renderer_transmissions, sender_validation_observations 같은 집계가 들어 있다. 이 값들은 Electron 보안 체크리스트의 "Validate the sender of all IPC messages"(17번), "Do not expose Electron APIs to untrusted web content"(20번)를 점검할 때 출발점이 된다. 집계가 0이 아닌 항목만 상세 그래프로 내려가 보게 하면 된다.
"코드를 실행하지 마"를 적는 이유도 있다. REA에는 정적 분석 외에 앱을 실제로 띄워 관찰하는 도구(capture-electron-scenario, capture-process 등)도 있고, 문서는 실행형 작업이 파일·계정·서비스에 영향을 줄 수 있다고 경고한다. 정적 분석으로 충분한 질문이면 범위를 명시해 둔다.
쓸모 있는 상황과 아닌 상황
| 상황 | 적합도 | 이유 |
|---|---|---|
| 배포된 asar에 개발용 모듈·소스맵이 섞였는지 확인 | 높음 | 모듈 목록과 소스맵 참조가 결과에 나온다 |
| Electron IPC·preload 노출 범위 자체 점검 | 높음 | 요약 집계로 먼저 걸러 볼 수 있다 |
| 두 빌드 버전의 구조 차이 확인 | 중간 | compare-application-versions가 있으나 입력 JSON을 따로 구성해야 한다 |
| 소스 코드가 있는 내 프로젝트의 일반 리팩터링 | 낮음 | 소스를 직접 읽는 편이 빠르고 정확하다 |
| 권한 없는 타사 앱의 기능 복제 | 불가 | REA 자체가 지원하지 않는 용도다 |
분석 결과를 에이전트가 읽는다는 점도 기억한다. README는 REA가 대상을 업로드하지 않지만 도구 결과는 에이전트의 모델 제공자 정책을 따른다고 적고 있다. 사내 비공개 앱이라면 결과에 비밀값이 섞이지 않았는지 먼저 확인하고, 에이전트가 읽어서는 안 되는 파일은 시크릿·.env가 AI 코딩 도구 컨텍스트에 들어가지 않게 막는 설정처럼 막아 둔다.
초보자가 자주 실수하는 포인트
- 공식 setup으로 설치해 관계없는 모든 프로젝트에 REA 도구가 노출되는 경우
- --scope project로 등록해 .mcp.json이 저장소에 커밋되는 경우
- 전체 결과 JSON을 에이전트에게 그대로 읽게 해 컨텍스트를 소진하는 경우
- limitations를 읽지 않고 정적 관계를 실제 실행 경로로 단정하는 경우
체크리스트
- 분석 대상이 본인 소유이거나 분석 권한이 있는가
- REA를 local scope로 버전 고정해 등록했는가
- 첫 실행은 CLI로 결과 모양과 크기를 확인했는가
- 요청 문장에 읽을 필드와 "실행 금지" 범위를 적었는가
- 결과마다 근거 파일:줄과 limitations를 함께 확인했는가
자주 묻는 질문
Hopper나 Ghidra 없이도 쓸 수 있나요?
JavaScript·Electron과 .NET 정적 분석은 별도 엔진 없이 동작합니다. 네이티브 바이너리의 의사코드·어셈블리를 보려면 Hopper, Ghidra, IDA 중 하나가 필요하고, 상용 도구는 정식 라이선스로 써야 합니다.
분석 대상 파일이 외부로 전송되나요?
README에 따르면 REA의 분석은 로컬에서 실행됩니다. 다만 에이전트가 받은 도구 결과는 해당 모델 제공자의 데이터 정책을 따르므로, 결과에 민감한 값이 포함되지 않았는지 확인해야 합니다.
버전은 어떻게 올리나요?
전역 설치나 공식 setup을 썼다면 rea update 또는 npx rea-agents@latest setup을 실행합니다. local scope로 등록했다면 이 명령들이 관리하지 않으므로 claude mcp remove --scope local rea 후 새 버전 번호로 다시 등록합니다.
참고 자료 · 검증 기준
- morluto/rea — README
- REA Docs — Installation and setup
- REA — DISCLAIMER (Responsible use)
- REA Docs — JavaScript application workflows
- Electron Docs — Security
위 자료와 내용을 대조한 날짜: . 도구·서비스 정책은 이후 바뀔 수 있으므로 적용 전 공식 문서를 다시 확인하세요.
이 글은 실제 실무 환경 테스트 및 검증된 기술 자료를 바탕으로 작성되었으며, 환경 변화에 따라 지속적으로 갱신됩니다.