← 블로그 목록
2026-08-28visionlinqdocument-aiarchitecturesecurityko

문서 변환은 격리에서 — VisionLinq 설계 노트 ②

1편에서 VisionLinq의 경계 — 원본은 고객의 클라우드에 남고, 우리는 읽고 처리하고 돌려준다 — 를 이야기했습니다. 2편은 그 경계 안쪽에서 가장 위험한 순간, 남이 보낸 문서를 여는 순간의 이야기입니다.

문서 파싱은 왜 위험한가

문서 AI 파이프라인의 입구에는 파서들이 서 있습니다. 이미지 코덱, PDF 파서, 최신 오피스 포맷, 그리고 20년 된 레거시 DOC/XLS/PPT까지. 이들은 소프트웨어 역사에서 가장 복잡한 파일 포맷들이고, 복잡한 파서에 신뢰할 수 없는 입력을 먹이는 것은 보안 사고의 고전적인 조합입니다. 악성 문서 한 장이 파서의 취약점을 찌르면, 공격자의 코드가 우리 파이프라인 안에서 돌게 됩니다.

이 위험은 "좋은 파서를 고르면" 사라지지 않습니다. 포맷이 복잡한 한 파서도 복잡하고, 복잡한 코드에는 언젠가 구멍이 있습니다. 그래서 질문을 바꿨습니다 — "파서가 뚫리지 않게 하려면"이 아니라 "파서가 뚫혀도 아무 일도 일어나지 않으려면".

감옥을 짓다

VisionLinq의 문서 변환기는 전용 컨테이너에서 돕니다. 그 컨테이너의 조건이 이 글의 본론입니다.

  • 인터넷이 없습니다. 아웃바운드 네트워크가 아예 차단되어 있습니다. 악성 문서가 파서를 뚫는 데 성공해도, 훔친 것을 보낼 곳도, 추가 코드를 받아올 곳도 없습니다. 유출 경로를 막는 게 아니라 경로 자체가 존재하지 않게 했습니다.
  • 루트가 아닙니다. 컨테이너 안에서도 최소 권한으로 돕니다. 파서를 뚫은 다음 단계 — 권한 상승 — 의 여지를 줄입니다.
  • 상태가 없습니다. 변환기는 파일을 받아 정규화된 산출물(페이지 이미지와 매니페스트)을 만들고 끝납니다. 기억하는 것이 없으니, 뚫려도 그 요청 너머로 번질 것이 없습니다.
  • 산출물만 믿습니다. 파이프라인의 다음 단계는 변환기가 만든 정규화된 형식만 받습니다. 원본 문서의 복잡성은 컨테이너 벽 안에서 끝납니다.

멀웨어 스캔은 이 벽의 보조 장치입니다 — 알려진 악성 파일은 문 앞에서 거르되, 벽의 존재 이유는 "스캔이 놓친 것"입니다.

제약이 만든 단순함

격리는 보안 장치로 시작했지만, 결과적으로 구조를 단순하게 만든 결정이 됐습니다. 그게 이 글에서 가장 하고 싶은 이야기입니다.

경계가 없는 시스템에서는 "이 코드가 악성 입력을 만져도 되는가"를 코드 곳곳에서 물어야 합니다. 경계를 하나 긋고 나면 질문이 두 개로 줄어듭니다 — 벽 안에서는 "어차피 아무것도 못 하니" 파서를 의심하지 않아도 되고, 벽 밖에서는 "정규화된 산출물만 오니" 원본의 복잡성을 몰라도 됩니다. 심사할 표면이 파이프라인 전체에서 벽 하나로 줄어든 겁니다.

실패도 단순해집니다. 변환기가 낼 수 있는 결과는 정규화된 산출물, 아니면 정직한 신호("악성으로 판정됨", "비밀번호가 필요함") 둘뿐입니다. 비밀번호가 걸린 문서는 비밀번호 필요 신호를 돌려주고, 고객이 제공한 비밀번호는 봉인된 채로 전달됩니다 — URL이나 로그에 실리지 않고, 한 번 쓰이면 소진됩니다.

메타데이터만 흐른다

같은 원리가 저장에도 적용됩니다. 문서의 실제 바이트는 테넌트별로 격리된 객체 저장소에만 존재하고, 데이터베이스와 로그에는 메타데이터만 흐릅니다. 로그에 문서 내용이 새는 사고는 로그에 문서 내용을 쓰는 코드가 있어야 일어납니다 — 그런 코드가 없는 구조에서는 일어날 수 없습니다.

"어디에 민감한 데이터가 있을 수 있는가"의 목록이 짧아지면, 지켜야 할 곳의 목록도 짧아집니다. 1편의 "원본은 고객의 클라우드에 남는다"와 같은 결의 결정입니다: 위험을 잘 관리하는 것보다, 위험이 존재할 자리를 줄이는 것.


다음 편에서는 이 컨테이너들을 조율하는 층 — 메시지가 두 번 배달되는 세계에서 정확히 한 번만 일하게 만드는 큐와 멱등성 이야기를 다룹니다.