이메일 API 키는 짧은 문자열이지만 강력한 권한을 가지고 있습니다. 키를 가진 사람은 누구든 여러분의 도메인에서, 여러분의 이름으로, 누구에게나 메일을 보낼 수 있습니다. 유출된 키는 피싱 캠페인이 정상적인 기업의 인프라를 통해 발송되는 가장 흔한 경로 중 하나입니다.
다행히 몇 가지 습관만 들이면 유출 가능성을 낮추고, 그래도 유출이 일어났을 때 피해를 줄일 수 있습니다. 이 가이드에서는 Inbixio가 모든 키에 제공하는 제어 기능을 활용해 그 방법을 설명합니다.
Inbixio 키로 할 수 있는 일
API Keys → Create Api Key(API 키 → API 키 만들기)에서 만드는 모든 키에는 세 가지 설정이 있습니다.
- Name(이름): 관리용 이름입니다. 예:
prod-auth-service. - Server Access(서버 접근): All Server(모든 서버, 처음 연결한 SMTP 서버를 통해 발송) 또는 Selected Server(선택한 서버, 지정한 서버 하나만 사용).
- Permissions(권한): Send(발송), Read(읽기), Manage(관리). 현재 API에는 이메일 발송이라는 엔드포인트 하나만 있으므로, 서비스에 필요한 권한은 Send입니다.
키는 ibx_ 뒤에 16진수 32자가 붙는 형태입니다. 이 접두사 덕분에 사람도 쉽게 알아볼 수 있고, 시크릿 스캐너도 쉽게 잡아낼 수 있습니다.
규칙 1: 서비스와 환경마다 키 하나씩
회사 전체가 키 하나를 공유하지 마세요. 서비스마다, 그리고 환경마다 별도의 키를 만드세요.
| 키 이름 | Server Access | Permissions |
|---|---|---|
prod-auth |
Selected: security@yourco.com |
Send |
prod-billing |
Selected: billing@yourco.com |
Send |
staging-all |
Selected: 테스트용 메일함 | Send |
키를 분리하면 다음과 같은 이점이 있습니다.
- 유출의 영향이 제한됩니다.
prod-billing을 폐기해도 로그인 이메일은 멈추지 않습니다. - 각 서비스가 올바른 주소로 발송합니다.
billing@서버에 고정된 키는 처음 연결한 서버가 아니라billing@에서 발송합니다. 고정된 서버를 삭제하면 키는 첫 번째 서버로 되돌아가므로, 서버를 제거할 때는 키를 다시 고정하세요. - 키 교체가 간편합니다. 다른 서비스에 손대지 않고 한 서비스의 키만 갱신할 수 있습니다.
규칙 2: 작동에 필요한 최소 권한만 부여하기
이메일을 보내는 백엔드에는 Send 외에 아무것도 필요하지 않으므로, Read와 Manage는 체크하지 마세요. 키가 할 수 있는 일이 적을수록 유출되었을 때의 피해도 줄어듭니다.
규칙 3: 키는 서버에 두고, 클라이언트에는 절대 두지 않기
브라우저나 모바일 앱으로 배포되는 것은 압축 여부와 상관없이 모두 추출될 수 있습니다. 여기에는 다음이 포함됩니다.
- JavaScript 번들(React, Vue, Next.js 클라이언트 컴포넌트),
NEXT_PUBLIC_,VITE_,REACT_APP_처럼 브라우저용 접두사가 붙은 환경 변수,- iOS 및 Android 앱 바이너리.
프론트엔드의 사용자 동작으로 이메일을 보내야 한다면 여러분의 백엔드 엔드포인트를 호출하세요. 백엔드가 사용자에게 권한이 있는지 확인하고 속도 제한을 적용한 다음, 환경 변수에 보관한 키로 Inbixio를 호출합니다.
// ✅ Browser → your API → Inbixio
await fetch('/api/invite', { method: 'POST', body: JSON.stringify({ email }) });
// ❌ Never do this in frontend code
fetch('https://backend.inbixio.com/api/send-email/', {
headers: { 'X-API-Key': 'ibx_…' }, // visible to every visitor
});
규칙 4: 키는 비밀번호처럼 보관하기
- 키는 시크릿 매니저(AWS Secrets Manager, Google Secret Manager, Doppler, 1Password, Vault)나 플랫폼의 암호화된 환경 변수에 저장하세요.
- 절대 커밋하지 마세요.
.env를.gitignore에 추가하고 저장소에서 시크릿 스캐닝을 켜세요. GitHub의 푸시 보호 기능은 많은 유출을 사전에 차단합니다. - 로그에 키가 남지 않게 하세요. 외부로 나가는 요청을 로그로 남긴다면 먼저
X-API-Key헤더를 제거하세요. - 티켓, 채팅, 스크린샷에 키를 붙여 넣지 마세요. 값이 아니라 시크릿에 대한 접근 권한을 공유하세요.
규칙 5: 정기적으로 교체하고, 의심스러우면 즉시 교체하기
Inbixio에서는 키를 갱신할 수 있습니다. API Keys 페이지에서 키 옆의 새로 고침 아이콘을 클릭하세요. 갱신하면 이름, 서버 접근, 권한은 그대로 유지된 채 새 값이 발급되고, 이전 값은 즉시 작동을 멈춥니다. 발송 실패 없이 운영 키를 교체하려면:
- 같은 설정으로 두 번째 키를 만듭니다(예:
prod-auth-2). - 새 키를 서비스에 배포하고, 자체 애플리케이션 로그 등에서 요청이
200을 반환하는지 확인합니다. - 이전 키를 삭제합니다.
유출 직후처럼 매끄러운 전환보다 속도가 중요할 때는 새로 고침 아이콘을 사용하세요. 일반 키는 몇 달마다, 그리고 접근 권한이 있던 사람이 팀을 떠날 때마다 교체하세요.
키가 유출되었다면
사고로 다루되, 충분히 대응할 수 있는 사고입니다.
- 즉시 키를 갱신(새로 고침 아이콘)하거나 삭제하세요. 이렇게 하면 이전 값의 사용이 모두 중단됩니다.
- 대시보드 로그에서 비정상적인 활동을 확인하세요. 평소와 다른 시간대의 호출이나 발송량 급증 등입니다. 로그에는 호출 시각은 나오지만 어떤 키로 호출했는지는 나오지 않으므로, 여러분 서비스의 로그와 비교해 보세요.
- 메일 제공업체에서 여러분이 보내지 않은 메시지로 인한 반송이나 스팸 신고가 있는지 확인하세요.
- 커밋, 로그 한 줄, 프론트엔드 번들 등 어떻게 유출되었는지 찾아내고 그 경로를 막으세요.
- 여러분의 이름으로 메시지가 발송되었다면 영향을 받은 사용자에게 알려 해당 메시지를 무시하도록 안내하세요.
간단한 체크리스트
- 서비스와 환경마다 알아보기 쉬운 이름의 키 하나씩
- 각 서비스가 사용해야 할 서버(발신 주소)에 키 고정
- 발송 서비스에는 Send 권한만
- 프론트엔드 코드, 모바일 앱, 저장소에 키 없음
- 키는 시크릿 매니저에 보관하고 로그에서 제거
- 달력에 교체 일정 등록, 유출 대응 계획 마련
보안은 스팸함을 피하는 데에도 중요합니다. 유출된 키로 발송된 메시지는 도메인 평판을 떨어뜨립니다. 전체 그림을 보려면 이 체크리스트를 SPF, DKIM, DMARC와 함께 활용하세요.