Snowflake Data Clean Room 정책 이해하기

Snowflake Data Clean Room 정책 이해하기

클린룸은 콜라보레이터가 데이터를 어떻게 사용할 수 있는지 제어하는 데이터 정책을 구현할 수 있어요. 이 정책들은 클린룸에 링크된 기본 테이블에 설정된 Snowflake 테이블 정책에 추가로 적용돼요.

출처: Understanding Snowflake Data Clean Room policies

본문

지원 종료(EOL) 공지

레거시 Provider 및 Consumer 데이터 클린룸은 지원이 중단되고 있어요. 날짜와 마이그레이션 지침은 지원 종료 타임라인을 참고하세요.

클린룸은 콜라보레이터가 데이터를 어떻게 사용할 수 있는지 제어하는 데이터 정책을 구현할 수 있어요. 이 정책들은 클린룸에 링크된 기본 테이블에 설정된 Snowflake 테이블 정책에 추가로 적용돼요.

클린룸의 각 콜라보레이터는 자신의 데이터에 정책을 설정할 수 있어요. 정책은 다른 사용자의 요청에만 적용되고, 자신의 요청에는 적용되지 않아요. 예를 들어 조인 정책이 컬럼 A에 대해서만 조인을 허용한다면, 다른 사용자는 컬럼 A로만 조인할 수 있게 제한되지만 당신은 자신의 어떤 컬럼으로든 조인할 수 있어요.

클린룸 정책은 클린룸 API 또는 UI를 사용해 설정할 수 있어요.

정책 검사를 구현하려면 다음이 참이어야 해요:

  • 데이터 소유자가 자신의 클린룸에 정책을 설정해야 해요. 정책은 API 또는 UI로 설정해요. 각 정책 유형은 개별적으로 설정돼요. 클린룸은 컬럼 정책, 행 정책, 활성화 정책을 기본적으로 구현해요. 클린룸 정책은 가산적(additive)이지 않아요. 즉 클린룸 정책을 설정하면 이전의 모든 값이 삭제돼요.
-- Sets a join policy on column HASHED_EMAIL.
CALL samooha_by_snowflake_local_db.provider.set_join_policy(
  'my_provider_cleanroom',
  ['my_db.my_sch.T1:HASHED_EMAIL']);

-- Replaces the previous join policy. Now the only column in the join policy is AGE_BND.
CALL samooha_by_snowflake_local_db.provider.set_join_policy(
  'my_provider_cleanroom',
  ['my_db.my_sch.T1:AGE_BAND']);
  • 템플릿이 템플릿의 적절한 위치에서 정책을 검사해야 해요. 클린룸 정책은 템플릿의 컬럼에 적절한 정책 필터가 적용된 경우에만 검사돼요. 데이터를 보호하려고 클린룸 정책을 설정했다면, 템플릿을 살펴보고 템플릿이 기대한 대로 정책을 적용하는지 확인해야 해요. 다음 템플릿은 col1이 데이터 소유자의 컬럼 정책에서 허용되는지 검사해요:
SELECT
  IDENTIFIER( {{ col1 | column_policy }} )
FROM {{ source_table[0] }} AS c;

다음 템플릿은 col1에 클린룸 정책이 있는지 검사하지 않아요:

SELECT
  IDENTIFIER( {{ col1 }})
FROM {{ source_table[0] }} AS c;

클린룸은 각 정책 유형에 대해 다른 템플릿 필터를 지원해요. 하지만 필터의 의미론은 검사하지 않고, 그 필터 유형에 대해 컬럼이 정책에 있는지만 검사해요. 예를 들어 다음 스니펫에서 col1이 실제로 조인되지 않는데도 col1에 대해 조인 정책이 검사돼요. col1이 데이터 소유자의 조인 정책에 있으면 쿼리가 성공하고, 없으면 쿼리가 차단돼요.

SELECT
  IDENTIFIER( {{ col1 | join_policy }})
FROM {{ source_table[0] }} AS c;

참고

컬럼 정책 검사는 템플릿 JinjaSQL이 파싱될 때 수행돼요. 와일드카드가 있는 쿼리는 이 검사로 잡히지 않을 수 있으므로, 분석 템플릿을 설계할 때 주의해야 해요. 어떤 컬럼을 정말로 절대 쿼리하면 안 된다면, 소스 테이블에서 그 민감한 컬럼을 제거한 뷰를 만들고 그 뷰를 링크하는 것을 고려하세요.

