문제 해결레코드 접근 권한오류

"insufficient access rights on cross-reference id" 해결 방법

Salesforce "insufficient access rights on cross-reference id" 오류의 의미와 다섯 가지 원인, 그리고 단계별 해결 방법을 정리했습니다.

AgentForceAccess 3 분 분량
경고 표시와 자물쇠가 함께 있고, 깨진 채 불꽃이 튀는 빛줄기로 연결된 두 개의 레코드 아이콘

INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY: insufficient access rights on cross-reference id는 Salesforce에서 가장 자주 오해받는 오류 중 하나입니다. 본능적으로 저장하려는 레코드의 권한을 확인하게 되지만, 이 오류는 거의 그 레코드에 관한 것이 아닙니다. 그 레코드가 가리키는 다른 레코드에 관한 것입니다.

이 가이드에서는 이 메시지가 무엇을 뜻하는지 설명하고, 반복 적용할 수 있는 해결 방법을 알려드립니다.

이 오류가 실제로 의미하는 것

레코드를 삽입하거나 업데이트할 때, Salesforce는 그 레코드가 lookup이나 master-detail 필드, 소유권, 관련 목록 작업 등을 통해 참조하는 모든 레코드도 함께 검사합니다. 실행 사용자가 그 참조된 레코드 중 하나에 접근할 수 없으면, 작업 전체가 insufficient access rights on cross-reference id: <id>로 거부됩니다.

여기서 <id>는 저장 중인 레코드가 아니라 사용자가 접근하지 못하는 레코드의 15자리 또는 18자리 ID입니다. 이 구분이야말로 문제 해결의 핵심 전부입니다.

이 메시지는 이렇게 해석하세요: “이 작업을 실행하는 사용자가, 이 레코드가 가리키는 관련 레코드 <id>에 접근할 수 없습니다.”

0단계 — cross-reference 레코드 식별하기

오류에서 ID를 복사해 직접 열어 봅니다.

https://yourdomain.my.salesforce.com/<id>

이제 어떤 개체와 레코드가 당신을 막고 있는지 알 수 있습니다(상위 Account, lookup의 Contact, 소유자, 관련된 Case 등). 아래의 모든 단계는 바로 레코드를 대상으로 합니다.

가능성이 높은 순서대로 살펴보는 다섯 가지 원인

1. 개체 권한 누락

사용자의 프로필이나 권한 세트에 참조된 개체에 대한 Read(또는 Create/Edit) 권한이 없는 경우입니다. 개체 권한은 공유가 평가되기 전에 거치는 관문입니다. 개체 권한과 레코드 공유의 차이를 참고하세요. 권한 세트를 통해 필요한 CRUD를 부여하세요.

2. lookup 필드의 필드 수준 보안

사용자가 참조를 담고 있는 필드를 보거나 편집할 수 없는 경우입니다. FLS가 lookup 필드를 숨기면 그 필드에 대한 쓰기가 실패합니다. 사용자의 프로필/권한 세트에서 해당 필드의 필드 수준 보안을 확인하세요.

3. 참조된 레코드에 대한 접근 권한 없음(공유)

사용자가 개체 접근 권한은 있지만 그 특정 관련 레코드에 대한 레코드 접근 권한이 없는 경우입니다. 원인으로는 공유 규칙이 없는 비공개(Private) 조직 전체 기본값(OWD), 또는 사용자가 역할 계층에서 소유자보다 상위에 있지 않은 경우 등이 있습니다. 관련 레코드의 공유(Sharing) 버튼으로 확인한 다음, 공유 규칙, 팀, 또는 수동 공유로 접근 권한을 확장하세요.

4. 사용자 컨텍스트로 실행되는 자동화

**“Flow를 실행하는 방법 → in user context”**로 구성된 Flow나 with sharing으로 선언된 Apex는 실행 사용자의 권한을 적용합니다. 그 사용자가 관련 레코드에 접근할 수 없으면, 관리자가 테스트했을 때는 잘 되었더라도 자동화는 이 오류로 실패합니다.

  • 해결책 A(적절한 경우 권장): Flow를 system context로, Apex를 without sharing으로 실행하여 자동화가 실행 사용자의 권한에 제한되지 않게 합니다. 사용자가 직접 접근 권한을 가질 필요가 정당하게 없는 경우에만 사용하세요.
  • 해결책 B: 사용자에게 관련 레코드에 대한 접근 권한을 실제로 부여합니다(원인 1~3).

