집계 정책을 사용하여 엔터티 수준 개인정보 보호 구현하기

엔터티 수준의 개인정보 보호는 집계 정책에서 제공하는 개인정보 보호 기능을 강화합니다. 엔터티 수준 프라이버시를 통해 Snowflake는 각 그룹에 최소 행 수뿐만 아니라 최소 수의 고유 엔터티가 포함되도록 보장할 수 있습니다.

집계 정책과 관련된 대부분의 작업 및 고려 사항은 엔터티 수준의 개인정보 보호 구현 여부와 관계없이 동일합니다. 집계 정책 작업에 대한 일반 정보는 집계 정책 섹션을 참조하십시오.

엔터티 수준 개인정보 보호 정보

엔터티 는 논리적 오브젝트(예: 사용자 프로필이나 가구 정보)에 속한 특성 세트를 나타냅니다. 이러한 특성은 데이터 세트 내의 엔터티를 식별하기 위한 용도로 사용할 수 있습니다. 엔터티 수준 개인정보 보호는 공유 데이터 세트에 저장된 엔터티의 개인정보를 보호하는 개인정보 보호 강화 기술(PET)의 기능입니다. 이는 해당 특성이 여러 레코드에서 발견되더라도 쿼리에서 엔터티의 민감한 특성이 노출되지 않도록 합니다.

엔터티 수준의 프라이버시를 달성하기 위해 Snowflake를 사용하면 엔터티를 식별하는 열(엔터티 키)을 지정할 수 있습니다. 이를 통해 Snowflake는 데이터 세트 내의 특정 엔터티에 속하는 모든 레코드를 식별할 수 있습니다. 예를 들어 엔터티 키가 email 열로 정의된 경우, Snowflake는 email=joe.smith@example.com 가 속한 모든 레코드가 동일한 엔터티에 속하는 것으로 판단할 수 있습니다.

테이블에 대해 여러 엔터티를 정의하는 경우 집계 정책은 각 엔터티 키에 대해 개별적으로 평가됩니다.

키 열이 쿼리에 나타나지 않더라도 정책이 쿼리에 적용됩니다. 예를 들어, 엔터티 키(user_id)에 적용되는 정책이 있는 경우 SELECT age FROM T1 GROUP BY age; 쿼리는 쿼리에 user_id 가 나타나지 않더라도 각 그룹의 user_id 에 대해 min_group_size 제한을 적용합니다.

엔터티 수준 개인정보 보호가 없는 집계 정책

기본적으로 집계 정책에서는 분석가가 개별 행을 검색하는 대신 데이터를 집계하는 쿼리를 실행해야 하므로 행 수준의 개인정보 보호 가 달성됩니다. 그러나 행 수준 프라이버시는 해당 특성이 여러 행(예: 트랜잭션 데이터가 포함된 테이블)에서 발견되는 경우 쿼리에서 엔터티의 특성이 노출되는 것을 방지하지 못합니다.

예를 들어, 스트리밍 서비스 ActonViz에 프로그램을 시청하는 각 시청자의 이메일 주소(user_id) 및 가구(household_id)가 포함된 트랜잭션 테이블이 있다고 가정해 보겠습니다.

user_id

household_id

program_id

watch_time

시작_시간

dave_sr@example.com

12345

1

29

2023-09-12 09:00

mary@bazco.com

23485

1

30

2023-09-12 09:00

dave_sr@example.com

12345

6

18

2023-09-11 13:00

joe@jupiterlink.com

85456

6

25

2023-09-15 22:00

junior@example.com

12345

5

30

2023-09-13 11:00

ActonViz는 광고주가 최소 2개의 레코드가 포함된 그룹으로 데이터를 집계하도록 강제하기 위해 집계 정책을 사용할 수 있습니다. 이를 통해 광고주가 개별 레코드에서 데이터를 검색하는 것을 방지할 수 있습니다(행 수준 개인정보 보호). 각 시청자 및 가구가 테이블에 한 번만 나타나면 개인 정보를 보호하기에 충분합니다.

