TechFeedTechFeed
Security

AI API 키 보안 실전 가이드 — 노출 방지·환경변수 관리·Workload Identity Federation까지

클로드, 챗지피티, 제미나이 API 키가 깃허브나 프론트엔드 코드에 노출되면 수백만 원의 청구서와 계정 정지로 이어진다. .env 파일과 .gitignore 설정, 서버 사이드 프록시 패턴, AWS Secrets Manager 활용법, 유출 시 즉각 대응 절차, 그리고 앤트로픽이 2026년 6월 공개한 Workload Identity Federation 키리스 인증까지 단계별로 정리한다. API 보안, LLM API, 환경변수, 시크릿 관리, 키 로테이션을 다룬다.

by
AI 코딩 도구와 LLM API 도입이 빠르게 늘어나면서 API 키 보안 사고도 증가하고 있다. 클로드(Claude), 챗지피티(ChatGPT), 제미나이(Gemini) API 키가 공개 깃허브(GitHub) 리포지토리나 프론트엔드 코드에 노출되면 수백만 원의 청구서가 날아오거나 계정이 정지되는 사태가 발생한다. LG유플러스가 기업용 보안 AI 플랫폼을 출시하는 등 국내외에서 AI API 보안 중요성이 부각되고 있다. 이 글에서는 API 키 유출 방지의 기본인 환경변수 관리부터, 이미 유출됐을 때 즉각 대응 절차, 프로덕션 환경 시크릿 관리, 그리고 앤트로픽이 공개한 Workload Identity Federation을 이용한 키리스 인증까지 단계적으로 정리한다.

API 키 유출이 얼마나 심각한 문제인가 — 실제 피해 사례

API 키 유출은 잠깐의 실수가 수백만 원짜리 청구서로 이어지는 보안 사고다. 가장 흔한 유출 경로는 세 가지다. 첫 번째는 깃허브(GitHub) 리포지토리에 .env 파일이나 API 키를 직접 커밋하는 경우다. 깃허브는 공개 리포지토리에 올라온 API 키 패턴을 자동으로 감지해 알림을 보내지만, 이미 크롤러가 수집했을 가능성이 높다. 악성 봇은 초 단위로 깃허브를 모니터링하고 키를 발견하면 즉시 무차별 사용을 시작한다. 두 번째는 프론트엔드 코드에 API 키를 넣는 경우다. Next.js 같은 프레임워크에서 환경변수명에 NEXT_PUBLIC_ 접두어를 붙이면 브라우저에서도 접근 가능하다. 이 변수에 API 키를 넣으면 브라우저 개발자 도구를 열면 누구나 볼 수 있다. 세 번째는 로그에 API 키가 출력되는 경우다. 디버깅 목적으로 환경변수 전체를 로그로 찍거나, 오류 메시지에 HTTP 헤더가 포함되면 키가 로그 스토리지에 그대로 남는다. 유출이 발생하면 피해는 두 가지로 나타난다. 재정적 피해로는 악성 사용자가 고가 모델을 대량으로 호출해 예상치 못한 비용이 발생한다. 서비스 중단 피해로는 사용 한도 초과로 정상 사용자의 요청이 거부되거나 계정이 일시 정지된다.
API 키 보안 위협
API 키 유출 경로 — 깃허브 커밋, 프론트엔드 코드, 로그가 가장 흔한 경로다

환경변수 관리 기본 — .env 파일과 .gitignore 설정