클린룸의 Snowflake 정책

테이블을 클린룸에 링크하면 소스 테이블의 Snowflake 테이블 정책은 클린룸의 링크된 테이블에서도 적용되지만, 이 정책들이 클린룸 API나 UI로 반드시 보고되는 것은 아니에요. 예를 들어 Snowflake 조인 정책은 클린룸에서 계속 적용되지만, consumer.view_provider_join_policy나 consumer.view_join_policy를 호출해도 그 조인 정책은 보이지 않아요. 따라서 기본 링크 테이블에서 정책을 제거하거나, 동등한 클린룸 정책(존재한다면)을 만들거나, 이 정책들의 존재를 콜라보레이터에게 명확히 알려서 그들의 쿼리가 실패하거나 예기치 않게 동작하지 않게 해야 해요("이 컬럼에 조인할 수 없는 이유가 뭐지?").

소스 테이블의 Snowflake 정책 변경은 클린룸의 링크된 뷰에 자동으로 전파돼요.

Snowflake 프라이버시 정책은 보호된 테이블에서 뷰를 만드는 것을 방지하므로, 프라이버시 정책이 있는 테이블은 링크할 수 없어요.

다음 정책이 클린룸에 직접 적용될 수 있어요:

  • 조인 정책

조인 정책(Join policies)

조인 정책을 설정하면 클린룸의 어떤 템플릿이든 데이터에서 조인할 수 있는 컬럼을 나타내요. (반면 Snowflake 조인 정책은 어떤 컬럼에 조인해야 하는지를 지정해요.) 조인 정책은 클린룸의 모든 템플릿에 적용돼요.

컬럼은 조인 정책과 컬럼 정책 둘 다에 동시에 있을 수 없지만, 조인 정책과 활성화 정책에는 동시에 있을 수 있어요.

조인 정책 구현

템플릿이 컬럼에 join_policy 또는 join_and_column_policy 필터를 적용하는 경우에만 클린룸 조인 정책이 그 컬럼에 대해 적용돼요.

템플릿이 컬럼에 대해 조인 정책을 검사하는데, 클린룸에 설정된 조인 정책이 없거나 그 컬럼이 조인 정책에 없으면 쿼리는 차단돼요.

다음 코드는 제공자나 소비자로서 조인 정책을 설정하는 방법을 보여줘요. 정책은 다른 계정이 실행하는 쿼리에만 적용된다는 점을 기억하세요.