하지만 광고주의 쿼리를 통해 시청자와 시청자의 가구에 대한 정보를 파악할 수 있습니다. 쿼리를 통해 가구 12345 의 레코드로만 구성된 그룹이 생성되거나, 더 심하게는 시청자 dave_sr 의 레코드로만 구성된 그룹이 생성될 수도 있습니다. 두 경우 모두 그룹의 레코드 수가 ActonViz에서 설정한 요구 사항(그룹당 최소 2개 레코드)을 충족합니다.

엔터티 수준 개인정보 보호 기능이 있는 집계 정책

엔터티 수준의 개인 정보 보호를 달성하기 위해 Snowflake를 사용하면 테이블 또는 뷰에 집계 정책을 할당할 때 1개 이상의 엔터티 키를 지정할 수 있습니다. 엔터티 키가 정의된 후 집계 제약이 있는 테이블 또는 뷰에 대한 쿼리가 반환하는 그룹에는 지정된 수의 이 아니라 지정된 수 이상의 엔터티 가 포함되어야 합니다.

앞의 예제에서 ActonViz는 각 가구를 고유하게 식별하기 때문에 household_id 를 엔터티 키로 정의한다고 가정해 보겠습니다. 이제 각 가정의 프라이버시가 개선되었습니다. 변경 전에는 그룹이 household_id = 12345 인 레코드로만 구성될 수 있었지만, 이제 그룹에는 최소 두 개의 고유 household_id 값이 포함되어야 합니다.

엔터티 키가 항상 테이블의 기본 키 와 동일한 것은 아닙니다. 이 예제에서 테이블은 뷰어를 고유하게 식별하기 때문에 user_id 를 기본 키로 사용할 수 있습니다. 하지만 이 경우 ActonViz는 여러 시청자로 구성된 전체 가구의 개인 정보를 보호하고 싶었기 때문에 엔터티 키로 household_id 를 선택했습니다.

최소 그룹 크기 정보

모든 집계 정책은 최소 그룹 크기를 지정합니다. 엔터티 수준의 개인정보 보호가 없으면 최소 그룹 크기는 집계 그룹에 포함되어야 하는 레코드 수를 정의합니다. 엔터티 키가 지정된 경우 최소 그룹 크기는 최종 결과에 표시되기 위해 그룹에 표시되어야 하는 고유 엔터티의 최소 수를 정의합니다. SUM 및 AVG 같은 집계 함수는 1개의 그룹을 반환하는 반면, GROUP BY 열은 그룹화된 열의 고유 값당 1개의 그룹을 반환한다는 점을 기억하십시오.

다음 열 수준 정책은 Snowflake가 집계 그룹에 충분한 엔터티가 있는지 계산하는 방법에 영향을 미치지 않습니다.

  • 프로젝션 정책은 집계 정책 이후에 적용됩니다.

  • 마스킹 정책은 집계 정책보다 먼저 적용됩니다. 모든 집계 함수 또는 정책은 마스킹된 데이터에 대해 작동합니다.

이름 참조가 여러 번 사용되는 경우(예제: JOIN 또는 UNION 연산자) Snowflake는 각 데이터 세트의 각 이름 참조에 대한 최소 그룹 크기를 개별적으로 적용합니다. 이는 참조가 동일한 데이터 세트를 여러 번 가리키는 경우에도 적용됩니다.

집계 정책으로 엔터티 수준의 개인정보 보호 적용

집계 정책을 사용하여 엔터티 수준의 개인정보 보호를 적용하려면 다음을 수행합니다.

  1. 집계 정책 생성을 위해 CREATE AGGREGATION POLICY 명령을 실행할 때 각 집계 그룹에 포함해야 하는 엔터티의 수를 지정 합니다.

  2. 테이블 또는 뷰에 집계 정책을 할당할 때 엔터티 키를 정의 합니다.

