글

AI 어시스턴트에 내 금융 데이터를 연결해도 안전할까요

MCP 커넥터로 보유자산을 AI에 연결한다는 건 호스티드 서비스에 내 금융 데이터를 넘긴다는 뜻이에요. 실제 위험 모델, 어떤 커넥터든 붙이기 전에 물어야 할 다섯 가지, 그리고 Opula가 각각에 어떻게 답하는지 정리했어요.

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