Secret Vault
Secret Vault
AI Provider API 키와 서드파티 서비스 토큰(예: SendGrid, Telegram, SMTP)을 AiTalk 데이터베이스 대신 사용자의 AWS Lambda에 저장합니다. 활성화하면 키와 토큰이 런타임에 Lambda에서 직접 가져오며, 우리 서버에는 아무것도 저장되지 않습니다.
작동 방식
일반 모드:
AiTalk 서버 ──(DB에서 API 키 조회)──→ OpenAI / Claude / 등
Secret Vault 모드:
AiTalk 서버 ──(키 요청)──→ 사용자 AWS Lambda ──(키 반환)──→ AiTalk이 1회 사용 후
메모리에서 삭제
Secret Vault 활성화 시:
- AI Provider API 키와 서드파티 서비스 토큰(SendGrid, Telegram, SMTP 등)은 사용자의 AWS Lambda 환경변수에만 저장됩니다
- AiTalk은 런타임에 키와 토큰을 가져와서 API 호출에 사용한 후 즉시 삭제합니다
- Lambda에 접근할 수 없으면 API 호출이 실패합니다 — 데이터베이스로 폴백하지 않습니다 (보안 설계)
- OAuth 연결(예: Google Drive)은 항상 데이터베이스를 사용합니다 (자동 토큰 갱신 필요)
사전 요구사항
- AWS 계정 (프리 티어로 충분)
- AWS 콘솔 기본 사용법 숙지
비용: AWS Lambda는 월 100만 건 무료 요청을 포함합니다 (영구 프리 티어). 대부분의 사용자는 Secret Vault 비용이 월 $0입니다.
설정 가이드
1단계: AWS Lambda 함수 생성
- AWS Lambda 콘솔에 로그인합니다
- 함수 생성을 클릭합니다
- 새로 작성을 선택합니다
- 설정:
- 함수 이름:
aitalk-secret-vault(원하는 이름 사용 가능) - 런타임: Node.js 20.x
- 아키텍처: x86_64
- 함수 이름:
- 함수 생성을 클릭합니다
2단계: 템플릿 코드 배포
- AiTalk에서 설정 > 보안으로 이동합니다
- Lambda 템플릿 다운로드를 클릭하여
secret-vault-lambda.js파일을 받습니다 - AWS Lambda 콘솔에서 코드 탭으로 이동합니다
- 기본 코드를 다운로드한 템플릿의 내용으로 교체합니다
- Deploy를 클릭합니다
3단계: 함수 URL 활성화
- 구성 탭 → 함수 URL로 이동합니다
- 함수 URL 생성을 클릭합니다
- 인증 유형: NONE (인증은 Bearer 토큰으로 처리)
- 저장을 클릭합니다
중요: "권한 누락" 경고
저장 후 다음과 같은 경고가 나타날 수 있습니다: "Your function URL auth type is NONE, but is missing permissions required for public access."
해결 방법:
- 함수 URL 페이지에서 Edit 클릭
- 아래로 스크롤하여 View policy statement 확인 — 정책에
lambda:InvokeFunctionUrl과lambda:InvokeFunction이Principal: "*"로 포함되어 있는지 확인- 다시 Save 클릭
- 경고가 다음으로 변경되어야 합니다: "Your function URL is public. Anyone with the URL can access your function."
이것은 정상입니다 — 보안은 AWS IAM이 아닌 Lambda 코드의 Bearer 토큰으로 처리됩니다.
- 생성된 함수 URL을 복사합니다 (예:
https://xxxxxxxxxx.lambda-url.eu-west-1.on.aws/)
4단계: 시크릿을 환경변수로 추가
- 구성 탭 → 환경 변수로 이동합니다
- 편집을 클릭합니다
- AiTalk 설정의 Vault 키 참조 테이블에 표시된 정확한 키 이름으로 시크릿을 추가합니다:
| 키 이름 | 값 | 설명 |
|---|---|---|
AUTH_TOKEN | (5단계에서 생성) | 인증 토큰 |
ai_provider_openai_api_key | sk-xxxxxxxx... | OpenAI API 키 |
ai_provider_anthropic_api_key | sk-ant-xxxxxxxx... | Claude API 키 |
ai_provider_google_api_key | AIzaxxxxxxxx... | Gemini API 키 |
wf_conn_{connectionId}_token | (사용자 토큰) | Workflow 연결 토큰 |
bot_channel_{channelId}_token | (사용자 토큰) | Bot 채널 토큰 |
Workflow 연결 및 Bot 채널의 정확한 키 이름은 설정 > 보안 > Vault 키 참조에서 확인할 수 있습니다.
- 저장을 클릭합니다
5단계: AiTalk을 Lambda에 연결
- AiTalk에서 설정 > 보안으로 이동합니다
- Lambda 함수 URL을 붙여넣습니다
- 새 토큰 생성을 클릭하고 토큰을 복사합니다
- Lambda 환경 변수로 돌아가서
AUTH_TOKEN을 이 토큰으로 설정합니다 - 연결 테스트를 클릭하여 확인합니다
- 저장 및 활성화를 클릭합니다
Vault 키 참조
Lambda 환경변수에 사용하는 키 이름은 정확히 일치해야 합니다. 모든 키 이름은 설정 > 보안 > Vault 키 참조에서 확인할 수 있습니다.
AI Provider 키
| Provider | 키 이름 |
|---|---|
| OpenAI | ai_provider_openai_api_key |
| Anthropic (Claude) | ai_provider_anthropic_api_key |
| Google (Gemini) | ai_provider_google_api_key |
| DeepSeek | ai_provider_deepseek_api_key |
| Grok | ai_provider_grok_api_key |
Workflow 연결 토큰
형식: wf_conn_{connectionId}_token
예시:
wf_conn_cm1abc123def_token(Telegram 연결)wf_conn_cm2xyz789ghi_token(SendGrid 연결)
Bot 채널 토큰
형식: bot_channel_{channelId}_token
Slack 봇의 경우 두 개의 키가 필요합니다:
bot_channel_{channelId}_slack_bot_tokenbot_channel_{channelId}_slack_signing_secret
Secret Vault 비활성화
- 설정 > 보안으로 이동합니다
- 비활성화를 클릭합니다
- AiTalk이 데이터베이스에 저장된 암호화 키를 다시 사용합니다
Vault 활성화 시 데이터베이스에 저장된 키는 삭제되지 않으므로, 언제든 다시 전환할 수 있습니다.
문제 해결
| 문제 | 해결 방법 |
|---|---|
| 테스트 시 "연결 실패" | Lambda 함수 URL이 올바르고 함수가 배포되었는지 확인하세요 |
| "Unauthorized" 오류 | Lambda의 AUTH_TOKEN이 AiTalk의 토큰과 일치하는지 확인하세요 |
| "키를 찾을 수 없음" 오류 | Lambda 환경변수의 키 이름이 정확히 일치하는지 확인하세요 (대소문자 구분) |
| 활성화 후 AI 채팅 안 됨 | Lambda에 필요한 모든 API 키 환경변수가 설정되었는지 확인하세요 |
| 활성화 후 Workflow 실패 | Lambda에 모든 Workflow 연결 토큰이 추가되었는지 확인하세요 |
보안 참고사항
- Bearer 토큰이 AiTalk과 Lambda 간의 요청을 인증합니다
- 사용자의 AWS 계정만 Lambda 환경변수에 접근할 수 있습니다
- AiTalk은 Lambda에서 가져온 시크릿을 저장, 기록 또는 캐시하지 않습니다
- 최대 보안을 위해 AWS IAM 정책으로 Lambda 접근을 제한하세요