최소 엔터티 수 지정

엔터티 키를 사용하여 엔터티 수준의 개인 정보 보호를 수행하는 경우 CREATE AGGREGATION POLICY 를 사용하여 집계 정책을 생성하는 구문은 변경되지 않습니다. AGGREGATION_CONSTRAINT 함수의 MIN_GROUP_SIZE 인자를 사용하여 최소 그룹 크기를 지정하는 기능은 계속 제공됩니다. 엔터티 키를 정의 하는 즉시 최소 그룹 크기가 그룹 내 레코드 수에 대한 요구 사항에서 그룹 내 엔터티 수로 변경됩니다.

예를 들어, 다음 코드는 최소 그룹 크기가 5인 집계 정책을 생성합니다. 정책을 테이블에 할당할 때 엔터티 키를 정의하는 한, 각 집계 그룹에는 최소 5개의 엔터티가 포함되어야 합니다.

CREATE AGGREGATION POLICY my_agg_policy
  AS () RETURNS AGGREGATION_CONSTRAINT ->
  AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);
Copy

다양한 상황에서 다양한 제한을 적용하는 조건부 집계 정책의 예를 포함하여 집계 정책 생성에 대한 전체 세부 정보는 집계 정책 만들기 섹션을 참조하십시오.

엔터티 키 정의

테이블이나 뷰에 집계 정책을 할당할 때 테이블의 엔터티 키를 정의합니다. 새 테이블 또는 뷰를 생성 하거나 기존 뷰 테이블을 업데이트 할 때 엔터티 키를 정의할 수 있습니다.

기존 테이블 및 뷰에 대한 엔터티 키 정의

ALTER TABLE … SET AGGREGATION POLICY 명령 또는 ALTER VIEW … SET AGGREGATION POLICY 명령을 실행하여 집계 정책을 할당할 때 ENTITY KEY 절을 사용하여 테이블 또는 뷰에서 엔터티의 식별 특성(즉, 엔터티 키)을 포함하는 열을 지정합니다.

예를 들어, viewership_log 테이블에 집계 정책 my_agg_policy 을 할당하면서 엔터티 키를 생성하려면 다음을 실행합니다.

ALTER TABLE viewership_log
  SET AGGREGATION POLICY my_agg_policy
  ENTITY KEY (first_name,last_name);
Copy

first_namelast_name 은 엔터티 키이므로 집계 정책은 first_name = joelast_name = peterbilt 가 있는 모든 행이 동일한 엔터티에 속한다고 판단할 수 있습니다.

기존 테이블 및 뷰에 대한 여러 엔터티 키 정의

기존 테이블에 대해 여러 엔터티 키를 정의하려면 여러 호출에서 새 키를 추가하거나 한 번의 호출로 여러 키를 추가할 수 있습니다. 테이블에 키를 정의하는 것은 추가 기능이며 이전에 정의된 키를 덮어쓰거나 삭제하지 않습니다.

두 번의 호출로 2개의 엔터티 키를 추가합니다. 첫 번째 키는 2개의 열로 구성됩니다.

ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (user_id, user_email);
ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (vendor_id);
Copy

한 번의 호출로 2개의 엔터티 키 추가하기

ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (user_id) ENTITY KEY (vendor_id);
Copy

새 테이블 및 뷰에 대한 엔터티 키 정의

CREATE TABLE … WITH AGGREGATION POLICY 명령 또는 CREATE VIEW … WITH AGGREGATION POLICY 명령을 실행하여 집계 정책을 할당할 때 ENTITY KEY 절을 사용하여 테이블 또는 뷰에서 엔터티의 식별 특성을 포함하는 열을 지정합니다.

예를 들어, 집계 정책을 할당하고 엔터티 키를 정의하면서 새 테이블 t1 을 생성하려면 다음을 실행합니다.