API 키는 코드에 직접 쓰지 않고 환경변수로 관리하는 것이 기본이다. Node.js 기반 프로젝트에서는 dotenv 라이브러리를 사용해 .env 파일에서 환경변수를 로드한다. Python 프로젝트도 python-dotenv로 동일하게 처리한다. 환경변수 관리의 핵심 규칙은 세 가지다. 첫째, .env 파일은 .gitignore에 반드시 포함해야 한다. 프로젝트를 처음 만들 때 놓치면 나중에 추가해도 이미 추적 중인 파일은 제거해야 하는 번거로움이 생긴다. 둘째, .env.example 파일을 만들어 어떤 환경변수가 필요한지 문서화한다. 실제 값 대신 빈값이나 설명만 넣는다. 셋째, 프론트엔드(클라이언트 사이드)에 API 키를 절대 노출하지 않는다. API 키가 필요한 호출은 백엔드 서버나 API 라우트를 통해 프록시한다.
.env 파일과 .gitignore 기본 설정
# .env (절대 깃허브에 커밋하지 마라) ANTHROPIC_API_KEY=sk-ant-... OPENAI_API_KEY=sk-... GEMINI_API_KEY=... # .env.example (깃허브에 커밋 가능 — 실제 값 없음) ANTHROPIC_API_KEY=여기에_앤트로픽_API_키를_입력하세요 OPENAI_API_KEY=여기에_오픈AI_API_키를_입력하세요 GEMINI_API_KEY=여기에_제미나이_API_키를_입력하세요 # .gitignore에 반드시 추가 .env .env.local .env.*.local *.env
Next.js에서 API 키를 서버 사이드에서만 사용하는 방법
// pages/api/chat.js (서버 사이드 API 라우트 — API 키가 클라이언트에 노출되지 않음) import Anthropic from "@anthropic-ai/sdk"; export default async function handler(req, res) { if (req.method !== "POST") return res.status(405).end(); // process.env는 서버에서만 접근 가능 — 클라이언트에 절대 노출 안 됨 const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY, }); const { userMessage } = req.body; const response = await client.messages.create({ model: "claude-sonnet-4-6", max_tokens: 1024, messages: [{ role: "user", content: userMessage }], }); return res.json({ reply: response.content[0].text }); } // ❌ 절대 하지 말아야 할 패턴 — API 키가 브라우저에 노출됨 // const client = new Anthropic({ apiKey: process.env.NEXT_PUBLIC_API_KEY }); // 클라이언트에서 직접 호출

API 키를 깃허브에 올렸다면 — 즉각 대응 절차

이미 API 키를 실수로 커밋했다면 다음 순서로 즉각 대응해야 한다. 시간이 지날수록 피해가 커진다. 1단계: 즉시 기존 키 폐기. 앤트로픽은 console.anthropic.com/account/keys, 오픈AI는 platform.openai.com/account/api-keys에서 해당 키를 즉시 삭제한다. 키를 삭제하면 해당 키를 쓰는 모든 요청이 즉시 차단된다. 2단계: 새 키 발급. 기존 키를 삭제한 직후 새 키를 발급받는다. 새 키는 환경변수로 안전하게 저장한다. 3단계: 깃 이력에서 키 제거. 파일에서 키를 제거하고 다시 커밋해도 깃 히스토리에는 기존 키가 남는다. BFG Repo Cleaner나 git filter-repo를 사용해 전체 이력에서 키를 제거하고 강제 푸시해야 한다. 4단계: 사용 이력 확인. 각 대시보드에서 의심스러운 사용 이력이 있는지 확인하고, 비정상적인 과금이 발생했다면 즉시 고객 지원에 연락한다.
깃 이력에서 민감 정보를 삭제하는 방법git filter-repo --string-exact "sk-ant-api키값" --replace-text /dev/null로 전체 이력에서 해당 문자열을 제거할 수 있다. 단, 이 작업 후 강제 푸시가 필요하며 팀원들이 리포지토리를 다시 클론해야 할 수 있다.
API 키 유출 대응 절차
API 키 유출 발생 시 즉각 대응 순서 — 1분도 지체하지 마라

프로덕션 환경 키 관리 — Secrets Manager와 키 로테이션

