사용 중인 AI 코딩 어시스턴트가 비밀 정보를 유출하고 있습니다
May 12, 2026
AI 데스크톱 어시스턴트와 코딩 도구는 외부 서비스에 접속하기 위해 자격 증명이 필요하며, 그중 많은 도구가 사용자의 홈 디렉터리에서 예측 가능한 경로에 해당 자격 증명을 평문(plaintext) JSON 형태로 저장합니다. 본 연구는 14가지 인기 AI 도구 전반에서 자격 증명 저장이 어떻게 작동하는지, OS 키체인 통합이 있는 경우와 없는 경우를 다루고, 악성코드 기반 절도부터 원격 세션 하이재킹, MCP 서버를 통한 공급망(서플라이 체인) 침해에 이르기까지, 이러한 노출을 실제 위험으로 전환하는 8가지 공격 시나리오를 소개합니다.
Claude, Copilot, Cursor 등 AI 도구가 자격 증명을 평문(plaintext)으로 저장하는 방식과 이를 악용하는 공격 사례 8가지
문제
AI 데스크톱 애플리케이션은 외부 서비스에 인증해야 합니다. Claude Code는 OAuth 토큰이 필요합니다. GitHub Copilot은 GitHub 인증이 필요합니다. Continue.dev는 API 키가 필요합니다. MCP 서버는 Azure DevOps, Slack, 데이터베이스, 그리고 연결한 모든 다른 서비스에 대한 토큰이 필요합니다. 이 모든 자격 증명은 어디로 가나요? 대부분은 홈 디렉터리의 평문 JSON 파일로 들어갑니다. 이러한 파일은 널리 알려져 있거나 예측 가능한 위치에 있어, 시스템에 대한 읽기 권한만 있으면 찾기가 쉽습니다.
내가 확인한 내용
저는 Windows, macOS, Linux에서 14개의 인기 있는 AI 도구를 살펴보았습니다(블로그 끝의 참고자료 참조). 그중에서도 특히 눈에 띄었던 점은 다음과 같습니다.
Claude Code CLI
~/.claude/.credentials.json 에서 OAuth 액세스 토큰과 리프레시 토큰을 평문 JSON 형태로 저장합니다:
{
"claudeAi": {
"type": "oauth",
"access": "sk-ant-oat01-...",
"refresh": "sk-ant-ort01-...",
"expires": 1776098433694
}
}
Linux에서는 파일이 0600 권한(소유자만 읽기/쓰기)으로 생성됩니다. macOS에서는 자격 증명이 Keychain에 저장됩니다. 하지만 WSL에서는 Windows 쪽 파일이 마운트의 기본 0777 권한을 그대로 상속받아, Claude OAuth 토큰이 모든 사용자에게 읽히게 되어 시스템의 어떤 프로세스에서든 접근할 수 있습니다. 여기서 특히 위험한 것은 리프레시 토큰입니다. 수명이 길어서, 새로운 액세스 토큰을 무한정 생성할 수 있습니다. 공격자가 이를 획득하면, 명시적으로 해지하기 전까지 Claude 계정에 지속적으로 액세스할 수 있습니다.
MCP 서버 구성: 집계(aggregation) 문제
Model Context Protocol (MCP) 서버를 사용하면 AI 어시스턴트가 외부 도구에 연결할 수 있습니다. 각 연결에는 인증이 필요하며, 이러한 토큰은 보통 다음과 같은 단일 설정 파일에 저장됩니다:
{
"mcpServers": {
"github": { "env": { "GITHUB_TOKEN": "ghp_realToken..." } },
"azure": { "env": { "ADO_MCP_AUTH_TOKEN": "eyJ0eX..." } },
"slack": { "env": { "SLACK_BOT_TOKEN": "xoxb-..." } },
"database": { "env": { "DB_PASSWORD": "prod_password" } }
}
}
한 파일에 여러 서비스가 들어있습니다. 한 번의 읽기 작업만으로도 모두가 손상될 수 있습니다. Trend Micro는 19,402개의 MCP 서버 구현 중 48%가 평문 자격 증명 저장을 권장한다
Continue.dev: 평문(plaintext)으로 저장된 API 키
Continue.dev는 설정된 모든 API 키를 ~/.continue/config.json에 직접 저장합니다:
{
"models": [{
"provider": "anthropic",
"apiKey": "sk-ant-api03-YOUR-ACTUAL-KEY"
}]
}
커뮤니티에서는 이것을 문제로 인식하고 있습니다(GitHub 이슈 #1729). 환경 변수 치환이 지원되지만 (${VAR_NAME}) 기본 동작은 아닙니다.
Cline: 자격 증명이 클라우드와 동기화됨
Cline의 MCP 설정은 VS Code의 globalStorage 안에 암호화되지 않은 JSON 파일로 저장됩니다. 문제는 VS Code Settings Sync가 이 파일을 자동으로 GitHub에 업로드한다는 점입니다. Settings Sync를 사용하도록 설정해 두었다면, MCP 자격 증명이 GitHub의 클라우드에 그대로 놓이게 됩니다.
VS Code SecretStorage의 혼동
GitHub Copilot, Cline, 그리고 기타 VS Code 확장 기능은 SecretStorage API를 사용하며, 이 API는 SQLite 데이터베이스에 비밀 정보를 암호화합니다 (state.vscdb) 그리고 AES-128-CBC로 암호화합니다. 안전해 보이지만, 다음을 깨닫기 전까지는:
- VS Code 확장 기능은 샌드박싱 없이 실행됩니다
- 암호화 키는 OS 키체인에 저장되어 있으며, 어떤 사용자 수준 프로세스도 접근할 수 있습니다
- 악의적인 어떤 확장 기능이든 다른 확장 기능의 비밀 정보를 읽을 수 있습니다
- 확장(Extension) 식별 시스템은 스푸핑(Spoofing)에 취약합니다
암호화는 오프라인 디스크 액세스에 대해서는 방어를 제공하지만, 동일한 사용자로 실행되는 어떤 프로세스에 대해서도 방어하지는 못합니다.
공격 표면(Attack surface) 예시
AI 자격 증명 노출로 인해 가능해지는 실제 공격 시나리오 8가지를 확인했으며, 이를 짚고자 합니다.
1. 악성코드를 통한 자격 증명 탈취
파일 경로는 설치 환경 전반에서 예측 가능하고 일관적입니다:
~/.claude/.credentials.json
~/.continue/config.json
~/.aws/credentials
~/.config/gcloud/application_default_credentials.json
~/Library/Application Support/Claude/claude_desktop_config.json
~/.claude.json
인포스틸러(Infostealer) 악성코드는 이미 브라우저 쿠키, SSH 키, 클라우드 자격 증명을 노립니다. 대상 목록에 AI 도구 경로 몇 가지를 추가하는 것은 사소한 일입니다. 권한 상승이 필요하지 않으며, 일반 사용자 수준의 파일 읽기만으로도 충분합니다.
악성코드 감염 한 번으로 Claude OAuth 토큰, Continue.dev의 모든 API 키, 모든 MCP 서버 토큰, 그리고 AWS 자격 증명을 얻을 수 있습니다. 이러한 경로는 모든 도구의 모든 설치에서 동일합니다.
위험도: CRITICAL. 발생 가능성이 높고 영향도 큽니다.
2. Claude Code 원격 제어 세션 가로채기
이것은 여러분을 겁나게 해야 하는 시나리오입니다. Claude Code에는 Remote Control 기능(claude remote-control)이 있어 사용자가 claude.ai/code를 통해 휴대폰, 태블릿 또는 브라우저에서 로컬 Claude Code 세션을 제어할 수 있습니다. 모든 코드 실행은 로컬 컴퓨터에서만 이루어집니다. 원격 기기는 단지 제어 인터페이스일 뿐입니다.
문제는 이것입니다: 원격 연결은 재인증을 요구하지 않습니다. 세션이 활성화되면 세션 URL을 아는 누구든지 지시를 보낼 수 있습니다. 그리고 그 모든 지시는 개발자의 기기에서 로컬로 실행됩니다.
이제 여기에 --dangerously-skip-permissions.
이 플래그는 모든 대화형 권한 프롬프트를 비활성화합니다. 파일 쓰기, 셸 명령, 네트워크 요청, MCP 도구 호출 등 모든 작업이 사용자에게 묻지 않고 자동으로 실행됩니다. 이는 격리된 CI/CD 컨테이너용으로 의도되었지만, 때로는 편의를 위해 작업 스테이션에서 사용하는 경우도 있습니다. 또한 settings.json에서 "defaultMode": "bypassPermissions" 형태로 영구 기본값으로 설정할 수도 있습니다.
공격 체인:
- 공격자가 다음 위치에서 OAuth 토큰을 탈취합니다:
~/.claude/.credentials.json(악성코드, SSRF 또는 파일 읽기 취약점 등을 통해) - 토큰은 휴대 가능하므로 어떤 컴퓨터에서도 작동합니다
- 피해자가 활성화된 원격 제어 세션을 가지고 있다면, 공격자가 연결해 장악합니다
- 피해자가
--dangerously-skip-permissions옵션으로 실행하면, 공격자는 이제 피해자 사용자로서 제한 없는 셸(쉘) 액세스 권한:- 시스템의 어떤 파일이든 읽고/쓰기가 가능합니다
- 임의의 명령 실행 (
curl,ssh,docker, 패키지 관리자 등) - 백도어 설치, 데이터 유출, 다른 기기로 피벗
- SSH 키, 클라우드 자격 증명, 그리고 시스템의 그 밖의 모든 비밀에 액세스
- git 리포지토리, CI/CD 파이프라인, 배포 구성 수정
설령 --dangerously-skip-permissions 을 설정하지 않더라도, acceptEdits 모드에서 Claude Code는 파일 편집과 일반적인 파일시스템 명령을 자동으로 승인합니다. 이 또한 여전히 위험할 수 있습니다. 권한 모델은 세션을 제어하는 악의적인 행위를 막기 위한 것이 아니라, 실수로 인한 작업을 방지하기 위해 설계되었습니다.
위험: CRITICAL (--dangerously-skip-permissions), HIGH (기본 권한).
3. Claude OAuth 토큰을 통한 측면 이동
공격자가 ~/.claude/.credentials.json 에서 Claude OAuth 리프레시 토큰을 획득하면 다음을 수행할 수 있습니다:
- 원격으로 새 액세스 토큰을 생성합니다(액세스 토큰은 약 60분 후 만료되지만, 리프레시 토큰은 장기간 유효합니다).
- 피해자의 Claude 대화 및 워크스페이스 파일에 액세스합니다.
- 피해자가 구성한 모든 MCP 서버를 사용하세요 (AI 어시스턴트를 프록시로 활용해 GitHub 레포지토리, Azure DevOps 프로젝트, Slack 워크스페이스, 데이터베이스에 접근)
토큰은 이동(휴대) 가능합니다. 자격 증명 파일을 다른 머신에 복사하면 Claude Code가 이를 사용합니다. Anthropic은 리프레시 토큰 로테이션을 구현하므로, 탈취한 토큰을 사용하면 결국 원본 토큰이 무효화될 수 있습니다. 다만 초기 사용은 성공하며, 로테이션이 적용되기 전에 공격자가 액세스 권한을 얻을 수 있습니다.
위험도: 높음. 중간~높은 가능성, 높은 영향.
4. MCP 토큰 집계: 측면 이동
단일 MCP 구성 파일이 여러 외부 서비스에 대한 토큰을 집계합니다. 예를 들어, 한 파일로 다음과 같은 결과를 얻을 수 있습니다:
GITHUB_PERSONAL_ACCESS_TOKEN→ 코드 저장소, PR, CI/CDADO_MCP_AUTH_TOKEN→ Azure DevOps 프로젝트SLACK_BOT_TOKEN→ 내부 Slack 워크스페이스- 데이터베이스 비밀번호 → 운영 데이터
JIRA_API_TOKEN→ 프로젝트 관리, 내부 티켓
하나의 채널을 손상시키더라도 일부 자격 증명만 노출되는 분산 자격 증명 저장 방식과 달리, MCP의 집계(aggregation) 패턴에서는 단일 파일이 유출되면 연쇄적으로 연결된 모든 서비스가 손상됩니다.
위험: CRITICAL. 발생 가능성 높음, 영향 큼.
5. 악성 VS Code 확장 프로그램: 자격 증명 유출
VS Code 확장 프로그램은 샌드박싱 없이 실행됩니다. 모든 확장 프로그램이 동일한 프로세스 권한을 공유합니다. 악성 또는 침해된 확장 프로그램은 다음을 수행할 수 있습니다:
- 를 통해
state.vscdbSQLite 데이터베이스에 직접 액세스 - OS 키체인에서 암호화 키를 가져옵니다(모든 사용자 수준 프로세스에서 접근 가능)
- 모든 확장 프로그램의 비밀(시크릿) 해독: Copilot 토큰, Cline API 키, MCP 자격 증명
Cline의 cline_mcp_settings.json 는 해독할 필요도 없습니다. VS Code의 globalStorage에 암호화되지 않은 평문으로 저장되어 있으며, Settings Sync를 통해 클라우드에 동기화됩니다.
확장을 식별하는 package.json의 publisher 및 name 필드는 스푸핑(위장)에 취약하므로, 정상적인 확장 프로그램을 가장(사칭)하는 것이 가능합니다.
위험도: 높음. 발생 가능성 중간, 영향 큼.
6. WSL 권한 에스컬레이션
WSL을 사용하는 개발자는 양쪽에서 공격을 받습니다. Windows에 설치된 AI 도구는 C:\Users\<you>\ 아래에 자격 증명을 저장하는데, 이 경로는 WSL에서 /mnt/c/Users/<you>/ 로 마운트되며 0777 권한이 기본값으로 적용됩니다. Windows 쪽에서는 NTFS로 보호되는 동일한 자격 증명 파일이 Linux 쪽에서는 모든 사용자가 읽을 수 있음(world-readable) 이 됩니다.
다중 사용자 WSL 환경이나 손상된 컨테이너에서는 이것이 악용하기 쉽습니다. WSL 시스템에서 실행되는 어떤 프로세스든 Windows 쪽에 저장된 Claude OAuth 토큰, MCP 설정(MCP configs) 등 을 읽을 수 있습니다.
위험도: 높음(HIGH) — WSL 사용자에게 해당됩니다. 발생 가능성은 높고, 영향은 중간~높음입니다.
7. .mcp.json 을 git에 커밋: 자격 증명 탈취(credential exfiltration)
리포지토리 루트에 있는 Claude Code의 .mcp.json 는 팀이 MCP 서버 구성을 공유할 수 있도록 버전 관리되도록 설계되어 있습니다. 개발자가 env var 참조 대신 인라인 토큰을 포함하면:
- 토큰이 git 기록에 표시됩니다
- 삭제하더라도
git log -p .mcp.json로 확인할 수 있습니다 - 자동화된 스캐너(TruffleHog, GitLeaks 등)가 GitHub/GitLab 전반에서 대규모로 이를 찾아낼 수 있습니다
Anthropic과 GitHub의 시크릿 스캐닝 파트너십은 일부 노출된 API 키를 포착하지만, 다른 서비스(Azure DevOps, Slack, 데이터베이스)를 위한 MCP 구성 토큰은 not 자동화 스캐닝으로 커버되지 않습니다. JSON env 블록에 포함된 ADO_MCP_AUTH_TOKEN 또는 SLACK_BOT_TOKEN 에 대한 GitHub 시크릿 스캐너 패턴은 없습니다.
위험 수준: MEDIUM. 발생 가능성은 중간, 영향은 중간~높음.
8. MCP 서버를 통한 공급망 공격
MCP 서버는 종종 npm 패키지입니다. 공급망 위험은 어떤 npm 의존성과도 동일하지만, 중요한 차이점이 있습니다. MCP 서버는 시작 시 자격 증명을 받습니다.
- npm의 인기 MCP 서버 패키지가 손상됨(또는 타이포스쿼트가 배포됨)
- 사용자는 이를 자신의
claude_desktop_config.json에서 실제 토큰으로env블록에 구성합니다. - MCP 서버 프로세스는 토큰을 포함해 해당 프로세스에 전달된 모든 환경 변수에 접근할 수 있습니다.
- 유출된 서버가 손상된 상태에서 토큰을 공격자의 인프라로 유출합니다.
적절한 OAuth 2.1 audience 검증(RFC 8707)이 없으면, 악의적인 MCP 서버가 액세스 토큰을 수신한 뒤 다른 서비스에 대해 이를 재생(리플레이)할 수도 있습니다(토큰 패스스루 공격).
48%의 평문(plaintext) 자격 증명 통계는 모든 MCP 서버 설정의 거의 절반이 실행 시 서버 프로세스에 자격 증명을 직접 전달한다는 의미입니다. 만약 해당 서버 프로세스가 손상되면, 이를 설치한 모든 사용자도 함께 손상됩니다.
위험도: MEDIUM. 발생 가능성은 낮음~중간, 영향은 큼.
보너스: CI/CD 토큰 탈취
claude setup-token 명령은 1년 OAuth 토큰 (CLAUDE_CODE_OAUTH_TOKEN)을 CI/CD 파이프라인용으로 생성합니다. 이로 인해 고유한 위험이 발생합니다:
- 토큰은 최대 어떤 머신에서든 최대 1년간 작동합니다
- CI/CD 시스템은 종종 비밀(시크릿) 관리가 취약하고 작업(job) 간 격리가 제한적입니다.
- 빌드 로그가 실수로 환경 변수 값들을 노출할 수 있습니다.
- 손상된 CI/CD 러너는 파이프라인이 실행되는 어떤 권한이든 그대로 Claude에 대한 장기간 액세스를 제공합니다
CI/CD 파이프라인이 --dangerously-skip-permissions (자동화를 위해 많은 경우 이렇게 설정합니다)로 Claude Code를 실행한다면, 탈취된 CLAUDE_CODE_OAUTH_TOKEN 는 토큰이 사용되는 어떤 머신에서도 제한 없는 셸 실행 권한을 부여합니다.
위험도: 높음. 가능성은 중간, 영향은 큼.
변경해야 할 사항
사용자 대상(현재 바로)
- AIHound를 실행하세요. 내 컴퓨터에서 노출된 항목이 무엇인지 확인하세요.
- 권한을 수정하세요:
chmod 600인증 파일에 적용합니다. - 실제 자격 증명 또는 네트워크 액세스가 가능한 시스템에서는
**--dangerously-skip-permissions**을 절대 사용하지 마세요. 정말 필요하다면, 마운트된 시크릿이 없는 격리된 컨테이너 안에서만 사용하세요. - 인라인 토큰 대신 MCP 설정에서 환경 변수 참조를 사용하세요:
"env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }
- 월드(모든 사용자)가 읽을 수 있었던 파일이나 git 기록에 포함되어 있던 토큰은 교체(rotate)하세요.
- VS Code 설정 동기화( Settings Sync )를 비활성화하세요 MCP 서버와 함께 Cline을 사용하는 경우.
- Treat
**CLAUDE_CODE_OAUTH_TOKEN**root 비밀번호처럼 취급하세요. 정기적으로 교체하고, 빌드 로그에 절대 넣지 말며, CI/CD 권한은 꼭 필요한 최소 수준으로만 범위를 지정하세요. - Add
**.mcp.json**to**.gitignore**파일에 인라인 시크릿이 포함되어 있다면.
도구를 만드는 사람들을 위한 안내
- OS 키체인을 사용하세요. macOS Keychain, Windows Credential Manager, 그리고 Linux libsecret이 바로 이런 목적을 위해 존재합니다. 자격 증명을 평문 JSON으로 저장하지 마세요.
- **0600** 권한으로 파일을 생성하세요
**0600**권한.0644또는0777을(를) 사용하지 마세요. - 사용자에게 경고 MCP 구성에서 인라인 비밀(시크릿)을 감지하면 경고하세요.
- 자격 증명을 클라우드와 동기화하지 마세요 설정 동기화 메커니즘을 통해서.
- OAuth 2.1을 적용하세요 원격 MCP 서버에 대해 적절한 토큰 audience 검증을 수행합니다.
- 원격 제어 세션에는 재인증을 요구하세요. 세션 URL은 임의 코드 실행을 위한 베어러 토큰이 되어서는 안 됩니다.
- MCP 서버 패키지를 감사 설치를 허용하기 전에 수행하고, 서버 허용 목록(allowlisting)을 지원합니다.
생태계를 위해
OWASP MCP Top 10에는 "Token Mismanagement and Secret Exposure"가 MCP01-2025로 나와 있습니다. GitHub에서 API 키를 자동으로 탐지하기 위한 Anthropic과 GitHub의 파트너십은 좋은 출발이지만, 공개 저장소에서의 Anthropic 키만 다룹니다. Azure DevOps, Slack, 데이터베이스 및 기타 서비스에 대한 MCP 토큰에는 이에 상응하는 보호가 없습니다.
필요한 것은:
- 시크릿 스캐닝 으로, API 키 형식뿐 아니라 MCP 구성 패턴까지 포괄해야 합니다.
- 자격 증명 도우미 — MCP용( git 자격 증명 도우미와 유사)으로, 실행 시 보안 저장소에서 토큰을 가져옵니다
- OS 키체인 통합을 필수로 기본값으로 설정
- VS Code 확장 프로그램을 샌드박싱
- 토큰 범위 기반 원격 제어 - 원격 세션은 로컬 세션의 전체 권한을 그대로 상속하지 말고, 자체 인증을 요구해야 합니다
핵심 요약
AI 도구 생태계는 기능을 빠르게 출시하느라 바빴고, 자격 증명 보안은 그저 사소한 뒷전으로 남겨두었습니다. 거의 절반의 MCP 서버가 자격 증명을 일반 텍스트(plaintext)로 저장합니다. AI 어시스턴트는 OAuth 토큰을 디스크의 JSON 파일에 보관합니다. 원격 제어(Remote Control) 기능은 이러한 토큰을 원격 코드 실행(Remote Code Execution)으로 전환할 수 있습니다. 그리고 --dangerously-skip-permissions 는 탈취된 자격 증명을 다른 사람의 컴퓨터에서 전체 셸(shell) 액세스로 바꿉니다. 연결하는 도구가 많을수록 위험은 더 커집니다. 많은 AI 자격 증명이 안전하게 저장되지 않으므로, 자격 증명 저장에 대한 모범 사례를 반드시 적용하세요. AIHound 같은 도구를 사용하면 시스템에서 이러한 일반 텍스트 자격 증명을 찾는 데 도움이 될 수 있습니다.
참고용: AI 데스크톱 애플리케이션의 자격 증명 저장 위치
이 참고 자료는 가장 인기 있는 AI 데스크톱 애플리케이션, 코딩 보조 도구, CLI 도구 일부의 모든 자격 증명 위치를 정리해 둔 것입니다.
Claude Code CLI
개발사: Anthropic 인증 방법: OAuth 2.0 (Claude.ai 구독) 또는 API 키
자격 증명 파일
Platform | Path | Format | Encryption | Contents |
|---|---|---|---|---|
|
Linux |
|
JSON
|
Plaintext (mode 0600) |
OAuth access/refresh tokens, multi-provider auth |
|
macOS |
Keychain: |
Keychain |
OS Keychain (encrypted) |
OAuth access/refresh tokens |
|
Windows |
|
JSON
|
Plaintext (NTFS ACLs) |
OAuth access/refresh tokens |
|
WSL |
Both Linux path AND |
JSON
|
Plaintext (often 0777 via mount) |
Same as above |
자격 증명 파일 구조
{
"claudeAi": {
"type": "oauth",
"access": "sk-ant-oat01-...",
"refresh": "sk-ant-ort01-...",
"expires": 1776098433694
}
}
각 OAuth 연결은 고유한 항목을 저장합니다. 이 파일에는 사용자가 구성한 내용에 따라 Claude.ai, Claude API, Azure Auth, Bedrock Auth, Vertex Auth에 대한 자격 증명이 포함됩니다.
핵심 발견: WSL에서는 Windows 쪽 자격 증명 파일이 마운트의 기본 권한을 상속받습니다 (0777). 이로 인해 누구나 읽을 수 있게 되어, CRITICAL한 위험이 됩니다. 이는 파일이 0600 권한으로 생성되는 네이티브 Linux에는 존재하지 않는 문제입니다.
잠재적인 비밀 정보가 포함될 수 있는 설정 파일
Path | Contents |
|---|---|
|
|
Global MCP server configurations (may contain inline tokens) |
|
|
Project-scoped MCP server configs |
|
|
User preferences and permissions |
인증 우선순위 순서
Claude Code는 아래 순서대로 자격 증명을 확인합니다(첫 번째로 일치하는 항목이 적용됨):
- 클라우드 제공업체 환경 변수 (
CLAUDE_CODE_USE_BEDROCK, CLAUDE_CODE_USE_VERTEX,CLAUDE_CODE_USE_FOUNDRY) ANTHROPIC_AUTH_TOKEN환경 변수ANTHROPIC_API_KEY환경 변수apiKeyHelper스크립트 출력(동적/순환 자격 증명을 위한 것)CLAUDE_CODE_OAUTH_TOKEN환경 변수(수명이 긴,claude setup-token에서 가져옴)- 다음에서 가져온 OAuth 자격 증명:
~/.claude/.credentials.json또는 Keychain
알려진 버그
문서화된 버그(GitHub 이슈 #36779)에 따르면 OAuth 자격 증명이 macOS Keychain에 제대로 저장되지 않습니다. 기본 인증 토큰이 누락되어 있는 동안 mcpOAuth 필드만 저장되며, 그 결과 새 세션에서는 재인증이 강제로 필요합니다.
Claude Desktop
개발자: Anthropic 인증 방법: Claude.ai 세션 (macOS에서 Keychain으로 백업)
Platform | Paths |
|---|---|
|
macOS |
|
|
Windows |
|
|
Linux |
|
Auth method: Claude.ai session (Keychain-backed on macOS)
설정 파일
Platform | Path | Format | Encryption |
|---|---|---|---|
|
macOS |
|
JSON |
Plaintext (often 0644) |
|
Windows |
|
JSON
|
Plaintext |
|
Linux |
|
JSON
|
Plaintext |
MSIX 가상화 문제(Windows)
Windows에서는 MSIX 설치 프로그램이 파일 시스템 가상화를 생성합니다. "Edit Config" 버튼을 누르면 %APPDATA%\Claude\claude_desktop_config.json 가 열리지만, 애플리케이션은 실제로 MSIX 컨테이너 내부의 가상화된 경로에서 읽을 수 있습니다. 즉:
- 사용자가 잘못된 파일을 편집할 수 있습니다
- MCP 서버 구성은 아무런 경고 없이 무시됩니다
- 오류 메시지가 문제를 나타내지 않습니다
Pre-MSIX 설치는 기존 규정이 적용되어 유예되며, 실제 AppData 경로에서 읽습니다.
구성(config)에는 무엇이 들어 있나요?
구성 파일에는 주로 MCP 서버 정의가 포함됩니다:
{
"mcpServers": {
"azure-devops": {
"command": "npx",
"args": ["-y", "@anthropic/azure-devops-mcp"],
"env": {
"ADO_MCP_AUTH_TOKEN": "actual-token-here"
}
}
}
}
env 블록에는 외부 서비스용 평문 토큰 이 자주 포함됩니다.
GitHub Copilot
개발자: GitHub / Microsoft 인증 방법: GitHub OAuth
자격 증명 저장소
Platform | Location | Format | Encryption |
|---|---|---|---|
|
macOS |
Keychain: |
Keychain |
OS Keychain |
|
Windows |
Credential Manager |
Credential Manager |
DPAPI |
|
Linux (with libsecret) |
GNOME Keyring / KWallet |
libsecret |
OS-level |
|
Linux (no libsecret) |
|
JSON |
Plaintext (fallback) |
VS Code 확장 프로그램 저장소
Platform | Path |
|---|---|
|
Linux |
|
|
macOS |
|
|
Windows |
|
state.vscdb 파일은 Electron의 safeStorage API(AES-128-CBC)로 암호화된 SQLite 데이터베이스입니다. 하지만 보안 연구에 따르면 이는 악의적인 VS Code 확장 프로그램에 취약할 수 있습니다. 샌드박싱이 부족하기 때문에 어떤 확장 프로그램이든 다른 확장 프로그램의 비밀(시크릿)에 접근할 수 있습니다.
암호화 키는 OS 키체인에 저장됩니다(Code Safe Storage / macOS), 사용자 권한이 있는 모든 프로세스가 접근할 수 있습니다.
토큰 유형
Prefix | Type | Supported |
|---|---|---|
|
|
OAuth token (default via |
Yes |
|
|
Fine-grained PAT (needs "Copilot Requests" permission) |
Yes |
|
|
GitHub App user-to-server token |
Yes (env var only) |
|
ghp_ |
Classic PAT
|
Not supported |
GitHub CLI 인증( Copilot에서도 사용됨 )
Platform | Path | Format |
|---|---|---|
|
Linux |
|
YAML |
|
macOS |
|
YAML |
|
Windows |
|
YAML |
Cursor IDE
개발자: Anysphere 인증 방법: Cursor 계정 + 선택적 API 키
저장 위치
Platform | Paths |
|---|---|
|
macOS |
|
|
Windows |
|
|
Linux |
|
MCP 구성
~/.cursor/mcp.json, 이는 mcpServers 와 동일한 JSON 구조를 Claude Desktop과 공유합니다. 인라인 인증 토큰이 포함될 수 있습니다.
알려진 이슈
Cursor는 누구나 읽을 수 있는 권한으로 대화 기록을 저장합니다. 사용자가 채팅 인터페이스에 토큰을 붙여넣으면 이러한 로그에 자격 증명이 포함될 수 있습니다.
Continue.dev
개발자: Continue (오픈 소스) 인증 방법: 공급자별 직접 API 키
구성 파일
Platform | Path | Format | Encryption |
|---|---|---|---|
|
All |
|
JSON
|
Plaintext |
|
All |
|
YAML
|
Plaintext |
자격 증명 형식
{
"models": [
{
"title": "Claude 3.5 Sonnet",
"provider": "anthropic",
"model": "claude-3-5-sonnet-20241022",
"apiKey": "sk-ant-api03-ACTUAL-KEY-HERE"
}
]
}
모든 API 키는 사용자 루트에 평문으로 저장됩니다. 이는 Continue.dev 커뮤니티에서 보안 우려로 인정하고 있습니다(GitHub 이슈 #1729).
대응 방안
Continue.dev는 환경 변수 치환을 지원합니다:
"apiKey": "${CONTINUE_ANTHROPIC_API_KEY}"
프로젝트 루트에 있는 .env를 통해 지정한 사용자 정의 위치를 확인합니다. 다만 envFiles. However, the 기본 동작은 평문(plaintext)이며, env 변수가 구성되지 않은 경우에 해당합니다.
Cline (VS Code 확장 프로그램)
개발자: Saoud Rizwan 확장 프로그램 ID: saoudrizwan.claude-dev
MCP 설정(평문(plaintext))
Platform | Path |
|---|---|
|
macOS |
|
|
Windows |
|
|
Linux |
|
중요: 이 파일들은 평문(plaintext) JSON 이며 VS Code 설정 동기화(Settings Sync)를 통해 클라우드로 자동 동기화됩니다. 이는 동기화가 활성화되어 있으면 API 키와 MCP 자격 증명이 GitHub에 업로드된다는 뜻입니다.
API 키 저장
Cline은 VS Code의 SecretStorage API를 통해 API 키를 저장합니다( Copilot에서 사용하는 것과 동일한 AES-128-CBC로 암호화된 state.vscdb ). 동일한 악성 확장 프로그램 취약점의 영향을 받습니다.
Windsurf / Codeium
개발자: Codeium 인증 방법: Codeium 계정
저장 위치
Platform | Path |
|---|---|
|
All |
|
이 디렉터리 안에서 config.json, auth.json, credentials.json 를 찾아보세요.
MCP 구성
~/.codeium/windsurf/mcp_config.json 에서 동일한 mcpServers 구조를 사용하세요.
자격 증명(credential) 세부 정보는 공개적으로 잘 문서화되어 있지 않습니다. 많은 경우 인증은 로컬 토큰 저장소가 아니라 Codeium의 중앙 집중형 백엔드를 통해 진행되는 것으로 보입니다.
ChatGPT Desktop
개발자: OpenAI 인증 방법: OpenAI 계정 세션
저장 위치
Platform | Path | Encryption |
|---|---|---|
|
macOS |
|
Keychain for session |
|
macOS |
|
Keychain for session |
|
Windows |
|
Credential Manager |
|
Windows |
|
Credential Manager |
ChatGPT Desktop은 주로 세션 토큰에 운영체제의 인증 정보 저장소( macOS의 Keychain, Windows의 Credential Manager )를 사용합니다. 앱 데이터 디렉터리에 있는 JSON 구성 파일에도 세션 데이터가 포함될 수 있습니다.
Amazon Q Developer / AWS
개발자: Amazon Web Services 인증 방법: IAM Identity Center / AWS Builder ID / IAM 자격 증명
자격 증명 파일
Path | Format | Contents |
|---|---|---|
|
|
INI
|
Plaintext access key ID, secret access key, session token (per profile) |
|
|
INI |
Region, output format, SSO configuration |
|
|
JSON |
Plaintext SSO access tokens (cached) |
자격 증명 파일 구조
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
aws_session_token = FwoGZXIvYXdzEBY...
참고
- Amazon Q 자체는 로컬 파일 저장소가 아니라 IAM Identity Center 또는 Builder ID를 통해 인증합니다.
- 기본 SSO 세션 기간은 90일입니다(2024년 4월 이후에 생성된 설정의 경우).
- 에 있는 정적 자격 증명
~/.aws/credentials이 주요 위험 요소입니다. 대신 SSO/IAM Identity Center를 사용하는 것을 고려하세요
Google Gemini CLI / GCloud
개발자: Google 인증 방법: Google 계정 OAuth, API 키 또는 서비스 계정
API 키 저장
Location | Format | Contents |
|---|---|---|
|
|
Environment variable |
Gemini API key |
|
|
Environment variable |
Google API key |
|
|
Dotenv |
API keys |
|
|
Dotenv |
API keys |
애플리케이션 기본 자격 증명 (ADC)
Platform | Path | Format |
|---|---|---|
|
Linux |
|
JSON |
|
macOS |
|
JSON |
|
macOS (alt) |
|
JSON |
|
Windows |
|
JSON |
ADC 파일에는 client_secret, refresh_token, 그리고 잠재적으로 private_key (서비스 계정용)가 포함될 수 있으며, 이를 plaintext JSON 형태로 저장합니다.
인증 방법
Method | How | Local Storage |
|---|---|---|
|
Sign in with Google |
|
Cached locally for future sessions |
|
Gemini API Key |
|
Environment or |
|
Service Account |
|
JSON key file on disk |
|
ADC via gcloud |
|
|
|
Cloud Shell |
Automatic (metadata server) |
No local storage |
OpenClaw
개발자: OpenClaw (오픈 소스) 인증 방법: 공급업체별 OAuth 2.0, API 키, 채널별 토큰
개요
OpenClaw는 로컬 우선(Local-first) AI 에이전트 플랫폼으로, 20개 이상의 메시징 채널(WhatsApp, Telegram, Slack, Discord)에 연결하고 로컬 머신에서 도구를 실행합니다. 또한 LLM 제공업체와 메시징 채널 모두에 대한 자격 증명을 저장합니다.
자격 증명 파일
Path | Format | Encryption | Contents |
|---|---|---|---|
|
|
JSON
|
Plaintext (0600) |
OAuth access/refresh tokens + API keys per LLM provider |
|
|
JSON
|
Plaintext |
WhatsApp Baileys auth state |
|
|
JSON
|
Plaintext |
Legacy OAuth tokens (migration file) |
|
|
JSON |
Plaintext |
Channel pairing allowlists |
|
|
JSON
|
Plaintext |
Optional secrets payload for SecretRef resolution |
|
|
JSON5
|
Plaintext |
Main config with gateway auth token, channel tokens, agent API keys |
|
|
Dotenv
|
Plaintext |
Environment variable overrides (may contain API keys) |
인증 프로필 구조
각 에이전트에는 자체 auth-profiles.json 이 있으며, 제공업체 자격 증명이 포함되어 있습니다:
{
"anthropic": {
"accessToken": "sk-ant-...",
"refreshToken": "sk-ant-ort01-...",
"expiresAt": 1776098433694
},
"openai": {
"apiKey": "sk-proj-..."
}
}
모든 토큰은 기본적으로 plaintext JSON 에 저장됩니다. OS 키체인 통합은 없습니다.
SecretRef 시스템(옵트인)
OpenClaw는 옵트인 SecretRef 시스템을 지원하여 일반 텍스트 값을 외부 소스에 대한 참조로 대체합니다:
Provider | Example | Description |
|---|---|---|
|
|
|
Reads from environment variable |
|
|
|
Reads from file (JSON pointer or single value) |
|
|
|
Runs vault-like executable |
사용자는 openclaw secrets configure 를 실행해 기존 일반 텍스트 값을 제거하고 SecretRefs로 마이그레이션해야 합니다. 기본 동작은 일반 텍스트 저장입니다.
게이트웨이 인증
게이트웨이는 로컬 액세스 제어에 토큰을 사용합니다:
{
"gateway": {
"auth": {
"mode": "token",
"token": "long-random-string-here"
}
}
}
이 토큰은 SecretRef일 수 있지만, 일반적으로 openclaw.json에 하드코딩되어 있습니다.
알려진 보안 문제
Issue | Severity | Details |
|---|---|---|
|
Plaintext credential storage |
HIGH |
OAuth tokens and API keys in
|
|
Agent tool bypass |
HIGH |
Agents with filesystem/exec tools can |
|
Tailscale exposure |
MEDIUM |
Remote access via Tailscale could expose the local gateway if token auth isn't configured
|
|
OAuth refresh failures |
MEDIUM |
Silent token refresh failures, Anthropic token truncation bugs
|
|
Session persistence |
LOW |
WhatsApp sessions not always persisted across restarts |
자격 증명 위치 요약
모든 파일은 모든 플랫폼(Linux, macOS, Windows)에서 ~/.openclaw/ 아래에 있습니다. WSL에서는 Linux 기본 경로와 Windows 마운트 경로를 모두 확인해야 합니다.
MCP 서버 구성
설정 파일 위치
Tool | Path | Scope |
|---|---|---|
|
Claude Desktop (macOS) |
|
Application |
|
Claude Desktop (Windows) |
|
Application |
|
Claude Code (local) |
|
User (private) |
|
Claude Code (project) |
|
Repository (shared) |
|
Cursor |
|
User |
|
VS Code |
|
Workspace |
|
Cline |
|
Extension |
일반적인 MCP 인증 환경 변수
Variable | Service |
|---|---|
|
|
Azure DevOps |
|
|
GitHub |
|
|
GitHub |
|
|
Slack |
|
|
Atlassian Jira |
|
|
Notion |
|
|
Linear |
환경 변수
다음 환경 변수는 사용자 또는 도구에서 흔히 설정되며 AI 관련 비밀 정보를 포함합니다:
Anthropic / Claude
Variable | Description |
|---|---|
|
|
Anthropic API key ( |
|
|
Bearer auth token |
|
|
Long-lived OAuth token (from |
OpenAI
Variable | Description |
|---|---|
|
|
OpenAI API key ( |
|
|
Organization identifier |
Variable | Description |
|---|---|
|
|
Gemini API key |
|
|
Google API key ( |
|
|
Path to service account JSON key file |
GitHub
Variable | Description |
|---|---|
|
|
GitHub token |
|
|
GitHub CLI token |
|
|
GitHub PAT |
|
|
Copilot-specific token |
AWS
Variable | Description |
|---|---|
|
|
AWS access key ( |
|
|
AWS secret key |
|
|
Temporary session token |
Azure
Variable | Description |
|---|---|
|
|
Azure DevOps MCP token |
|
|
Azure OpenAI key |
다른 AI 제공업체
Variable | Description |
|---|---|
|
|
Hugging Face |
|
|
Cohere |
|
|
Replicate |
|
|
Together AI |
|
|
Groq |
|
|
Mistral AI |
|
|
DeepSeek |
|
|
xAI / Grok |
|
|
Perplexity |
|
|
Fireworks AI |
일반 텍스트 YAML에 oauth_token 필드가 포함되어 있습니다.
공유하기
더 알아보기
저자 소개
Darryl Baker
수석 스태프 보안 연구원
Darryl G. Baker는 Netwrix의 수석 스태프 보안 연구원이며 Identity 및 Active Directory 보안 분야에서 널리 인정받는 권위자입니다. 10년이 넘는 아이덴티티 시스템 경험을 바탕으로 그는 Active Directory, Entra ID, Azure 환경에 초점을 둔 엔터프라이즈 보안 평가, 아이덴티티 보안 교육, 위협 에뮬레이션을 이끌어 왔습니다. Darryl은 BlueTeamCon, BSidesCT, The Experts Conference, Wild Wild West Hackin’ Fest에서 높은 평가를 받은 교육과 데모를 제공해 왔습니다. 그는 현재의 레드팀 및 블루팀 도구를 활용해 공격 경로 분석부터 위협 사냥(threat hunting)까지 수비 담당자가 모든 역량을 익힐 수 있도록 돕는 수많은 핸즈온 공격 에뮬레이션 랩의 설계자입니다. 그의 세션에서는 Darryl이 깊이 있는 기술 통찰과 실제 사례 연구를 결합하여, 블루팀 전문가들이 Identity 보안 자세를 강화하고 진화하는 공격자 기법에 대비해 방어할 수 있도록 역량을 높여 줍니다.