-- Set join policies on two columns in a clean room where you are a provider.
CALL samooha_by_snowflake_local_db.provider.set_join_policy(
  'my_provider_cleanroom',
  ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HASHED_EMAIL', 'MYDB.MYSCH.EXPOSURES:HASHED_EMAIL']);

-- Set join policies on two columns in a clean room where you are a consumer.
CALL samooha_by_snowflake_local_db.consumer.set_join_policy(
  'my_consumer_cleanroom',
  ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HASHED_EMAIL', 'MYDB.MYSCH.EXPOSURES:HASHED_EMAIL']);

코드에서 조인 정책을 보거나 관리하는 데 사용하는 프로시저는 다음과 같아요:

  • consumer.set_join_policy
  • consumer.view_provider_join_policy
  • consumer.view_join_policy
  • provider.view_join_policy
  • provider.set_join_policy

컬럼 정책(Column policies)

컬럼 정책을 설정하면 특정 템플릿의 분석 결과에서 프로젝션할 수 있는 컬럼을 나타내요. 컬럼 정책은 특정 클린룸의 특정 템플릿에 적용돼요.

컬럼은 조인 정책과 컬럼 정책에 동시에 있을 수 없어요. 컬럼은 활성화 정책과 컬럼 정책에 동시에 있을 수 있어요.

컬럼 정책 구현

템플릿이 column_policy 또는 join_and_column_policy 필터를 사용하는 경우에만 클린룸 컬럼 정책이 그 컬럼에 대해 적용돼요.

클린룸이 컬럼에 대해 컬럼 정책을 검사하는데, 그 컬럼이 컬럼 정책에 없거나 클린룸에 컬럼 정책이 없으면 쿼리는 차단돼요.

다음 코드는 prod_overlap_analysis 템플릿으로 접근할 때 세 컬럼에 대한 컬럼 정책을 설정하는 방법을 보여줘요. 예시는 제공자와 소비자 양쪽에서 정책을 설정하는 방법을 보여줘요. 정책은 다른 계정이 실행하는 쿼리에만 적용된다는 점을 기억하세요.

-- Set column policy check on prod_overlap_analysis template in a clean room where
-- you are a provider.
call samooha_by_snowflake_local_db.provider.set_column_policy(
  'my_provider_cleanroom',
  ['prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:STATUS',
   'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:AGE_BAND',
   'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:DAYS_ACTIVE']);

-- Set column policy check on prod_overlap_analysis template in a clean room where
-- you are a consumer.
call samooha_by_snowflake_local_db.consumer.set_column_policy(
  'my_consumer_cleanroom',
  ['prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:STATUS',
   'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:AGE_BAND',
   'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:DAYS_ACTIVE']);

코드에서 컬럼 정책을 보거나 관리하는 데 사용하는 프로시저는 다음과 같아요:

  • consumer.set_column_policy
  • consumer.view_column_policy
  • consumer.view_provider_column_policy
  • provider.set_column_policy
  • provider.view_column_policy

활성화 정책(Activation policies)

활성화 정책을 설정하면 활성화 템플릿이 활성화할 수 있는 컬럼을 나타내요. 활성화는 쿼리 결과를 제공자 또는 소비자의 Snowflake 계정 테이블이나 제3자 활성화 커넥터로 저장해요.

컬럼은 활성화 정책뿐 아니라 다른 어떤 정책에도 속할 수 있어요.

활성화 정책 구현

템플릿이 활성화를 허용하면 활성화 정책은 클린룸 UI에서 설정할 수 있어요.

활성화 정책은 특정 템플릿의 특정 컬럼에 대해 설정돼요.

템플릿이 컬럼에 activation_policy 필터를 적용하는 경우에만 활성화 정책이 그 컬럼에 대해 적용돼요.

다음 코드는 클린룸에서 HASHED_EMAIL과 REGION_CODE 컬럼이 활성화되도록 허용하는 활성화 정책을 설정하는 방법을 보여줘요. 이 정책은 클린룸의 모든 사용자와 모든 활성화 템플릿에 영향을 줘요. 클린룸의 제공자와 소비자에 대해 동등한 프로시저가 있어요. 클린룸에서 자신의 역할을 반영하는 프로시저를 호출하세요.

-- Set activation policy check on prod_overlap_analysis template in a clean room where you are a provider
call samooha_by_snowflake_local_db.provider.set_activation_policy('my_cleanroom', [
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HASHED_EMAIL',
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:REGION_CODE' ]);

-- Set activation policy check on prod_overlap_analysis template in a clean room where you are a consumer
call samooha_by_snowflake_local_db.consumer.set_activation_policy('my_cleanroom', [
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE_NAME.DEMO.CUSTOMERS:HASHED_EMAIL',
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE_NAME.DEMO.CUSTOMERS:REGION_CODE' ]);

다음 템플릿은 호출자가 col1에 전달한 값이 호출자의 활성화 정책에 있는지 검사해요. 활성화 정책이 위와 같이 설정되었다면, 활성화할 수 있는 유일한 컬럼은 HASHED_EMAIL과 REGION_CODE예요.

BEGIN
  CREATE OR REPLACE TABLE cleanroom.activation_data_analysis_results AS
    SELECT {{ col1 | sqlsafe | activation_policy }}
    FROM IDENTIFIER({{ my_table[0] }}) AS c
    RETURN 'analysis_results';
END;

코드에서 활성화 정책을 관리하는 데 사용하는 프로시저는 다음과 같아요:

  • consumer.set_activation_policy
  • provider.set_activation_policy

집계 정책(Aggregation policies)

집계 정책은 테이블에 대한 모든 쿼리에 집계(GROUP BY, COUNT 및 기타 함수)가 포함되도록 요구하고, 결과 그룹당 최소 행 수를 지정하며, 충족하지 않으면 그 그룹이 결과에서 생략돼요.

클린룸은 자체 집계 정책 구현이 없어요. 링크된 데이터에 집계 제약을 적용하려면 소스 테이블에 집계 정책을 적용하거나, 템플릿에 집계 제약을 구현해요.

일부 Snowflake 제공 템플릿은 사용자나 템플릿에 설정된 threshold와 threshold_value 파라미터를 사용해요. 이 값들은 클린룸 UI에서 수정하거나 provider.add_consumers 또는 provider/consumer.set_privacy를 호출해 수정할 수 있어요. 소비자에게 설정된 경우 템플릿에서 이 값들에 접근할 수 있어요.

더 알아보기