개발 환경에서는 .env 파일이 충분하지만, 프로덕션 환경에서는 더 안전한 시크릿 관리가 필요하다. 버셀(Vercel) 배포 환경이라면 Vercel 대시보드의 Environment Variables 기능을 사용한다. CLI에서 vercel env add ANTHROPIC_API_KEY 명령으로 추가하면 빌드 및 런타임 환경변수로 안전하게 주입된다. 이 값은 암호화 저장되고 배포 로그에 노출되지 않는다. AWS 기반이라면 AWS Secrets Manager를 사용한다. 키를 주기적으로 자동 로테이션할 수 있고, IAM 권한으로 접근 제어가 가능하다. 구글 클라우드(Google Cloud)는 Secret Manager, 애저(Azure)는 Key Vault가 동일한 역할을 한다. 키 로테이션은 정기적으로 실시해야 한다. 앤트로픽과 오픈AI 모두 여러 개의 API 키를 동시에 발급할 수 있다. 새 키를 발급하고 환경변수를 업데이트한 뒤 이전 키를 삭제하는 순서로 다운타임 없이 로테이션할 수 있다.
AWS Secrets Manager에서 API 키를 가져오는 방법 (Python)
import boto3 import json import os def get_api_key(secret_name: str, region: str = "ap-northeast-2") -> str: """AWS Secrets Manager에서 API 키를 가져온다.""" session = boto3.session.Session() client = session.client(service_name="secretsmanager", region_name=region) response = client.get_secret_value(SecretId=secret_name) secret = json.loads(response["SecretString"]) return secret["api_key"] # 사용 예시 anthropic_key = get_api_key("prod/anthropic/api-key") import anthropic client = anthropic.Anthropic(api_key=anthropic_key)

클로드 Workload Identity Federation — API 키 없이 인증하기

앤트로픽은 2026년 6월 Workload Identity Federation(WIF)을 공식 출시했다. 이 기능은 API 키를 발급하고 관리하는 번거로움을 없애는 키리스(keyless) 인증 방식이다. Workload Identity Federation의 작동 방식은 다음과 같다. AWS나 구글 클라우드 같은 클라우드 플랫폼은 실행 중인 서비스(예: EC2 인스턴스, Cloud Run 서비스)에 임시 자격증명을 자동으로 발급한다. 앤트로픽의 Workload Identity Federation은 이 임시 자격증명을 신뢰하도록 설정해, 별도 API 키 없이 클로드 API를 호출할 수 있게 해준다. 키리스 인증의 실질적인 장점은 세 가지다. 첫째, API 키 유출 위험 자체가 없어진다. 키가 없으니 훔칠 것도 없다. 둘째, 키 로테이션 작업이 필요 없다. 임시 자격증명은 클라우드 플랫폼이 자동으로 갱신한다. 셋째, 접근 권한을 클라우드 IAM과 동일하게 관리할 수 있어 일관된 보안 정책 적용이 가능하다. 설정은 앤트로픽 콘솔에서 서비스 계정을 생성하고, 신뢰할 클라우드 플랫폼과 리소스를 지정하는 방식으로 진행한다. 자세한 설정 방법은 앤트로픽 공식 문서(docs.anthropic.com)를 참고해야 한다. 이 기능은 아직 기업 단위 사용에 최적화되어 있고, 개인 개발자 용도로는 기존 API 키 방식이 더 간편하다.
Workload Identity Federation 키리스 인증
Workload Identity Federation — API 키 없이 클라우드 IAM으로 클로드 API 인증

API 사용 모니터링 — 이상 감지와 예산 한도 설정

보안 설정을 마쳤더라도 사용 모니터링은 계속해야 한다. 예상치 못한 사용량 급증은 유출이 아니더라도 버그나 잘못된 로직 때문에 발생할 수 있다. 앤트로픽 콘솔에서는 사용량 한도(Usage Limits)를 설정할 수 있다. 월간 지출 한도를 설정하면 해당 금액에 도달했을 때 API 호출이 자동으로 차단된다. 급격한 비용 증가를 막는 마지막 안전장치다. 오픈AI 대시보드에서도 마찬가지로 월간 지출 한도와 이메일 알림을 설정할 수 있다. 특정 금액에 도달하면 알림을 보내고, 최대 한도에서는 호출을 차단하는 두 단계 설정을 권장한다. IP 기반 접근 제한도 고려할 만하다. 서버에서만 API를 호출한다면, 앤트로픽이나 오픈AI 대시보드에서 허용 IP 목록을 설정해 해당 IP 외부에서의 호출을 차단할 수 있다. 설정 방법은 각 플랫폼 문서를 확인해야 하며, 지원 여부는 요금제마다 다를 수 있다.

