글
AI 어시스턴트에 내 금융 데이터를 연결해도 안전한가
MCP 커넥터로 보유자산을 AI에 연결한다는 건 호스티드 서비스에 내 금융 데이터를 넘긴다는 뜻이다. 실제 위험 모델, 어떤 커넥터든 붙이기 전에 물어야 할 다섯 가지, 그리고 opula가 각각에 어떻게 답하는지.
이제 MCP 커넥터로 금융 데이터를 Claude나 ChatGPT에 연결하고 내 돈에 대해 물어볼 수 있다. 바로 따라오는 생각이 정확한 생각이다. 그건 호스티드 서비스에 내 보유자산을 넘긴다는 뜻이다. 부담스러운 요구가 맞고, "믿어달라"는 답이 될 수 없다.
이 글은 그 위험 모델이다. 실제로 뭐가 잘못될 수 있는지, 어떤 금융 커넥터든 추가하기 전에 물어야 할 것, 그리고 opula가 각각에 어디에 서 있는지. 불편한 답도 있는데, 그게 읽을 값어치가 있는 부분이다.
위험은 하나가 아니라 셋이다
사람들은 "안전한가"를 하나의 감정으로 뭉뚱그린다. 사실 서로 다른 세 질문이고 답도 각각 다르다.
1. 다른 유저가 내 데이터를 볼 수 있나? 멀티테넌트 서비스는 여러 사람의 금융 데이터를 한 데이터베이스에 담는다. 최악의 시나리오는 한 유저의 쿼리가 다른 유저의 행을 반환하는 것이다. 밖에서 검증할 수 없는 유일한 위험이자 가장 중요한 위험이다.
2. 회사가 내 데이터를 볼 수 있나? 누군가는 이 서비스를 운영한다. 그들이 무엇을 읽을 수 있는지, 무엇을 로깅하는지, 요청이 오면 무엇을 넘길지는 테넌트 격리와는 별개의 질문이다.
3. 내 돈을 움직일 수 있나? 브로커리지 인증정보를 쥔 커넥터는 원리적으로 행동할 수 있다. 아무것도 안 쥔 커넥터는 무슨 일이 나도 못 한다.
셋은 독립이다. 하나를 잘하면서 다른 하나가 형편없는 커넥터가 얼마든지 있을 수 있다.
어떤 금융 커넥터에든 물어야 할 다섯 가지
우리에게도, 남에게도 똑같이 적용된다.
- 모든 요청이 나로서 인증되는가, 아니면 서버가 하나의 공유 신원으로 도는가?
- 테넌트 격리를 데이터베이스가 강제하는가, 아니면 애플리케이션 코드가
where user_id = ...를 잊지 않기를 바라는가? - 개발자가 검사를 빠뜨리면 쿼리가 아무것도 반환하는가, 전부 반환하는가?
- 내가 소유한 계좌의 인증정보를 쥐고 있는가?
- 매매를 걸거나, 돈을 옮기거나, 계좌 설정을 바꿀 수 있는가?
3번이 대부분 건너뛰는 질문이고, 결과를 결정하는 질문이다. 모든 시스템은 언젠가 버그가 난다. 중요한 건 어느 쪽으로 무너지느냐다.
opula는 어디에 서 있나
모든 툴 호출이 나로서 인증된다. opula는 한 대의 기계에서 도는 스크립트가 아니라 호스티드 MCP 커넥터다. 각 요청은 토큰을 싣고 오고, 그 토큰은 어떤 툴이 실행되기 전에 검증되며, 호출 전체가 내 유저 id로 스코프된 컨텍스트 안에서 돈다.
격리는 우리 코드가 아니라 Postgres가 강제한다. 내 데이터를 담는 모든 테이블에 행 수준 보안(RLS) 정책이 걸려 있고, 각 행을 내 유저 id에 묶는다. 읽기와 쓰기 양쪽 모두에. 이건 애플리케이션이 결과를 받아서 나중에 걸러내는 게 아니다. 우리가 쓸 수 있는 어떤 쿼리보다 아래에서, 데이터베이스가 내 것이 아닌 행을 반환하기를 거부하는 것이다.
검사가 빠지면 닫히는 쪽으로 무너진다. 애플리케이션이 쓰는 DB 롤은 RLS를 우회할 수 없다(
NOBYPASSRLS). 신원은 검증된 토큰에서 읽는다. 그 신원이 어떤 이유로든 부재하면 null로 평가되고, 어떤 행도 매치되지 않고, 쿼리는 아무것도 반환하지 않는다. 우리 코드에 버그가 났을 때의 결과는 빈 결과지 남의 포트폴리오가 아니다. 이게 이 제품에서 가장 중요한 설계 결정이고, TypeScript로 격리하지 않고 Postgres RLS를 고른 이유다.우리는 당신 소유의 어떤 것에도 인증정보를 갖고 있지 않다. opula는 증권사나 은행에 접속하지 않는다. 애그리게이터도, 저장된 로그인도, 읽기 전용 계좌 연결도 없다. 무엇을 보유했는지는 대화나 임포트로 당신이 알려준다. 이건 실제 비용이다. 자동 싱크 도구보다 데이터 입력을 더 해야 한다. 동시에 이것이 "내 돈을 움직일 수 있나"에 대한 답이 "안 그러겠다고 약속한다"가 아닌 이유다. opula에서 당신 계좌로 가는 경로가 존재하지 않는다.
매매하지 않고, 조언하지 않는다. 주문도, 이체도, 개인화된 투자 조언도 없다. opula는 진단("지금 내 돈에 대해 무엇이 사실인가")과 사고실험("당신이 제시하고 우리가 명시하는 가정 하에 어떻게 되는가")을 계산한다. 그 답을 가지고 무엇을 할지는 당신과 당신의 자문가의 몫이다. 세금 처리는 전적으로 현지 전문가에게 미룬다.
API 키를 가져올 필요가 없다. 이전 버전은 유저에게 직접 시세·거시 API 키를 넣게 했다. 지금은 없어졌다. 시세는 키가 필요 없는 소스에서 가져오고, 거시 데이터는 우리가 서버 측에 쥐고 절대 노출하지 않는 단일 키로 가져온다. 저장할 것이 없으니 당신의 인증정보 저장소도 존재하지 않는다.
약속할 수 없는 것
정직해야 하는 부분이다.
호스티드다. 당신의 보유자산은 당신 노트북이 아니라 우리 Postgres에 있다. RLS는 다른 테넌트로부터 당신을 보호한다. 우리가 운영하는 서비스에서 데이터가 사라지게 만들지는 못한다. 내 금융 데이터가 내가 통제하는 기계를 절대 벗어나면 안 된다는 게 요구사항이라면, 어떤 호스티드 커넥터도 그걸 만족하지 못한다. 우리를 포함해서. 그건 정당한 요구사항이고, 그렇다면 그에 따라 행동하는 게 맞다.
어시스턴트는 자기가 가져간 것을 본다. Claude나 ChatGPT가 opula 툴을 호출하면 그 결과는 당신과 그 어시스턴트의 대화 안으로 들어간다. 거기서 무슨 일이 일어나는지는 Anthropic이나 OpenAI의 정책이 규율하지 우리가 아니다. 당신에게 해당하는 쪽을 읽어라.
정확성과 안전성은 다른 것이고, 우리는 금융기관이 아니다. opula는 자산을 수탁하지 않고 증권사도, 자문업자도, 은행도 아니다.
짧게
opula의 가장 강한 보안 속성은 기능이 아니라 부재다. 당신 소유의 어떤 계좌에도 인증정보를 쥐고 있지 않으므로, 완전히 뚫렸을 때의 최악은 당신이 입력한 포트폴리오의 노출이지 무언가의 이체가 아니다. 요청별 인증, 데이터베이스가 강제하는 격리, 닫히는 쪽으로 무너지는 기본값. 나머지 전부는 그 노출조차 어렵게 만들기 위해 있다.
검토 중인 커넥터가 있다면 위의 다섯 가지를 물어라. 3번에 대한 답이 "저희는 조심합니다"라면, 계속 찾아봐라.