점검 가이드 · 보안
API 키·비밀키가 코드에 노출됐을 때 바로 해야 할 일
2026-10-24 기준
- 브라우저로 내려가는 코드에 들어간 키는 방문자 누구나 볼 수 있습니다. 숨긴 것처럼 보여도 마찬가지입니다.
- 노출된 키는 코드에서 지우는 것만으로는 부족합니다. 새 키를 발급하고 옛 키를 꺼야 합니다.
- 비밀키는 서버에서만 쓰고, 브라우저에는 "공개해도 되는 키"만 둡니다.
키가 노출되는 흔한 경우
- AI 에게 "OpenAI 붙여 줘"라고 했더니 화면 코드(브라우저에서 도는 코드)에서 바로 API 를 부르게 만든 경우
- Next.js 에서 NEXT_PUBLIC_ 으로 시작하는 이름, Vite 에서 VITE_ 로 시작하는 이름에 비밀키를 넣은 경우 — 이런 이름의 값은 브라우저로 가는 코드에 그대로 들어갑니다
- .env 파일을 GitHub 에 함께 올린 경우(공개 저장소면 누구나 봅니다)
- 오류 메시지나 로그, 채팅방, 스크린샷에 키가 찍힌 경우
공개해도 되는 키와 절대 안 되는 키
서비스마다 "브라우저에 둬도 되는 키"와 "서버에서만 써야 하는 키"를 나눠 둡니다. 예를 들어 Supabase 는 publishable 키(예전 anon 키)는 공개해도 되지만, secret 키와 service_role 키는 접근 규칙(RLS)을 모두 건너뛰므로 서버에서만 쓰라고 안내합니다.
토스페이먼츠도 클라이언트 키는 결제창을 띄울 때 브라우저에서 쓰고, 시크릿 키는 서버에서 결제를 승인할 때만 씁니다. OpenAI·Anthropic·Gemini 같은 AI API 키는 브라우저에 두면 안 되는 키입니다.
헷갈릴 때는 이름에 secret, sk_, service_role 이 들어가면 서버 전용이라고 보는 것이 안전합니다. 정확한 구분은 각 서비스 문서를 확인하세요.
노출됐을 때 순서대로 할 일
GitHub 기록에서 키를 지우는 것보다 키를 바꾸는 것이 먼저입니다. GitHub 도 노출된 비밀값은 바로 교체하라고 안내합니다. 이미 누군가 복사해 갔을 수 있기 때문입니다.
- 그 서비스의 관리 화면에서 새 키를 발급합니다.
- 서버(예: Vercel 환경 변수)의 키를 새 키로 바꾸고 다시 배포한 뒤, 기능이 잘 되는지 확인합니다.
- 옛 키를 끄거나 삭제합니다. 이때부터 옛 키로는 아무것도 할 수 없습니다.
- 사용량·결제 내역을 보고 내가 쓰지 않은 호출이 있었는지 확인합니다. 이상하면 그 서비스 고객센터에 알립니다.
- 코드를 고쳐 비밀키가 다시 브라우저로 가지 않게 합니다. 키를 쓰는 호출은 서버(API 경로)로 옮깁니다.
내 AI 코딩 도구에 이렇게 맡겨 보세요
다시 생기지 않게 하는 습관
- 키는 서비스별·용도별로 따로 발급합니다. 하나가 새도 그것만 끄면 됩니다.
- AI 서비스에는 지출 한도를 걸어 둡니다. 키가 새도 피해가 한도 근처에서 멈춥니다.
- 키 값을 채팅이나 AI 대화창에 붙여 넣지 않습니다. 배포 서비스의 환경 변수 화면에 직접 넣습니다.
자주 묻는 질문
코드를 압축(난독화)하면 키가 안 보이지 않나요?
보기 어려워질 뿐 숨겨지지 않습니다. 브라우저가 그 키로 요청을 보내는 순간 개발자 도구의 네트워크 탭에 그대로 나옵니다.
저장소가 비공개면 괜찮은가요?
공개 저장소보다는 낫지만, 함께 작업하는 사람이나 연결된 도구가 볼 수 있습니다. 비밀키는 저장소 대신 배포 서비스의 환경 변수에 두는 것이 안전합니다.
이미 노출된 키를 코드에서만 지우면 되나요?
아닙니다. 이미 누가 복사했을 수 있으니 반드시 새 키를 발급하고 옛 키를 꺼야 합니다.
삼심은 Claude·GPT·Gemini 가 서로 모르게 점검하고 지적을 교차 확인해, 개발부터 법률까지 8개 분야의 고칠 순서와 수정 지시문을 드립니다.
함께 보면 좋은 글
참고
이 글은 일반적인 정보이며 법률·보안 자문이 아닙니다. 서비스마다 상황이 다르니 고치기 전에 확인하세요.