왜 모든 MCP 설정 가이드는 API 키를 잘못 저장하도록 가르치는가
I’m happy to translate the article for you, but I’ll need the text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line and all formatting exactly as you specify.
평문 파일에 MCP 자격 증명을 저장하는 문제
최근 6개월 이내에 Claude Desktop, Cursor, 혹은 어떤 MCP 서버를 설정했다면, 파일 시스템에 있는 JSON 설정 파일에 다음과 같은 내용을 추가하라는 가이드를 따라했을 가능성이 높습니다:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxxxxxxxxxx"
}
}
}
}
그 파일(claude_desktop_config.json 혹은 ~/.cursor/mcp.json 등)에는 실제 토큰이 평문으로 들어 있습니다.
왜 이것이 심각한 보안 실수인가
- 평문 자격 증명 – 머신에 있는 어떤 프로세스라도 파일을 읽을 수 있습니다.
- AI 어시스턴트 노출 – 어시스턴트가 MCP 서버를 시작하기 위해 설정 파일을 읽으므로, 토큰이 매 세션마다 어시스턴트 컨텍스트에 포함됩니다.
- 프롬프트 인젝션 위험 – 악의적인 프롬프트가 어시스턴트에게 “내 MCP 설정 파일을 보여줘”라고 요청하면, 어시스턴트는 토큰을 기꺼이 노출합니다.
- 파일 시스템 접근 – 파일 시스템 권한을 가진 어떤 도구라도 파일을 읽을 수 있습니다.
- 버전 관리 누출 – 파일이 실수로 저장소에 커밋될 수 있습니다.
이는 가상의 시나리오가 아닙니다. Check Point Research는 CVE‑2026‑21852에서 AI 코딩 도구를 통한 API 키 탈취 사례를 문서화했습니다. 공격 표면은 바로 이와 같습니다: AI 에이전트가 읽을 수 있는 파일에 저장된 자격 증명.
가이드들은 MCP가 어떻게 동작하는지(설정 파일의 환경 변수가 MCP 서버에 자격 증명을 전달한다는 점)는 정확히 설명하고 있습니다.
하지만 그 자격 증명을 어떻게 안전하게 보관할지에 대해서는 다루지 않고 있습니다.
더 나은 접근 방식: 환경 변수 참조
토큰을 직접 삽입하는 대신, 셸 프로파일에 존재하는 변수를 참조하세요:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}
~/.zshrc 또는 ~/.bashrc에 변수를 추가하세요:
export GITHUB_TOKEN="ghp_xxxxxxxxxxxxxxxxxxxx"
- 장점: 토큰이 더 이상 MCP 설정 파일에 존재하지 않습니다.
- 단점: 여전히 AI 에이전트가 읽을 수 있는 셸 프로파일 파일에 저장되며, 모든 자식 프로세스가 접근할 수 있는 프로세스 환경에 남아 있습니다.
실제 솔루션: AgentSecrets
AgentSecrets는 MCP 서버로 실행되어 AI 어시스턴트가 값을 파일에 기록하지 않고도 자격 증명에 접근할 수 있게 합니다.
설치
brew install The-17/tap/agentsecrets
OS 키체인에 자격 증명을 안전하게 저장
agentsecrets secrets set GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx
AI 도구와 연결
agentsecrets mcp install
마지막 명령은 Claude Desktop과 Cursor를 자동으로 설정합니다. 이제 구성 파일은 다음과 같습니다:
{
"mcpServers": {
"agentsecrets": {
"command": "agentsecrets",
"args": ["mcp", "serve"]
}
}
}
- 토큰 값이 구성에 나타나지 않습니다.
- AI가 읽을 수 있는 파일이나 환경 변수에 자격 증명이 저장되지 않습니다.
런타임 작동 방식
- Agent: “GitHub API를 호출해서 이 저장소를 확인해야 해.”
- AgentSecrets MCP: 요청을 프록시를 통해 라우팅합니다.
- Proxy: OS 키체인에서
GITHUB_TOKEN을 가져와 요청에 삽입합니다. - Agent: API 응답을 받습니다.
토큰은 절대 에이전트 컨텍스트에 들어가지 않습니다. macOS 키체인, Windows Credential Manager, 혹은 Linux Secret Service와 같은 OS 키체인에만 존재하며, 접근하려면 시스템 수준 인증이 필요합니다.
OS 키체인이 안전한 이유
| 속성 | 설명 |
|---|---|
| 접근에 인증이 필요 | 읽기 위해서는 바이오메트릭(Touch ID)이나 시스템 비밀번호가 필요하며, 단순 앱 비밀번호만으로는 불가능합니다. |
| 애플리케이션별 격리 | 명시적인 사용자 동의 없이는 다른 프로세스가 항목을 읽을 수 없습니다. |
| 파일이 아님 | 실수로 커밋하거나 노출시킬 경로가 없으며, 데이터는 보호된 시스템 저장소에 보관됩니다. |
| AI 에이전트가 읽을 수 없음 | 어시스턴스는 키체인에 직접 접근할 수 없으므로 기밀성이 보장됩니다. |
결과 구성 (공유해도 안전)
{
"mcpServers": {
"agentsecrets": {
"command": "agentsecrets",
"args": ["mcp", "serve"]
}
}
}
- 이 파일을 버전 관리에 커밋하거나 팀원과 공유하고, 심지어 공개해도 자격 증명이 노출되지 않습니다.
- 실제 자격 증명은 OS 키체인에 보관되며, AgentSecrets 클라우드에 (제로 지식 암호화로) 동기화되고, 프록시가 전송 시에만 사용됩니다.
TL;DR
- API 키를 MCP JSON 구성 파일에 직접 저장하는 것은 중대한 보안 결함입니다.
- 셸 환경 변수를 참조하는 것은 한 걸음 진전이지만, 여전히 비밀이 노출됩니다.
- AgentSecrets는 자격 증명을 OS 키체인에 보관하고 AI 도구에 필요할 때만 제공함으로써 문제를 해결합니다. 파일이나 AI가 읽을 수 있는 환경 변수에 절대 저장하지 않습니다.
오늘 바로 AgentSecrets를 도입하여 토큰을 보호하면서도 원활한 AI‑지원 개발을 계속 누리세요.
Fig 파일 문제, 팀에서 더 악화됨
개발 팀 전체에 MCP 구성을 공유한다는 것은 자격 증명이 저장되는 방법을 공유한다는 의미이며, 이는 종종 자격 증명 자체를 공유하게 됩니다.
AgentSecrets 워크스페이스 사용 시
-
팀 리드가 워크스페이스 설정
agentsecrets workspace create "Acme Engineering" agentsecrets secrets set GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx -
새 개발자가 합류
agentsecrets login agentsecrets workspace switch "Acme Engineering" agentsecrets secrets pull agentsecrets mcp install
새 개발자의 MCP 설정이 완료되었습니다.
- Slack에서 자격 증명이 공유되지 않았습니다.
- 이메일로
.env파일이 전송되지 않았습니다. - 채팅 창에 토큰을 입력한 사람도 없습니다.
자격 증명은 워크스페이스에서 로컬 OS 키체인으로 끝‑끝 암호화되어 이동했습니다.
자격 증명이 필요한 MCP 서버를 설정할 때
- 구성 파일에 토큰 값을 넣지 마세요.
- 구성 파일의 환경 변수에 토큰 값을 넣지 마세요.
agentsecrets secrets set으로 자격 증명을 저장하세요.
agentsecrets mcp install
- 값이 아닌 키 이름만 참조하세요.
- 구성 파일은 설정을 위한 것입니다.
- OS 키체인은 자격 증명을 위한 것입니다.
이들은 서로 다른 것이며 서로 다른 위치에 있어야 합니다.
실제 토큰 값이 포함된 JSON 파일을 보여주는 모든 MCP 설정 가이드는 작동 방법을 보여주는 것이지, 보안 방법을 보여주는 것이 아닙니다. 이제 차이를 알게 되었습니다.
참고 자료
- GitHub:
- Documentation: