본문으로 건너뛰기
보안

Wixzel Voice 보안

Wixzel Voice는 통신사 비밀번호를 암호화해 저장하고, API 키는 페퍼를 적용한 해시로만 저장하며, 모든 웹훅에 서명하고, API와 데이터를 인도 뭄바이에 둡니다. 이 페이지에는 현재 코드가 실제로 적용하는 것, 아직 갖추지 못한 것, 취약점을 신고하는 방법이 정리되어 있습니다.

최종 업데이트:

게시일:

Wixzel Voice는 자체 SIP 트렁크로 실제 전화를 걸고 받거나 웹·모바일 앱에서 사람들과 대화하는 AI 에이전트를 만들기 위한 음성 AI API입니다. API 키 하나와 선불 잔액 하나로 모든 음성 엔진을 사용하며, 실제 사용량에 따라 초 단위로 과금됩니다. 따라서 보호해야 할 것이 세 가지 있습니다. 통신사 자격 증명, 잔액을 쓰는 키, 그리고 에이전트가 하는 통화의 오디오, 대화 기록, 연락처입니다.

Wixzel Voice는 무엇을 암호화하고, 해시하고, 서명하나요?

Wixzel Voice 보안 조치
항목값출처
통신사(SIP 트렁크) 비밀번호새로 입력하거나 변경한 값은 배포별 키로 AES-256-GCM 암호화해 저장. 이전 값은 다음에 저장될 때 다시 암호화. API가 다시 반환하지 않음API: 자격 증명 암호화
API 키한 번만 표시. 서버 측 페퍼를 적용한 HMAC-SHA256으로만 저장. 스코프가 지정되며 관리자 스코프는 없음API: 키
MCP 커넥터 로그인OAuth 2.1 인가 코드 흐름, S256만 허용하는 PKCE. 토큰은 스코프가 지정되고 취소할 수 있는 API 키문서: MCP 서버
웹훅서명됨: X-Wixzel-Signature는 원본 본문의 HMAC-SHA256. 사설 네트워크를 가리키는 URL은 거부문서: 웹훅
비용이 드는 경로POST /v1/calls, POST /v1/agents/{id}/test-call, POST /v1/billing/topups에 Idempotency-Key 필수. 24시간 보관API: 멱등성
속도 제한키당 초당 10건, 버스트 20건. 로그인과 가입은 IP별, 이메일별로 제한문서: 속도 제한
전송API, 콘솔, MCP 서버로 가는 HTTPS와 WebSocket 연결에 TLS 적용, 하위 도메인을 포함해 1년간 HSTS 적용. 통신사로 가는 SIP는 트렁크의 전송 방식(기본 UDP, 설정 시 TLS)을 사용하며, 통화 오디오(RTP)는 암호화되지 않음API: HTTP 보안 강화, SIP 설정
계정 비밀번호bcrypt, cost 12API: 계정
데이터 저장 위치Hostinger, 인도 뭄바이. 콘솔과 웹사이트는 Vercel개인정보처리방침
카드 번호Wixzel Voice에 전달되지 않음. Dodo Payments가 판매 대행사(merchant of record)사실 정보
취약점 신고/.well-known/security.txt에 게시된 aqeel@wixzel.comsecurity.txt

Wixzel Voice는 통신사 비밀번호를 어떻게 보호하나요?

Wixzel Voice는 통신사를 통해 전화를 걸려면 SIP 트렁크 비밀번호가 필요하므로, 비밀번호를 해시할 수 없어 암호화합니다. 새로 입력하거나 변경한 트렁크 비밀번호와, 플랫폼이 고객을 대신해 보관하는 그 밖의 모든 서드파티 자격 증명은 AES-256-GCM으로 암호화해 저장합니다. 마스터 키는 배포 환경에만 있는 비밀 값에서 scrypt로 확장하고, 각 값은 HKDF로 자체 메시지 키를 받으며, 각 암호문에는 그것을 쓴 키의 ID가 찍혀 있어 나중에 키를 교체할 때 값을 잃지 않고 다시 감쌀 수 있습니다. 이전 방식으로 저장된 값도 계속 읽을 수 있으며, 다음에 저장될 때 이 방식으로 다시 암호화됩니다.

