Databricks Unity Catalog ABAC 컨텍스트 속성: AI 에이전트가 사용자를 대신해 읽을 때 데이터 접근을 OAuth 컨텍스트로 제한하는 방법
AI 에이전트가 데이터 플랫폼에 쿼리를 보낼 때 두 가지 요청이 겉으로 동일하게 보인다. 사용자가 직접 SQL을 실행하는 것과, 에이전트가 사용자를 대신해 같은 SQL을 실행하는 것. 반환 결과도 동일하다. 하지만 둘을 동일하게 취급해서는 안 되는 경우가 많다.
사용자는 HR 데이터베이스의 전체 급여 정보를 볼 수 있다. 하지만 그 사용자가 연결한 AI 에이전트는 자신 부서의 데이터만 볼 수 있어야 할 수 있다. 에이전트가 잘못 설계됐을 때, 또는 공격자가 에이전트를 통해 권한을 초과해 데이터를 추출하려 할 때를 대비해야 하기 때문이다. 이것은 에이전트 시대의 새로운 거버넌스 문제다.
Databricks가 2026년 8월에 Beta로 공개한 ABAC 컨텍스트 속성은 이 문제를 Unity Catalog의 정책 레이어에서 직접 다룬다. 동일한 테이블에 대해, 누가 호출하는지(어떤 OAuth 앱)와 어떤 방식으로 호출하는지(위임 접근 여부)에 따라 다른 행을 반환하거나 다른 열 값을 보여줄 수 있다.
기존 ABAC 모델의 공백
Unity Catalog의 기존 ABAC는 두 가지 속성 유형을 지원한다.
그룹 기반: 사용자가 속한 그룹(current_groups())을 WHEN 조건으로 쓴다. "analytics 팀만 PII 열을 볼 수 있다"는 규칙이 여기에 해당한다.
사용자 기반: 현재 사용자의 이메일(current_user())로 조건을 거는 방식이다.
두 방식 모두 누가 쿼리를 보내는지를 기준으로 삼는다. 하지만 에이전트 환경에서는 어떻게 보내는지도 중요하다. 같은 사용자가 직접 쿼리할 때와 에이전트를 통해 위임 요청할 때를 구분할 방법이 없었다.
2026년 8월 릴리스는 두 가지 새 속성 유형을 추가했다.
- 컨텍스트 속성 (Context Attributes): OAuth 요청 컨텍스트 정보
- 신원 속성 (Identity Attributes): IdP에서 동기화된 사용자 속성
컨텍스트 속성: OAuth 요청 컨텍스트로 제어
컨텍스트 속성은 현재 API 요청의 OAuth 메타데이터를 ABAC 조건에 노출한다.
지원되는 두 가지 컨텍스트 속성:
| 속성명 | 타입 | 설명 |
|---|---|---|
request.client_id | 문자열 | 호출한 OAuth 앱의 클라이언트 ID |
request.is_on_behalf_of | 불리언 | 에이전트가 사용자를 대신해 실행 중이면 true |
이 속성들은 행 필터(Row Filter)와 컬럼 마스크(Column Mask) 정책의 WHEN 조건에서 두 함수로 참조한다.
-- 컨텍스트 속성이 존재하는지 확인
has_context_attribute('request.is_on_behalf_of')
-- 컨텍스트 속성이 특정 값인지 확인
has_context_attribute_value('request.client_id', 'agent-app-id-xyz')실제 정책 패턴
패턴 1: 에이전트 위임 요청 시 PII 열 마스킹
인사 데이터베이스에서 salary 열을 정책으로 보호한다. 사용자가 직접 쿼리하면 실제 값을, 에이전트가 위임 요청으로 쿼리하면 마스킹된 값을 반환한다.
CREATE FUNCTION hr.salary_mask(salary DOUBLE)
RETURN CASE
WHEN has_context_attribute_value('request.is_on_behalf_of', 'true')
THEN -1.0 -- 마스킹된 sentinel 값
ELSE salary
END;
ALTER TABLE hr.employees
SET COLUMN MASK (salary) USING COLUMNS (salary) hr.salary_mask;패턴 2: 특정 에이전트 앱에서의 행 필터
특정 OAuth 앱(예: 고객 지원 에이전트)은 자신이 담당하는 테넌트의 데이터만 볼 수 있어야 한다.
CREATE FUNCTION support.ticket_filter(tenant_id STRING)
RETURN CASE
WHEN has_context_attribute_value('request.client_id', 'support-agent-app')
THEN tenant_id = session_context('x-agent-tenant')
ELSE TRUE -- 직접 접근 시 모든 행 반환
END;패턴 3: 사용자 직접 접근은 허용, 에이전트 경유는 차단
특정 테이블은 에이전트 접근 자체를 차단한다.
CREATE FUNCTION finance.deny_agent_access()
RETURN NOT has_context_attribute_value('request.is_on_behalf_of', 'true');
ALTER TABLE finance.payroll
SET ROW FILTER finance.deny_agent_access USING ();아키텍처: 컨텍스트 속성이 흐르는 경로
요청 흐름 설명:
- 사용자가 직접 쿼리하면 직접 인증 토큰이 발급된다. Unity Catalog는
request.is_on_behalf_of = false로 판단하고, 행 필터 조건이true를 반환하면 모든 행을 반환한다.
- 에이전트가 OAuth 위임 토큰(On-Behalf-Of 토큰)으로 같은 쿼리를 보내면, Unity Catalog는 토큰에서
is_on_behalf_of = true와client_id를 추출한다. 정책의 WHEN 절이 평가되고, 해당되는 행 필터·컬럼 마스크가 적용된다.
신원 속성: IdP 소스 사용자 속성
컨텍스트 속성이 "어떻게 호출했는가"를 다룬다면, 신원 속성은 "누가 호출했는가"를 더 풍부하게 표현한다.
Databricks는 Okta, Azure Active Directory 등 IdP와 SCIM 동기화를 통해 각 계정 사용자에게 IdP 속성을 연결한다. 설정 가능한 속성은 department, title, cost_center, country, city, division 등 최대 9개다.
정책에서 이 속성을 사용하려면 user_attribute() 함수를 쓴다:
-- 재무 부서 사용자만 수익 데이터를 볼 수 있도록
CREATE FUNCTION revenue.dept_filter()
RETURN user_attribute('department') = 'Finance';
ALTER TABLE revenue.quarterly_results
SET ROW FILTER revenue.dept_filter USING ();컨텍스트 속성과 신원 속성을 조합하면 더 세밀한 제어가 가능하다:
-- 재무 부서 사용자가 직접 접근할 때만 전체 데이터 허용
CREATE FUNCTION revenue.combined_filter()
RETURN (
user_attribute('department') = 'Finance'
AND NOT has_context_attribute_value('request.is_on_behalf_of', 'true')
);ABAC GRANT: 에이전트 서비스와 MCP 서비스 태그 기반 권한 부여
기존에는 ABAC GRANT 정책이 모델에만 적용됐다. 2026년 8월 릴리스에서 다음 대상으로 확장됐다:
- 모델 서비스(Model Serving Endpoints)
- 모델 제공자 서비스(Model Provider Endpoints)
- MCP 서비스 (Model Context Protocol Endpoints)
- 에이전트 서비스(Agent Services)
ABAC GRANT 정책은 유니티 카탈로그 거버넌스 태그(Governed Tags) 조건이 맞는 보안 객체(Securable)에 동적으로 권한을 부여한다:
-- 'team:analytics' 태그가 붙은 모델 서비스에만 테이블 SELECT 권한을 자동 부여
CREATE ABAC GRANT SELECT ON TABLE analytics.events
CONDITION TAG('team') = 'analytics'
TO model_serving_endpoints;이 정책을 MCP 서비스에 적용하면: 특정 태그가 있는 MCP 서버만 해당 테이블에 접근할 수 있다. 태그가 없거나 다른 팀 태그를 가진 MCP 서버는 자동으로 차단된다.
운영 고려사항
정책 평가 비용: 행 필터는 모든 행 반환 전에 함수를 평가한다. has_context_attribute_value 호출 자체는 가볍지만, 함수 내부 조인이 있다면 전체 쿼리 성능에 영향을 준다. 필터 함수를 단순하게 유지할 것.
테스트: AS OF 또는 임시 세션 컨텍스트로 정책을 사전 테스트하기 어렵다. Databricks는 EXPLAIN 또는 별도 테스트 계정(에이전트 OAuth 앱으로 인증)을 통해 검증을 권장한다.
감사 로그: ABAC 정책이 적용된 쿼리는 Unity Catalog 감사 로그에 policy_applied: true와 해당 정책 이름을 기록한다. 에이전트 오용 탐지에 활용할 수 있다.
이중 접근 경로 설계: 에이전트와 사람이 같은 테이블을 다르게 보아야 한다면, 뷰를 별도로 만드는 것보다 컨텍스트 속성 기반 정책이 단일 진실 소스를 유지하는 데 유리하다.
요약
| 속성 유형 | 기능 | 상태 |
|---|---|---|
컨텍스트 속성 (request.client_id, request.is_on_behalf_of) | OAuth 요청 컨텍스트 기반 행/열 제어 | Beta (2026-08) |
신원 속성 (department, title, cost_center 등) | IdP 동기화 사용자 속성 기반 제어 | Beta (2026-08) |
| ABAC GRANT + MCP/에이전트 서비스 | 태그 기반 동적 권한 부여 확장 | Beta (2026-08) |
AI 에이전트가 데이터 플랫폼의 기본 접근 경로가 되는 흐름 속에서, 거버넌스 레이어도 이 차이를 인식해야 한다. 컨텍스트 속성은 "에이전트는 사용자보다 더 적게 본다"는 정책을 애플리케이션 코드가 아니라 카탈로그 정책으로 표현하는 방법이다.