FilesContentDocumentSalesforce 관리자

레코드의 파일 공유 작동 방식 (ContentDocumentLink)

Salesforce Files의 데이터 모델인 ContentDocument, ContentVersion, ContentDocumentLink, 그리고 ShareType과 Visibility가 누가 파일을 볼 수 있는지 결정하는 방식을 설명합니다.

AgentForceAccess 2 분 분량
레코드, 사용자, 그룹 엔터티에 연결된 중앙 파일 노드의 스키마 다이어그램

Salesforce에서 파일이 특정 위치에 나타나는지 궁금했던 적이 있거나, Apex나 보고서에서 파일을 조회해야 했다면, 그 아래에 있는 데이터 모델을 알아야 합니다. 현대의 Salesforce Files는 서로 연관된 세 개의 객체로 이루어지며, 링크에 있는 두 개의 필드가 누가 무엇을 보는지 결정합니다. 이 글은 Salesforce에서 누가 파일을 볼 수 있는가의 관리자/개발자용 동반 글입니다.

세 개의 객체

객체무엇인가개수
ContentDocument파일 그 자체파일당 하나
ContentVersion파일 내용의 특정 버전업로드/수정당 하나
ContentDocumentLink파일을 레코드, 사용자 또는 그룹에 연결하는 링크파일당 여러 개

파일을 업로드하면 ContentVersion이 생성되고, Salesforce는 이를 ContentDocument로 감쌉니다. 그 파일을 레코드에 첨부하거나 누군가와 공유하면 ContentDocumentLink가 생성됩니다.

파일은 ContentDocument입니다. 파일이 어디에 존재하고 누가 볼 수 있는지는 전적으로 ContentDocumentLink에 달려 있습니다.

ContentDocumentLink 행은 “이 파일이 저 대상에, 이 접근 수준으로, 이 대상 집단을 위해 연결되어 있다”고 말합니다. 핵심 필드는 다음과 같습니다.

LinkedEntityId — 파일이 첨부된 대상

파일이 연결된 대상의 ID입니다.

  • 레코드(Account, Opportunity, Case, 사용자 정의 객체 등) → 파일이 그 레코드에 “첨부”됩니다.
  • 사용자 또는 그룹 → 파일이 해당 사람이나 그룹에 직접 공유됩니다.

하나의 파일은 동시에 여러 개의 링크를 가질 수 있습니다. 두 개의 레코드에 첨부되고 한 명의 사용자에게도 공유되는 식입니다. 각 링크는 파일에 도달하는 독립적인 경로입니다.

ShareType — 접근 수준

수준가능한 작업
VViewer열기 및 다운로드
CCollaborator보기, 편집, 새 버전 업로드, 공유 변경
IInferred연결된 레코드에 대한 접근으로부터 상속된 접근 수준

**Inferred(I)**는 레코드에 첨부된 파일에서 중요한 값입니다. 파일에 대한 사용자의 접근 권한이 그 파일이 연결된 레코드에 대한 접근 권한에서 파생됩니다. 이것이 “레코드를 볼 수 있는 사람은 그 레코드의 파일도 볼 수 있다”의 메커니즘입니다.

Visibility — 어떤 대상 집단인가

대상 집단
AllUsers내부 외부(커뮤니티) 사용자
InternalUsers내부 사용자만
SharedUsers파일이 명시적으로 공유된 사용자만

이 필드는 Experience Cloud 접근을 조용히 망가뜨리는 주범입니다. Visibility = InternalUsers로 설정된 레코드 첨부 파일은 커뮤니티 사용자가 레코드를 볼 수 있더라도 그들에게는 표시되지 않습니다. (이에 대한 자세한 내용은 파일과 게스트 / Experience Cloud 사용자를 참고하세요.)

접근 권한이 실제로 결정되는 방식