GCM은 인증 암호화입니다. 데이터베이스에서 변조된 암호문은 다른 비밀번호로 바뀌는 대신 복호화에 실패합니다. 복호화되지 않는 자격 증명은 빈 값으로 처리되지 않고 명확한 오류와 함께 거부되므로, 트렁크가 모르는 사이에 인증 없이 동작하게 되는 일은 없습니다. API는 트렁크 비밀번호를 다시 반환하지 않으며, 본인에게도 마찬가지입니다.

트렁크 설정으로 생성되는 전화 통신 구성은 인젝션에 대비해 강화되어 있으며, 생성기는 그 속성에 대해 퍼즈 테스트를 거칩니다.

Wixzel Voice는 API 키를 어떻게 저장하고 스코프를 지정하나요?

wv_live_ 키는 한 번만 표시됩니다. Wixzel Voice는 서버 측 페퍼를 키로 한 HMAC-SHA256 값만 저장하므로, 데이터베이스 사본만으로는 키를 복구하거나 무차별 대입으로 알아낼 수 없습니다. 접두사와 마지막 네 글자는 목록에서 키를 알아볼 수 있도록 하기 위해서만 보관합니다.

  • 스코프. 모든 키는 calls:read나 sip_trunks:write처럼 부여한 스코프만 가집니다. 관리자 스코프가 없으므로 모든 일을 할 수 있는 키는 없습니다.
  • 지출 한도. 키에 spend_limit_micros를 지정할 수 있습니다. 키가 한도만큼 쓰면 그 키로 거는 통화는 전화를 걸기 전에 거부됩니다.
  • 만료와 교체. 키에 expires_at을 지정할 수 있습니다. POST /v1/api-keys/{id}/rotate 요청은 새 키를 발급하고 이전 키를 24시간 동안 계속 작동하게 하므로, 배포 중에 유효한 키가 없는 순간이 생기지 않습니다.
  • 취소. 키를 취소하면 인증 캐시에서 바로 삭제되므로, 다음 요청부터 작동하지 않습니다.
  • 격리. 모든 리소스는 하나의 계정에 속하며, 모든 쿼리는 요청한 계정의 범위로 제한됩니다.

Wixzel Voice MCP 커넥터는 어떻게 로그인하나요?

claude.ai, Claude Desktop, Claude Code 같은 AI 클라이언트는 API에 내장된 OAuth 2.1 인가 서버를 통해 Wixzel Voice MCP 서버에 연결합니다. 클라이언트는 스스로 등록하고(RFC 7591), 동의를 받기 위해 사용자를 콘솔로 보낸 뒤, 코드를 토큰으로 교환합니다. PKCE는 필수이며 S256만 허용합니다. plain 방식은 거부됩니다.

클라이언트가 받는 토큰은 승인한 스코프만 가진 일반적인 스코프 지정 API 키이며, 권한 부여를 취소하면 키도 취소됩니다. OAuth 엔드포인트는 API 키를 자격 증명으로 받지 않습니다. 클라이언트는 PKCE로, 그리고 클라이언트 시크릿을 등록한 경우에는 그것으로 자신을 증명합니다.

Wixzel Voice는 웹훅에 어떻게 서명하나요?

모든 웹훅 POST에는 웹훅 시크릿을 키로 한 원본 본문의 HMAC-SHA256인 X-Wixzel-Signature가 붙습니다. 파싱하기 전에 원본 바이트로 검증하고, 상수 시간으로 비교하세요. 시크릿은 교체할 때 한 번만 반환되고 GET /v1/webhook으로는 반환되지 않으므로, 읽기 스코프 키가 유출되어도 위조된 이벤트를 만드는 데 쓸 수 없습니다.

루프백, 링크 로컬 또는 사설 주소 공간으로 해석되는 웹훅 URL은 설정할 때와 전송할 때 모두 400 unsafe_webhook_url로 거부되며, 리디렉션은 따라가지 않습니다. 플랫폼은 사용자가 접근할 수 없는 주소에 접근할 수 있으므로, 그런 주소를 향하도록 둘 수 없습니다.

Wixzel Voice에서 재시도가 두 번 청구되지 않게 하는 것은 무엇인가요?

POST /v1/calls, POST /v1/agents/{id}/test-call, POST /v1/billing/topups에는 Idempotency-Key가 필요합니다. 같은 키와 본문으로 다시 보내면 다시 전화를 걸거나 청구하지 않고 원래 응답을 반환하며, 같은 키에 다른 본문을 보내면 422로 거부됩니다. 키는 24시간 동안 보관됩니다. 두 공식 SDK 모두 이 경로에서 키를 자동으로 보냅니다.

크레딧은 전화를 걸기 전에 예약되고, 처음 15초를 감당할 수 없는 통화는 무엇도 할당되기 전에 402로 거부되며, 가격은 통화가 승인될 때 통화별로 고정됩니다. 카드 번호는 Wixzel Voice에 전달되지 않습니다. 결제는 판매 대행사(merchant of record)인 Dodo Payments를 통해 이루어집니다.

Wixzel Voice를 악용으로부터 보호하는 것은 무엇인가요?

  • API 속도 제한: 키당 초당 10건, 버스트 20건. 429 응답에는 Retry-After가 붙으며 청구되지 않습니다.
  • 로그인과 가입은 IP 주소별, 이메일 주소별로 제한됩니다. 비밀번호는 cost 12의 bcrypt로 해시하며, 이메일 가입은 그 주소로 보낸 코드로 확인합니다.
  • 콘솔 세션은 URL이 아니라 httpOnly 쿠키에 보관됩니다. 세션 토큰의 서명 알고리즘은 고정되어 있으며, 모든 세션에서 한 번에 로그아웃할 수 있습니다.
  • 번호를 탐색하는 SIP 스캐너는 일시적으로 차단되며, 모든 수신 통화 시도는 크레딧을 예약하기 전에 발신 주소별로 속도 제한을 받으므로 거부된 트래픽이 누구에게도 청구되지 않습니다.
  • 동시 통화는 계정당 기본 5건으로 제한되므로, 한 계정이 플랫폼의 모든 회선을 차지할 수 없습니다.
  • HTTP 보안 강화: TLS 리디렉션, 하위 도메인을 포함한 1년간의 HSTS, 보안 헤더, 명시된 요청 본문 크기 제한.
  • 통신사로 가는 SIP는 트렁크에 설정된 전송 방식을 사용합니다. 기본은 UDP이며, transport를 설정하면 TCP나 TLS를 씁니다. 통화 오디오(RTP)는 암호화되지 않습니다.

Wixzel Voice는 데이터를 어디에 저장하고, 누가 처리하나요?

Wixzel Voice API, 데이터베이스, 통화 미디어는 인도 뭄바이의 Hostinger에서 운영됩니다. 콘솔과 이 웹사이트는 Vercel에서 제공됩니다. 통화 중에는 에이전트 엔진의 음성·언어 제공업체(Deepgram, ElevenLabs, OpenRouter, Google 또는 Sarvam)가 오디오와 텍스트를 처리합니다. 이들은 미국에 있으며, 음성을 인도에서 처리하는 Sarvam만 예외입니다.

대화 기록과, 통화가 녹음된 경우의 녹음은 삭제할 때까지 통화 로그와 함께 보관됩니다. DELETE /v1/calls/{id} 요청은 로그, 대화 기록, 녹음을 한꺼번에 삭제하며, 콘솔에서 계정을 닫으면 그 안의 모든 것이 한 번에 삭제됩니다. 요청 로그는 3개월 뒤 삭제됩니다. 각 하위 처리자의 역할과 위치를 포함한 전체 목록은 개인정보처리방침에 있으며, 데이터 처리 부속서는 모든 고객에게 적용되고 침해 발생 시 72시간 안에 통지합니다.

Wixzel Voice 데이터는 어떻게 백업되나요?

두 프로덕션 데이터베이스는 매시간 덤프됩니다. 매주 가장 최근 덤프를 임시 데이터베이스에 복원하고 모든 계정 잔액이 원장 항목의 합과 같은지 확인하는 점검을 하므로, 백업이 단지 존재하는 것이 아니라 실제로 쓸 수 있다는 것이 확인됩니다.

솔직하게 밝히는 한계가 하나 있습니다. 백업은 같은 서버에 보관되며 다른 곳에는 사본이 없습니다. 잘못된 배포, 손상된 데이터베이스, 실수로 삭제한 데이터에는 대비되지만, 서버 자체를 잃는 경우에는 대비되지 않습니다.