CREATE TABLE t1
  WITH AGGREGATION POLICY my_agg_policy
  ENTITY KEY (first_name,last_name);
Copy

first_namelast_name 은 엔터티 키이므로 집계 정책은 first_name = joelast_name = peterbilt 가 있는 모든 행이 동일한 엔터티에 속한다고 판단할 수 있습니다.

지연된 집계 정책

쿼리에 하위 쿼리가 있는 경우, Snowflake는 가장 안쪽 쿼리에 엔터티 집계 정책을 적용하려고 시도합니다. 해당 쿼리에 GROUP BY 절이 있고 GROUP BY 열이 집계 정책의 엔터티 키와 일치하는 경우 해당 집계 정책은 해당 하위 쿼리가 아니라 해당 하위 쿼리의 상위 항목에 적용됩니다. 이 연기는 정책의 엔터티 키와 일치하는 GROUP BY 열 세트가 없는 쿼리에 도달하거나 최상위 쿼리에 도달할 때까지 계속되며, 두 경우 모두 해당 쿼리에 집계 정책이 적용됩니다. 집계 정책은 쿼리 체인에서 한 번만 적용됩니다.

예를 들어, 엔터티 키가 (name, zipcode) 인 집계 정책 my_agg_policy 가 있다고 가정해 보겠습니다. 다음 의사 쿼리에서 내부 쿼리에는 my_agg_policy 에 대한 엔터티 키와 일치하는 GROUP BY 세트가 있으므로 정책이 상위 항목으로 지연됩니다. GROUP BY 열이 정책 열과 일치하더라도 상위 항목인 쿼리이므로 정책이 상위 항목에 적용됩니다.

SELECT age, name, zipcode FROM(                        -- Outermost query: my_agg_policy enforced.
  SELECT name, zipcode FROM T GROUP BY name, zipcode   -- Matches my_agg_policy entity key: my_agg_policy deferred
)
  GROUP BY age, name, zipcode;
Copy

GROUP BY 열은 엔터티 키 열의 상위 집합이 되어 지연을 트리거할 수 있으며, 정책은 GROUP BY 열이 일치하는 경우에만 지연되며, 집계 함수는 지연을 트리거하지 않는다는 점에 유의하십시오.

각 집계 정책은 쿼리의 모든 쿼리 블록에 개별적으로 적용됩니다. 세트 연산자 (예: UNION)를 통해 여러 블록으로 구성된 쿼리는 각 쿼리 블록에 대해 집계 정책을 개별적으로 평가합니다.

집계 유예에는 몇 가지 유용한 효과가 있으며, 다음 예제에서 이를 확인할 수 있습니다.

연기 예시

(zipcode, email) 로 정의된 엔터티에 대해 사용자를 ‘저소비자’와 ‘고소비자’라는 2개의 버킷으로 집계한다고 가정해 보겠습니다. 지연을 사용하면 다음 예시와 같이 작동합니다. 지연이 없으면 각 그룹은 1개의 (zipcode, email) 엔터티로 구성되므로 내부 쿼리는 NULL 을 반환하며, 이는 min_group_size 가 1보다 큰 값으로 설정될 때 표시되지 않습니다.

WITH bucketed AS (
  SELECT
    CASE
      WHEN SUM(transaction_amount) BETWEEN 0 AND 100 THEN 'low'
      WHEN SUM(transaction_amount) BETWEEN 101 AND 100000 THEN 'high'
    END AS transaction_bucket,
    zipcode,               -- zipcode and email need not appear in the select list, but this lets us compute entity_count below
    email
  FROM my_transactions
  GROUP BY zipcode, email  -- This would not work if it was only GROUP BY zipcode, since the entity key is (zipcode, email)
)
SELECT
  transaction_bucket,
  COUNT(DISTINCT zipcode, email) AS entity_count
FROM
  bucketed
GROUP BY transaction_bucket;
Copy

다중 정책 연기

