GitHub Copilot 내부 아키텍처: 컨텍스트 주입 및 세션 저장소 분석
Man-in-the-Middle (MitM) 프록시와 VS Code 소스 코드 분석을 통해 GitHub Copilot의 네트워크 트래픽을 분석한 결과, 이 도구가 상태 유지(stateful) 시스템으로 진화하고 있음이 밝혀졌습니다. Copilot은 사용자 워크스페이스 데이터, 최근 편집 내용, 대화 기록 및 로컬 SQLite 데이터베이스를 결합하여 LLM을 위한 컨텍스트를 구성합니다.
모델 라우팅 및 탐색
GitHub Copilot은 특정 사용자 요청을 처리할 적절한 모델을 결정하기 위해 다단계 프로세스를 사용합니다. 이 프로세스는 확장 프로그램이 OAuth를 통해 인증을 수행하고 사용 가능한 모델을 탐색하는 부트스트랩 단계에서 시작됩니다.
모델 탐색
Copilot은 사용 가능한 기능을 식별하기 위해 두 가지 별도의 요청을 보냅니다:
/models에 대한 요청을 통해 사용 가능한 모델의 일반 목록을 가져옵니다./agents/swe/models에 대한 요청을 통해 에이전트 기반의 소프트웨어 엔지니어링 (SWE) 기능에 특히 적합한 모델을 식별합니다.
의도 기반 라우팅
사용자가 "Auto" 모드에서 메시지를 보내면, Copilot은 즉시 생성 모델을 호출하지 않습니다. 대신, /models/session/intent 엔드포인트로 프롬프트를 보냅니다. 시스템은 프롬프트를 code-gen, debugging, reasoning, tool-use와 같은 다양한 의도(intent)와 대조하여 점수를 매기고, 이 분류를 사용하여 작업을 수행하기에 가장 적합한 모델로 요청을 라우팅합니다.
컨텍스트 주입 및 개인정보 보호 위험
Copilot이 관련성 높은 제안을 제공하는 능력은 프롬프트에 주입되는 컨텍스트에 달려 있습니다. 그러나 이 메커니즘은 사용자가 현재 편집하고 있지 않은 파일의 민감한 데이터를 의도치 않게 유출할 수 있습니다.
"최근 편집 내용" 유출
Copilot은 최대 20개의 파일, 8개의 편집 요약, 그리고 각 변경 사항 주변의 3개 라인의 컨텍스트를 포함하는 슬라이딩 윈도우(sliding window) 방식을 구현합니다. 이 윈도우가 워크스페이스 전체의 최근 편집 내용을 추적하기 때문에, .env 파일에 저장된 비밀 정보가 전혀 관련 없는 파일(예: pyproject.toml 파일)에서 키 입력을 할 때 발생하는 프롬프트에 포함될 수 있습니다.
기본 비밀 정보 필터링 부족
VS Code 소스 코드 분석 결과, 컨텍스트를 작성하는 경로(write path)에서 기본적으로 데이터를 세척(scrubbing), 익명화(redaction) 또는 비밀 정보를 필터링하는 단계가 없음을 확인했습니다. Business 및 Enterprise 플랜의 경우 특정 파일을 제한하기 위한 "repository policies"가 존재하지만, 개인 플랜은 .env 파일을 특별하게 취급하는 기본 규칙이 없으며, 민감한 파일이 API로 전송되는 것을 방지하기 위한 .gitignore와의 통합도 이루어지지 않았습니다.
로컬 상태 및 Chronicle 도구
GitHub Copilot은 세션 간의 장기 기억을 제공하기 위해 Chronicle이라는 도구를 통해 로컬 상태를 유지합니다.
session-store.db
Copilot은 session-store.db라는 이름의 로컬 SQLite 데이터베이스를 사용하여 세션 요약, 저장소, 브랜치, 그리고 사용자 프롬프트와 어시스턴트 응답의 전체 기록을 저장합니다.
평문 저장 및 도구 액세스
session-store.db의 user_message 및 assistant_response 컬럼은 평문(plaintext)으로 저장됩니다. LLM은 session_store_sql이라는 도구를 통해 이 기록에 액세스할 수 있으며, 이를 통해 모델이 로컬 데이터베이스에 SQL 쿼리를 실행하여 이전 작업에 대한 질문(예: "이번 주에 내가 작업한 내용은 무엇인가요?")에 답변할 수 있습니다.
sessionStore.ts의 소스 코드 분석 결과, turn.user_message는 마스킹이나 정제 과정 없이 그대로 데이터베이스에 삽입됩니다.
분석의 기술적 구현
이러한 동작을 밝혀내기 위해, 연구자는 Electron 기반의 VS Code 애플리케이션과 GitHub 서버 간의 HTTPS 트래픽을 가로채기 위해 mitmproxy를 사용했습니다.
가로채기 설정
VS Code는 Electron(Chromium + Node.js)을 기반으로 구축되었기 때문에, 다음과 같은 설정을 통해 프록시를 통해 트래픽를 가로챌 수 있습니다:
- Http Proxy:
http://localhost:8080 - Http Proxy Strict SSL: 체크 해제 (mitmproxy CA 인증서를 허용하기 위해).
- Http: Proxy Support: 확장 프로그램에 프록시 지원을 강하도록
override로 설정.
대안적 관찰 방법
커뮤니티 논의에 따르면 Copilot의 내부 동작을 관찰하는 다른 방법들이 제안됩니다:
- eBPF: eBPF를 사용하면 암호화 전이나 복호화 후의 로우(raw) 평문 데이터를 네트워크 선에서 직접 캡취어할 수 있어, 인증서 핀닝(certificate pinning)이나 mTLS를 우별할 필요가 없습니다.
- Agent Debug Logs: VS Code에는 Copilot 대화 메뉴의 "show agent debug logs" 옵션을 통해 접근할 수 있는 내장 기능이이 있으며, 이는 도구 호출, 프롬프트, 모델 선택 로직을을 보여줍니다.
결론: 제품으로서의 컨텍스트
AI 코딩 도구 간의 차별점은 기반 모델의 원한한 힘이 아니라, 적절한 컨텍스트를 구성하는 "하네스(harness)" 시스템의 정밀함으로 이동하고 있습니다. 주요 엔지니어링 과제는 컨텍스트 밀도(프롬프트를 간결하고 캐시 친화적으로 유지하는 것)와 엄str칭한 개인정보 보호 경계 사이의 균형을 맞추는 것입니다. 이는 민감한 개발자 상태가 모델 API나 평문 로컬 저장소로 유출출될 수 없도록 보장하는 것입니다.
Sources
관련
- 프로젝트
- 프로젝트
- Dispatch
- 프로젝트
- Dispatch