API 키는 비밀번호와 같습니다. 그런데 비밀번호와 달리 코드 안에 적어 두게 되는 일이 많아 유출되기 쉽습니다.
키가 유출되면 남이 내 요금으로 API를 씁니다. 이 글은 그 사고를 막는 방법과, 이미 났을 때의 순서를 정리합니다.
유출이 일어나는 경로
- 공개 저장소에 코드를 올릴 때. 가장 흔합니다. 키가 적힌 파일을 함께 올리는 경우입니다.
- 화면 공유나 스크린샷. 설정 화면이나 코드가 잠깐 보이는 것만으로 충분합니다.
- 질문 글에 코드를 붙여 넣을 때. 오류를 물어보려고 코드를 통째로 올리는 경우입니다.
- 클라이언트 쪽 코드에 넣을 때. 브라우저에서 도는 코드에 키를 넣으면 누구나 볼 수 있습니다.
마지막이 특히 중요합니다. 브라우저에서 실행되는 코드는 감출 수 없습니다. 난독화해도 마찬가지입니다. 키가 필요한 호출은 서버를 거쳐야 합니다.
기본 원칙 다섯
- 키를 코드에 적지 않습니다. 환경 변수나 별도 설정 파일로 분리하고, 그 파일은 저장소에서 제외합니다.
- 제외 설정을 먼저 만듭니다. 키 파일을 만들기 전에 제외 목록에 넣어 두면 실수로 올라가지 않습니다.
- 용도별로 키를 나눕니다. 개발용과 운영용을 나누면 하나가 유출돼도 피해 범위가 좁아집니다.
- 권한과 한도를 좁힙니다. 그 키로 할 수 있는 일과 쓸 수 있는 금액을 미리 제한합니다.
- 쓰지 않는 키는 폐기합니다. 오래된 키가 살아 있는 것 자체가 위험입니다.
세 번째와 네 번째가 실질적인 방어다
키 유출을 완전히 막을 수는 없습니다. 그래서 유출됐을 때의 피해를 줄이는 설계가 중요합니다.
키마다 지출 한도를 걸어 두면, 유출되더라도 그 한도까지만 피해가 갑니다. 한도가 없으면 상한이 없습니다. 자세한 설정은 API 요금 사고 막기에 정리해 두었습니다.
유출을 알아채는 방법
유출은 조용히 일어납니다. 알아채는 신호는 대체로 이렇습니다.
- 사용량이 평소와 다르게 늘어난다. 가장 흔한 신호입니다.
- 안 쓰는 시간대에 호출이 있다. 새벽에 사용량이 찍히면 확인해 볼 만합니다.
- 안 쓰는 모델이 호출된다. 사용 내역에 낯선 모델이 보이는 경우입니다.
그래서 알림을 걸어 두는 것이 실질적입니다. 사용량이 일정 금액을 넘으면 메일이 오게 해 두면, 사고를 며칠이 아니라 몇 시간 안에 알 수 있습니다.
유출이 의심되면 순서가 있습니다
1. 즉시 그 키를 폐기합니다. 정리나 원인 파악보다 먼저입니다. 폐기 전까지는 그 키로 계속 호출이 가능합니다.
2. 새 키를 발급해 교체합니다. 서비스가 잠시 멈추더라도 이 순서가 맞습니다.
3. 사용 내역을 확인합니다. 언제부터 이상한 호출이 있었는지 봅니다.
4. 유출 경로를 막습니다. 저장소에 올렸다면 파일을 지우는 것만으로는 부족합니다 — 기록에 남아 있을 수 있으므로, 폐기가 먼저인 이유가 여기 있습니다.
저장소에 올린 키는 지워도 남는다
이 부분이 자주 오해됩니다. 파일에서 키를 지우고 다시 올려도 이전 기록에는 그대로 남아 있습니다. 기록을 뒤지면 찾을 수 있습니다.
따라서 “지웠으니 괜찮다”고 판단하지 마시고 반드시 키를 폐기하시기 바랍니다. 폐기한 키는 기록에 남아 있어도 쓸 수 없으므로 안전합니다.
확인 범위
이 글은 일반적인 원칙을 다룹니다. 서비스별 키 폐기 절차나 권한 설정 화면의 위치는 서비스마다 다르고 화면도 자주 바뀝니다. 각 서비스의 키 관리 화면에서 확인하시기 바랍니다.
또한 유출로 발생한 청구가 조정되는지는 서비스 정책에 달려 있어 저희가 단정하지 않습니다. 사용 내역과 함께 고객센터에 문의하시는 것이 확인 방법입니다.
자주 묻는 질문
키를 여러 개 만들어도 요금이 더 나오나요?
키 개수와 요금은 무관합니다. 사용량으로 청구되므로 용도별로 나누는 편이 관리에 유리합니다.
폐기한 키를 되살릴 수 있나요?
대체로 되살릴 수 없습니다. 새로 발급받아야 하므로, 폐기 전에 교체 계획을 세워 두시면 중단 시간이 줄어듭니다.
환경 변수도 안전하지 않은 경우가 있나요?
서버에 접근할 수 있는 사람은 볼 수 있습니다. 코드에 적는 것보다 나을 뿐 절대적인 방어는 아닙니다. 한도 설정이 함께 필요한 이유입니다.
개인 프로젝트인데도 이렇게까지 해야 하나요?
공개 저장소에 올린다면 규모와 무관합니다. 자동으로 키를 찾아 다니는 시도가 있기 때문에, 올린 지 얼마 안 돼 사용량이 찍히는 경우가 보고됩니다.