참고 자료


자주 묻는 질문

깃허브에 API 키를 올렸는데 몇 분 만에 삭제하면 안전한가?

안전하지 않다. 악성 봇은 깃허브를 실시간으로 모니터링하고 수 초 안에 키를 수집한다. 커밋 직후 삭제해도 이미 봇이 키를 가져갔을 가능성이 높다. 발견 즉시 해당 키를 폐기하고 새 키를 발급하는 것이 유일한 정답이다. 비용 한도 설정이 되어 있었다면 피해를 제한할 수 있다.


NEXT_PUBLIC_ 접두어를 붙인 환경변수에 API 키를 쓰면 어떻게 되나?

브라우저에 키가 그대로 노출된다. NEXT_PUBLIC_ 접두어가 붙은 환경변수는 빌드 시점에 클라이언트 번들에 포함된다. 브라우저 개발자 도구나 페이지 소스를 보면 키 값을 그대로 확인할 수 있다. API 키는 절대 NEXT_PUBLIC_ 변수에 넣으면 안 된다. API 키가 필요한 호출은 pages/api 같은 서버 사이드 API 라우트를 통해 프록시해야 한다.


Workload Identity Federation은 어떤 프로젝트에 적합한가?

AWS, 구글 클라우드, 애저 같은 클라우드 플랫폼에 서비스를 배포하는 기업 환경에 가장 적합하다. 클라우드 플랫폼에서 실행 중인 서비스(EC2, Cloud Run, Azure Container Apps 등)가 클로드 API를 호출해야 할 때 API 키 대신 클라우드 IAM 자격증명으로 인증할 수 있다. 개인 개발자의 로컬 환경이나 간단한 사이드 프로젝트에는 오히려 설정이 복잡해질 수 있어 기존 API 키 방식이 현실적이다.


API 키 로테이션은 얼마나 자주 해야 하나?

업계 권고 기준은 3~6개월마다 정기 로테이션이다. 그러나 더 중요한 것은 다음 상황에서 즉각 로테이션하는 것이다: 팀원 퇴사 후, 보안 사고 발생 시, 키가 노출된 의심이 드는 경우, 배포 환경 변경 시. 앤트로픽과 오픈AI 모두 여러 키를 동시에 유지할 수 있어, 새 키 발급 후 환경변수 업데이트를 완료한 뒤 기존 키를 삭제하면 다운타임 없이 로테이션 가능하다.


API 키 대신 프록시 서버를 쓰는 방법도 있나?

있다. 직접 AI API를 호출하지 않고 중간에 자체 백엔드 서버를 두는 방식이다. 클라이언트 → 자체 백엔드(API 키 보유) → AI API 순서로 요청이 흐르면, 클라이언트는 API 키를 알 필요가 없다. Next.js의 API 라우트, Express 서버, 또는 Vercel 함수가 이 역할을 한다. 이 방식의 부가적인 장점은 요청 로그 기록, 속도 제한, 비용 제어 로직을 자체 백엔드에서 중앙 관리할 수 있다는 것이다.


AI API 비용 한도 설정은 어디서 하나?

앤트로픽은 console.anthropic.com의 Settings → Billing에서 월간 지출 한도를 설정할 수 있다. 오픈AI는 platform.openai.com의 Settings → Limits에서 설정한다. 두 플랫폼 모두 지출 경고 알림(특정 금액 도달 시 이메일)과 최대 한도(초과 시 API 차단)를 별도로 설정할 수 있다. 서비스 출시 전 반드시 적절한 한도를 설정해두는 것을 권장한다.


API 보안ClaudeOpenAI환경변수시크릿 관리Workload Identity Federation키 로테이션GitHubAWS Secrets Manager보안

관련 도구

EXPLORE / Security

이어서 읽어보기

전체 토픽 둘러보기