테이블에 여러 개의 집계 정책이 있는 경우 각 집계 정책은 독립적으로 평가되고 지연될 수 있습니다. 테이블에 여러 개의 집계 정책이 있는 경우 쿼리 수준마다 다른 정책이 적용되면 예기치 않은 결과가 발생할 수 있으므로 쿼리를 신중하게 설계하십시오.

예를 들어, 2개의 개별 집계 정책이 있는 테이블에서 사용자를 고비용 및 저비용 카테고리로 버킷화하기 위해 중첩 쿼리를 시도하는 경우 발생할 수 있는 문제는 다음과 같습니다.

테이블 T:

user_id, vendor_id, zipcode, email,         transaction_amount
   1     1001       90000    a@example.com        100
   1     1001       90000    a@example.com         50
   2     2001       90001    b@example.com         12
   2     2001       90001    b@example.com          5
   3     3001       90002    c@example.com         40

집계 정책:

  • user_policy: min_group_size = 3, 엔터티 키 = (user_id)

  • vendor_policy: min_group_size = 2, 엔터티 키 = (vendor_id)

버킷 사용자를 고액 또는 저액 지출자로 쿼리:

WITH amounts AS (
  SELECT
    user_id,
    IFF(SUM(transaction_amount) > 50, 'high', 'low') AS bucket
  FROM T
  GROUP BY user_id -- user_policy is deferred, but vendor_policy is enforced
)
SELECT COUNT(*) FROM amounts GROUP BY bucket
Copy

예기치 않은 결과:

내부 쿼리에서는 vendor_policy 가 적용됩니다. 각 행은 user_id 로 그룹화되어 있는데, 해당되는 vendor_id 가 1개만 있어 vendor_policy 최소 그룹 크기를 위반하고, 내부 쿼리는 “높음” 버킷에 세 명의 고객이 속해 있음에도 불구하고 NULL 을 반환합니다.

엔터티 키 제약 조건 제거하기

단일 엔터티 키에 대한 집계 정책 제거:

-- Drop agg policy ap associated with entity key user_id
ALTER TABLE transactions DROP AGGREGATION POLICY ap ENTITY KEY (user_id)
Copy

여러 엔터티 키에 대한 집계 정책을 제거하려면 각 정책을 개별적으로 제거:

-- Drop the agg policies associated with two separate keys
ALTER TABLE transactions DROP AGGREGATION POLICY ap ENTITY KEY (user_id)
ALTER TABLE transactions DROP AGGREGATION POLICY ap ENTITY KEY (vendor_id)
Copy

모든 엔터티와 함께 집계 정책을 제거하려면 DROP 문에서 ENTITY KEY 을 생략:

-- Drop agg policy ap from the table entirely
ALTER TABLE transactions DROP AGGREGATION POLICY ap
Copy

제한 사항

여러 엔터티 키 또는 집계 정책이 정의된 테이블로 작업할 때는 다음과 같은 제한 사항이 적용됩니다.

  • 엔터티 키는 최대 1개의 정책에만 연결될 수 있습니다. 이미 정책에 매핑된 엔터티 키에 대해 다른 정책을 할당하려고 하면 오류가 발생합니다.

  • 1개의 정책을 행 수준 개인정보 보호와 엔터티 수준 개인정보 보호에 모두 사용할 수 없습니다.

  • 행 수준 개인정보 보호에는 최대 1개의 정책만 사용할 수 있습니다. 다른 정책을 행 수준 집계 정책으로 할당하려고 하면 오류가 발생합니다.

집계 제한 테이블 쿼리

엔터티 키가 있는 집계 제한 테이블을 쿼리하는 데 필요한 요구 사항은 엔터티 키가 없는 테이블을 쿼리하는 데 필요한 요구 사항과 동일합니다. 이러한 요구 사항을 준수하는 쿼리 유형에 대한 정보는 쿼리 요구 사항 섹션을 참조하십시오.