이를 종합하면, 사용자는 파일의 ContentDocumentLink 중 어느 하나라도 다음과 같은 권한을 부여하면 그 파일을 볼 수 있습니다.

  1. 사용자가 접근할 수 있는 레코드에 대한 링크(ShareType I) — 레코드의 공유에서 상속된 접근.
  2. 사용자 본인 또는 그룹에 직접 연결된 링크(ShareType V/C).
  3. 라이브러리 멤버십 또는 공개 링크(별도의 메커니즘).

…그리고 링크의 Visibility가 해당 사용자의 대상 집단을 포함해야 합니다. 대부분의 “파일이 보이지 않음” 문의는 결국 링크가 없거나 Visibility가 너무 좁게 설정된 경우로 귀결됩니다.

조회하기

모두 데이터이므로 직접 들여다볼 수 있습니다. 예를 들어 파일이 공유된 모든 위치를 찾으려면 다음과 같이 합니다.

SELECT ContentDocumentId, LinkedEntityId, ShareType, Visibility
FROM ContentDocumentLink
WHERE ContentDocumentId = '069...'

각 행은 파일에 도달할 수 있는 하나의 대상 집단입니다. 실제 사람들을 열거하려면 각 LinkedEntityId 레코드의 전체 공유 대상 집단을 펼쳐야 하는데, 여기서부터 규모가 순식간에 커집니다.

행에서 평이한 답변으로

여러 레코드에 첨부된 파일은 레코드의 전체 대상 집단(역할 계층, 공유 규칙, 팀 등 모두)을 상속하며, 이것이 모든 ContentDocumentLink에 걸쳐 곱해집니다. 원시 행에서 이를 수작업으로 재구성하는 일이야말로 우발적인 노출이 숨어 있는 바로 그 작업입니다. AgentForceAccess는 ContentDocumentLink와 그 뒤의 레코드 공유를 따라가며 “누가 이 파일을 볼 수 있고, 그 이유는 무엇인가”를 평이한 언어로 답해 줍니다.

자주 묻는 질문

ContentDocument, ContentVersion, ContentDocumentLink의 차이는 무엇인가요?

ContentDocument는 파일 그 자체입니다(파일당 하나). ContentVersion은 그 파일의 특정 버전입니다(업로드/수정당 하나). ContentDocumentLink는 ContentDocument를 레코드, 사용자 또는 그룹 같은 다른 대상에 연결하며, 해당 링크의 접근 수준과 노출 범위를 담고 있습니다.

LinkedEntityId는 무엇을 가리키나요?

파일이 연결된 대상의 ID입니다. 레코드에 첨부된 파일이라면 레코드 ID(Account, Opportunity, Case 등)이고, 사람이나 그룹에 직접 공유된 파일이라면 User 또는 Group ID입니다. 하나의 파일은 동시에 여러 개의 ContentDocumentLink를 가질 수 있습니다.

ShareType 값 V, C, I는 무엇인가요?

V = Viewer(열기 및 다운로드), C = Collaborator(보기, 편집, 버전 업로드, 공유 변경), I = Inferred(연결된 레코드에 대한 접근으로부터 사용자가 간접적으로 얻는 접근 수준)입니다. Inferred는 레코드 접근 권한이 파일로 전파되는 방식입니다.

Visibility 필드는 무슨 역할을 하나요?

Visibility는 링크가 누구에게 노출되는지를 정합니다. AllUsers(내부 및 외부/커뮤니티 사용자), InternalUsers(내부 사용자만), SharedUsers(파일이 명시적으로 공유된 사용자만)입니다. 커뮤니티/Experience Cloud 사용자가 레코드에 첨부된 파일을 보려면 일반적으로 AllUsers가 필요합니다.

직접 내 조직에서 확인해 보세요

AgentForceAccess는 모든 Salesforce 공유 메커니즘에 걸쳐, 어떤 사용자가 왜 특정 레코드나 파일을 볼 수 있는지 쉬운 말로 설명합니다.

얼리 액세스 신청