Wixzel Voice에 아직 갖춰지지 않은 것은 무엇인가요?

  • Wixzel Voice는 한 사람이 운영하며, 프로덕션 접근 권한은 그 운영자에게만 있습니다.
  • SOC 2 보고서나 ISO 27001 인증이 없습니다.
  • 통신사로 가는 통화 미디어는 암호화되지 않습니다. 통화 오디오(RTP)는 SRTP 없이 전송되며, SIP 시그널링은 트렁크의 전송 방식을 쓰는데 TLS를 설정하지 않으면 UDP입니다.
  • 외부 백업이 없습니다. 백업은 데이터와 같은 서버에 보관됩니다.
  • API 키를 특정 발신 IP 주소로 제한하는 기능은 아직 API나 콘솔에서 제공하지 않습니다.

Wixzel Voice의 취약점은 어떻게 신고하나요?

aqeel@wixzel.com 주소로 이메일을 보내 주세요. 이 주소는 /.well-known/security.txt에도 게시되어 있습니다. 발견한 내용, 재현 단계, 관련된 응답의 request_id를 포함해 주세요. 메시지는 운영자가 직접 읽으며, 대부분 영업일 하루 안에 답변합니다.

본인의 계정과 데이터로만 테스트하고, 다른 고객의 서비스 품질을 떨어뜨리지 말며, 문제를 공개하기 전에 고칠 수 있는 합리적인 시간을 주세요.

자주 묻는 질문

Wixzel Voice는 SIP 트렁크 비밀번호를 어떻게 저장하나요?

AES-256-GCM으로 암호화해 저장합니다. 새로 입력하거나 변경한 비밀번호는 HKDF로 도출한 자체 메시지 키를 받으며, 그 마스터 키는 배포 환경에만 있는 비밀 값에서 scrypt로 확장한 것입니다. 각 암호문에는 그것을 쓴 키의 ID가 들어 있습니다. 이전 방식으로 저장된 값도 계속 읽을 수 있으며, 다음에 저장될 때 이 방식으로 다시 암호화됩니다. GCM 덕분에 변조는 모르는 사이에 다른 비밀번호가 되는 대신 복호화 실패가 됩니다. API는 비밀번호를 다시 반환하지 않으며, 본인에게도 마찬가지입니다.

Wixzel Voice가 내 API 키를 볼 수 있나요?

아니요. 키는 만들 때 한 번만 표시되며, 서버 측 페퍼를 키로 한 HMAC-SHA256 값만 저장됩니다. wv_live_ 접두사와 마지막 네 글자는 목록에서 키를 알아볼 수 있도록 보관하지만, 저장된 어떤 정보로도 키를 재현할 수 없습니다. 잃어버린 키는 새로 교체하는 수밖에 없습니다.

웹훅이 Wixzel Voice에서 온 것인지 어떻게 확인하나요?

원본 요청 본문에 대해 웹훅 시크릿으로 HMAC-SHA256을 계산하고, 그 값을 X-Wixzel-Signature 헤더와 상수 시간으로 비교하세요. 시크릿은 POST /v1/webhook/rotate-secret으로 교체할 때 한 번만 표시되며, GET /v1/webhook은 시크릿을 반환하지 않습니다.

Wixzel Voice 데이터는 어디에 저장되나요?

API, 데이터베이스, 통화 미디어는 인도 뭄바이의 Hostinger에서 운영됩니다. 미국과 인도의 음성·언어 제공업체가 통화 중에 오디오와 텍스트를 처리하며, sarvam 엔진은 음성을 인도에서 처리합니다. 전체 하위 처리자 목록은 개인정보처리방침에 있습니다.

Wixzel Voice에는 보안 인증이 있나요?

현재는 없습니다. Wixzel Voice는 운영자 한 사람이 운영하며, SOC 2나 ISO 27001 보고서가 없습니다. 이 페이지에는 코드가 실제로 적용하는 조치가 정리되어 있고, 데이터 처리 부속서에는 72시간 안의 침해 통지를 포함한 약속이 명시되어 있습니다.

Wixzel Voice의 보안 문제는 어떻게 신고하나요?

발견한 내용, 재현 방법, 관련된 응답의 request_id를 적어 aqeel@wixzel.com 주소로 이메일을 보내 주세요. 같은 주소가 /.well-known/security.txt에도 게시되어 있습니다.

관련 페이지

첫 음성 에이전트를 만드세요