기업용 SaaS에 검색 기능을 붙이면 사용자는 훨씬 빨리 문서를 찾습니다. 동시에 작은 실수가 큰 정보 노출로 이어질 수 있습니다. 검색 결과의 제목 한 줄, 문서 미리보기 두 문장, 자동완성 추천어만으로도 다른 고객사의 프로젝트명이나 사람 이름이 드러날 수 있기 때문입니다. 상세 페이지에서 접근을 막는 것만으로는 충분하지 않습니다. 검색 시스템 자체가 사용자의 현재 권한을 이해해야 합니다.
검색 색인도 서비스 데이터다
검색 엔진은 원본 데이터베이스를 그대로 읽지 않고 별도의 색인을 만드는 경우가 많습니다. 원본 문서가 삭제되거나 접근 권한이 바뀌어도 색인 반영에는 시간이 걸립니다. 그래서 ‘원본 API에서 권한을 검사하니 검색은 안전하다’는 가정이 틀릴 수 있습니다. 색인 문서에는 최소한 테넌트 ID, 원본 문서 ID, 공개 범위, 소유 조직 또는 접근 제어에 필요한 키, 갱신 시각을 넣어야 합니다. 민감 정보가 불필요하게 색인되지 않도록 필드별로 저장·검색·미리보기 허용 여부도 정합니다.
반면 색인에 사용자별 권한 목록을 과도하게 복제하면 관리가 어려워집니다. 사용자의 팀이 바뀌거나 조직이 합쳐졌을 때 수많은 색인 문서를 다시 써야 할 수 있습니다. 권한 규칙이 자주 변한다면 안정적인 그룹·조직 식별자를 색인하고, 현재 사용자가 속한 집합은 요청 시 서버에서 계산하는 구조가 편합니다. 어떤 방식이든 색인 시점과 조회 시점 사이의 변경 지연을 명시적으로 다뤄야 합니다.

쿼리마다 강제되는 경계
가장 기본적인 경계는 현재 로그인 세션에서 서버가 확인한 테넌트 ID입니다. 클라이언트가 보낸 tenantId를 그대로 필터에 넣어서는 안 됩니다. API가 사용자 신원을 검증하고, 검색 요청을 만들 때 테넌트 조건과 문서 권한 조건을 항상 함께 적용해야 합니다. 여러 검색 API가 있다면 공통 어댑터나 정책 계층에서 이 조건을 강제하세요. 담당자가 새 검색 화면을 만들면서 필터 한 줄을 빠뜨리는 위험을 줄일 수 있습니다.
검색 엔진의 필터가 앱의 전체 권한 모델을 저절로 대신해 주지는 않습니다. 사용자가 결과를 클릭하면 원본 서비스에서도 현재 권한을 다시 확인해야 합니다. 검색 결과와 원본 문서의 권한 변경 반영 시간이 다를 수 있기 때문입니다. 문서를 볼 수 없게 됐다면 결과에서 제거하고, 반영 전의 링크를 열더라도 상세 API는 거절해야 합니다. 이중 검사는 낭비가 아니라 서로 다른 갱신 시점을 가진 두 저장소의 경계를 지키는 장치입니다.
새는 곳은 결과 목록 바깥에도 있다
검색 보안 테스트는 제목과 본문에만 집중하기 쉽습니다. 그러나 전체 결과 건수, 인기 검색어, 자동완성, 추천 문서, 하이라이트 문장, 패싯 집계도 권한 밖 데이터를 암시할 수 있습니다. 예를 들어 ‘비공개 인수합병’ 문서를 열 수 없어도 추천어와 검색 건수로 존재를 추측할 수 있습니다. 권한 필터를 적용한 결과 집합을 기준으로 부가 정보를 만들거나, 별도 집계라면 민감도를 평가해 노출을 제한해야 합니다.
캐시 키도 살펴보세요. 검색어만으로 결과를 캐시하면 먼저 검색한 관리자의 목록이 일반 사용자에게 재사용될 수 있습니다. 테넌트와 권한 범위를 캐시 키에 포함하고, 개인별 권한이 복잡하다면 공유 캐시의 범위를 신중히 좁힙니다. 로그에는 원문 검색어와 결과 제목을 무심코 남기지 말고, 운영에 필요한 진단 정보만 보관합니다.

권한 변경을 어떻게 반영할까
문서의 테넌트 이동, 공개 범위 변경, 삭제는 일반 수정 이벤트보다 우선순위가 높습니다. 특히 공개에서 비공개로 바뀌는 경우는 색인 지연이 곧 노출 시간이 됩니다. 변경 이벤트를 큐로 전달하고, 실패 시 재시도와 미처리 목록을 운영자가 볼 수 있게 합니다. 즉시 반영을 보장하기 어렵다면 원본 접근 검사와 짧은 캐시 수명, 민감 문서의 별도 정책을 결합해야 합니다. ‘언젠가 재색인된다’는 답은 보안 설계가 아닙니다.
검증은 사용자 A·B, 테넌트 X·Y, 공개·팀 전용·개인 문서를 조합한 테스트 데이터로 시작합니다. 계정 전환 직후, 권한 회수 직후, 인덱싱 지연 중, 캐시 적중 시, 자동완성 API 호출 시나리오까지 확인합니다. 검색 결과에 권한 없는 문서 ID가 단 하나라도 포함되는지 자동 테스트로 검사하고, 운영 환경에서는 테넌트 불일치 결과가 관찰되면 즉시 경보를 띄웁니다.
Microsoft의 Azure AI Search 문서 수준 접근 제어 안내도 검색 결과를 권한 조건에 따라 좁히는 설계를 설명합니다. 특정 제품을 쓰든 자체 검색을 만들든 원칙은 같습니다. 검색은 ‘문서를 찾는 기능’이면서 동시에 ‘볼 수 있는 것만 발견하게 하는 권한 기능’입니다.