5. 삭제되었거나, 비어 있거나, 형식이 잘못된 참조

lookup이 삭제된 레코드, 처음부터 존재하지 않은 레코드를 가리키거나 ID가 비어 있거나 잘못된 경우입니다(데이터 적재나 통합 작업에서 흔히 발생합니다). Salesforce는 존재하지 않는 레코드를 접근 권한 부족으로 보고합니다. 저장하기 전에 해당 ID가 살아 있는 레코드로 연결되는지 검증하세요.

반복 적용 가능한 해결 체크리스트

  1. 오류에서 <id>를 추출해 열고 — 개체와 레코드를 식별합니다.
  2. 사용자가 그 개체에 대한 Read/Edit 권한을 가지고 있는가? → 프로필/권한 세트를 수정합니다.
  3. 사용자가 lookup 필드에 대한 필드 수준 보안 권한을 가지고 있는가? → FLS를 수정합니다.
  4. 사용자가 그 특정 레코드에 대한 레코드 접근 권한을 가지고 있는가? → 공유 버튼을 확인하고 공유를 추가합니다.
  5. 자동화가 사용자 컨텍스트로 실행되고 있는가? → system context로 할지 접근 권한을 부여할지 결정합니다.
  6. 참조된 ID가 여전히 살아 있는 레코드로 연결되는가? → 데이터/통합을 수정합니다.

가장 먼저 실패하는 항목이 근본 원인입니다.

이 오류가 사실은 접근 권한 추적 문제인 이유

위의 모든 원인은 결국 같은 근본 질문으로 귀결됩니다. 이 사용자가 그 관련 레코드에 실제로 접근할 수 있는가, 그리고 어떤 메커니즘을 통해 그러한가? 이를 CRUD, FLS, 그리고 여섯 가지 공유 메커니즘에 걸쳐 손으로 일일이 답하기란 번거로운 일입니다.

AgentForceAccess는 이를 평이한 언어로 답해 줍니다. 사용자와 레코드를 붙여 넣기만 하면, 어떤 권한이나 공유가 접근을 허용(또는 차단)하는지 정확히 추적해 주므로, 다섯 가지 원인 중 무엇을 보고 있는지 더는 추측할 필요가 없습니다.

자주 묻는 질문

"cross-reference id"는 정확히 무엇을 가리키나요?

작업이 lookup 또는 master-detail 필드를 통해 가리키는 *관련* 레코드의 Salesforce 레코드 ID입니다. 실행 사용자가 그 레코드에 접근할 수 없기 때문에 저장이 거부됩니다. 조직 URL 뒤에 ID를 붙여(https://yourdomain.my.salesforce.com/<id>) 어떤 레코드인지 확인하세요.

같은 작업이 관리자는 되는데 일반 사용자는 실패하는 이유는 무엇인가요?

관리자는 보통 공유 모델을 우회하는 "View All"/"Modify All" 또는 "Modify All Data"를 가지고 있습니다. 일반 사용자는 관련 레코드의 개체 권한, 필드 수준 보안, 또는 레코드 수준 공유에 막힙니다. 영향받는 사용자로 직접 작업을 재현해 원인을 좁혀 보세요.

Flow를 system context로 실행하면 실제 권한 문제를 가리게 되나요?

그럴 수 있습니다. system context는 실행 사용자의 공유 및 CRUD/FLS를 무시하므로 오류는 사라지지만, UI에서는 가지면 안 되는 접근 권한을 부여할 수 있습니다. 의도적으로만 사용하고, 해당 사용자가 정말로 관련 레코드에 접근해도 되는지 확인하세요.

삭제되었거나 존재하지 않는 레코드 때문에 이 오류가 발생할 수도 있나요?

네. lookup이 삭제된 레코드, 처음부터 존재하지 않은 레코드를 가리키거나 ID가 비어 있거나 형식이 잘못된 경우, Salesforce는 "찾을 수 없음"이 아니라 접근 권한 부족으로 보고합니다. 참조된 ID가 여전히 살아 있는 레코드로 연결되는지 확인하세요.

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

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

얼리 액세스 신청