객체에 대한 접근 권한 부여를 위한 참조 사용

객체에 대한 접근 권한 부여를 위한 참조 사용 (Using references to authorize access on objects)

이 문서는 기본적으로 접근 권한이 없는 객체에 대해 저장 프로시저, Snowflake Native App, 또는 클래스 인스턴스에 접근을 허용하는 데 사용되는 참조(reference)에 대해 설명해요. 참조의 유형, 수명 주기, 지원되는 대상, 그리고 provider와 consumer가 참조를 사용하는 방법을 다루어요.

출처: Snowflake SQL Reference

본문

참조(reference)는 식별자로 사용할 수 있는 문자열이에요. 이 식별자는 참조되는 객체로 해석돼요. 참조를 사용하면 기본적으로 해당 객체에 접근 권한이 없는 저장 프로시저, Snowflake Native App, 또는 클래스 인스턴스에 객체에 대한 접근 권한을 부여할 수 있어요.

소개 (Introduction)

참조는 다음을 캡슐화해요:

  • 객체 이름
  • 객체 참조를 만드는 데 사용된 활성 역할과, 해당하는 경우 활성 보조(secondary) 역할
  • 참조가 생성될 때 지정된 객체에 대한 권한(privilege)

참조가 필요할 수 있는 몇 가지 시나리오는 다음과 같아요:

  • 소유자 권한(owner's rights) 저장 프로시저가 다른 역할이 소유한 테이블에 데이터를 삽입할 접근 권한을 필요로 하는 경우
  • 애플리케이션이 데이터 분석을 수행하고 테이블의 데이터에 대한 읽기 접근 권한을 필요로 하는 경우
  • SNOWFLAKE.ML.ANOMALY_DETECTION 클래스의 인스턴스가 이상 탐지 ML 모델을 훈련하기 위해 뷰에 대한 읽기 권한을 필요로 하는 경우

이름으로 식별되는 객체 (Objects identified by name)

참조는 객체를 이름으로 식별해요. 즉, 참조가 만들어진 후 객체 이름이 바뀌면 참조는 유효하지 않게 돼요. 하지만 같은 이름의 새 객체가 만들어지면 참조가 유효할 수 있어요. 예를 들어 역할 my_role이 SELECT 권한으로 테이블 my_table1에 대한 참조 my_ref1을 만들었다고 가정해 봐요. 참조가 만들어진 후 테이블 my_table1이 삭제되고 my_table1이라는 이름의 새 테이블이 생성됐어요. 참조 my_ref1my_table1이라는 이름의 테이블을 식별하는데, 이 경우 새 테이블 my_table1을 식별해요.

참조를 만드는 데 사용된 역할과 my_table1에 부여된 권한이 여전히 유효하면, 참조를 사용할 때 새 my_table1에 대한 접근이 승인돼요.

참조에 캡슐화된 역할과 권한이 더 이상 유효하지 않으면 테이블 my_table1에 대한 접근을 승인할 수 없고, 새 테이블에 대한 새 참조를 만들어야 해요.

실행 시 검증되는 권한 (Privileges verified at execution time)

참조를 만든 역할에 부여된 권한은 참조가 사용되는 시점에 검증돼요. 예를 들어 역할 my_role이 SELECT 권한으로 테이블 t1에 대한 참조를 만들었다고 가정해 봐요. my_role이 삭제되거나 테이블 t1에 대한 SELECT 권한이 my_role에서 회수되면, 참조에 캡슐화된 권한은 더 이상 유효하지 않아요. 참조가 테이블에 대한 SELECT 권한을 필요로 하는 저장 프로시저에 전달되면, 저장 프로시저는 권한 오류로 실패해요.

참조 유형과 참조 수명 (Types of references and reference lifespan)

참조의 수명은 생성 시점에 지정할 수 있어요.

  • 일시적(transient) 참조는 수명이 제한돼요. 참조가 전달되는 호출 기간 동안, 또는 세션 기간 동안 유지돼요.
  • 영구적(persistent) 참조는 수명이 무제한이에요. 참조는 참조하는 객체가 삭제되거나, 참조가 해제(unset)되거나, 참조가 유효하지 않게 될 때까지 유효해요. 참조 해제 예시는 애플리케이션에 대한 영구 참조 해제하기를 참고하세요.

참조는 다음 중 어떤 이유로도 유효하지 않게 될 수 있어요:

  • 참조하는 객체의 이름이 바뀌는 경우
  • 참조를 만든 역할이 삭제되는 경우
  • 참조를 만든 역할이 더 이상 객체에 대한 권한을 갖지 못하는 경우

자세한 내용은 "이름으로 식별되는 객체"와 "실행 시 검증되는 권한"을 참고하세요.

소유자 권한 저장 프로시저를 위한 참조 (References for owner's rights stored procedures)

소유자 권한 저장 프로시저는 호출자가 아니라 소유자의 권한으로 실행돼요. 호출자가 접근 권한을 가진 테이블, 뷰 또는 함수에 대해 작업을 수행하려면, 호출자는 테이블, 뷰 또는 함수에 대한 참조를 전달해야 해요. 이 참조는 저장 프로시저가 참조가 식별하는 객체에 대해 참조 생성자(이 경우 호출자)의 권한으로 작업을 수행할 수 있게 해줘요.

애플리케이션과 클래스를 위한 참조 (References for applications and classes)

설계상 애플리케이션과 클래스는 애플리케이션이 설치되거나 클래스 인스턴스가 생성되는 계정의 객체에 접근할 수 없어요. 사용자는 참조를 만들어 애플리케이션이나 클래스 인스턴스에 객체에 대한 접근 권한을 부여할 수 있어요.

애플리케이션과 클래스의 제공자와 소비자 (Providers and consumers of applications and classes)

provider는 애플리케이션을 만들고, consumer는 consumer 계정에서 애플리케이션을 설치하고 사용해요. Snowflake 클래스의 경우 Snowflake가 provider이고, 클래스 인스턴스를 만드는 Snowflake 계정을 가진 사용자가 consumer예요.

Provider는 코드에서 참조를 요청하고 사용하는 애플리케이션과 클래스를 만들 수 있어요. 자세한 내용은 provider를 위한 참조를 참고하세요.

Consumer는 계정에 설치하는 애플리케이션 또는 Snowflake 클래스의 인스턴스에 참조를 만들고 전달할 수 있어요. 자세한 내용은 consumer를 위한 참조를 참고하세요.

참조의 지원 대상 (Supported targets for references)

참조의 대상은 객체 또는 쿼리일 수 있어요. 참조의 대상이 객체라면 참조에 객체에 대한 권한이 필요해요.

참조에 대해 지원되는 객체 유형과 권한

다음 표는 참조에 포함될 수 있는 객체 유형, 만들 수 있는 참조의 유형, 각 객체에 허용되는 권한을 나열해요:

| Object type | Transient | Persistent | Privileges allowed | Default privilege | | AI GATEWAY | ✔ | | Preview Feature — Open. 모든 계정에서 사용 가능. APPLYBUDGET, USAGE | USAGE | | API INTEGRATION | | ✔ | USAGE | USAGE | | CATALOG INTEGRATION | | ✔ | USAGE | USAGE | | COMPUTE POOL | ✔ | | APPLYBUDGET | | | CORTEX AGENT | ✔ | | USAGE | USAGE | | DATABASE | ✔ | | APPLYBUDGET | | | EXTERNAL ACCESS INTEGRATION | | ✔ | USAGE | | | EXTERNAL VOLUME | | ✔ | USAGE | | | EXTERNAL TABLE | | ✔ | SELECT, REFERENCES | SELECT | | FUNCTION | ✔ | ✔ | USAGE | USAGE | | GIT REPOSITORY | | ✔ | READ | READ | | MATERIALIZED VIEW | ✔ | | APPLYBUDGET | | | PIPE | ✔ | | APPLYBUDGET | APPLYBUDGET | | POLICY | ✔ | | MANAGE POLICY | | | PROCEDURE | ✔ | ✔ | USAGE | USAGE | | ROW ACCESS POLICY | ✔ | | APPLY | | | SCHEMA | ✔ | | APPLYBUDGET | | | SECRET | | ✔ | USAGE, READ | | | | ✔ | | READ | | | SNOWFLAKE INTELLIGENCE | ✔ | | USAGE | USAGE | | STAGE | | ✔ | READ, WRITE | READ | | TABLE | ✔ | | APPLYBUDGET, REBUILD, EVOLVESCHEMA | | | | ✔ | ✔ | SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES | SELECT | | TAG | ✔ | | APPLYBUDGET | | | TASK | ✔ | | APPLYBUDGET | APPLYBUDGET | | VIEW | ✔ | ✔ | SELECT, REFERENCES | SELECT | | WAREHOUSE | ✔ | | APPLYBUDGET | | | | | ✔ | MODIFY, MONITOR, OPERATE, USAGE | USAGE |

쿼리 참조 (Query references)

쿼리 참조는 일시적 참조의 한 유형이에요. 저장 프로시저의 다른 SQL 문의 FROM 절에서 사용할 수 있는 SELECT 문을 참조해요. SYSTEM$QUERY_REFERENCE 함수나 TABLE 키워드를 사용해서 쿼리 참조를 만들 수 있어요.

자세한 내용은 "쿼리 참조 사용"과 "TABLE 키워드로 테이블, 뷰, 쿼리에 대한 참조 만들기"를 참고하세요.

provider를 위한 참조 (References for providers)

Snowflake Native App Framework를 사용해서 provider로서 애플리케이션을 만들 수 있어요. 애플리케이션의 consumer에게 참조 요청에 대한 자세한 내용은 "consumer로부터 참조와 객체 수준 권한 요청하기"를 참고하세요.

consumer를 위한 참조 (References for consumers)

SYSTEM$REFERENCE 함수를 사용해서 참조를 만들 수 있어요. 함수가 반환하는 문자열 식별자를 저장 프로시저, 애플리케이션 또는 클래스 인스턴스에 전달할 수 있어요. 또는 문자열 식별자 대신 참조를 만드는 문을 전달할 수도 있어요.

참고: 저장 프로시저에 참조를 전달한다면 SYSTEM$REFERENCE 함수를 호출하는 대신 TABLE 키워드를 사용할 수 있어요. "TABLE 키워드로 테이블, 뷰, 쿼리에 대한 참조 만들기"를 참고하세요.

예시 (Examples)

SELECT 권한으로 테이블 t1에 대한 세션 범위의 일시적 참조를 만들어 봐요:

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'SESSION', 'SELECT');

참조되는 범위의 수명 동안 같은 테이블에 대한 참조를 만들려면(예: 저장 프로시저에 전달하면 수명이 저장 프로시저의 가장 바깥쪽 블록이 됨) 다음 문을 실행해요:

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'CALL', 'SELECT');

애플리케이션에 전달할 INSERT 권한의 테이블 t1에 대한 영구 참조를 만들어 봐요:

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'PERSISTENT', 'INSERT');

저장 프로시저에 전달할 쿼리 참조를 만들어 봐요. 이 일시적 참조의 수명은 참조를 전달하는 저장 프로시저의 가장 바깥쪽 블록까지예요:

SELECT SYSTEM$QUERY_REFERENCE('SELECT id FROM my_table', FALSE);

추가 예시:

  • 저장 프로시저 예시는 "배경: 저장 프로시저에 객체와 쿼리를 전달할 때의 문제"를 참고하세요.
  • Native App Framework 애플리케이션 예시는 "참조를 애플리케이션에 연결하기"를 참고하세요.
  • 클래스 인스턴스 예시는 "레이블이 있는 데이터로 이상 탐지 모델 훈련하기"를 참고하세요.

애플리케이션에 대한 영구 참조 해제하기 (Unset a persistent reference for an application)

영구 참조를 필요로 하는 애플리케이션 또는 클래스는 참조를 해제하는 메서드도 제공해요. 메서드 이름은 구현에 따라 다를 수 있어요.

또는 ALTER APPLICATION … UNSET REFERENCES 문을 사용해서 참조를 해제할 수 있어요.

  • SHOW REFERENCES 명령으로 모든 참조를 볼 수 있어요. 애플리케이션에 설정된 참조도 포함돼요. 예를 들어 애플리케이션 my_app의 참조를 보려면:
SHOW REFERENCES IN APPLICATION my_app;
  • ALTER APPLICATION 명령을 사용해서 애플리케이션에 설정된 참조를 해제할 수 있어요. 예를 들어 애플리케이션 my_apptable_to_read라는 참조를 해제하려면:
ALTER APPLICATION my_app UNSET REFERENCES('table_to_read');

예를 들어 애플리케이션 my_app의 모든 참조를 해제하려면:

ALTER APPLICATION my_app UNSET REFERENCES;

참조를 사용할 때의 고려사항 (Considerations when using references)

  • 참조와 연관된 객체의 이름이 바뀌거나(또는 부모가 바뀌면) 참조는 더 이상 유효하지 않아요. 같은 이름의 새 객체가 만들어지고, 참조 연관에 인코딩된 역할이 새 객체에 관련 권한을 가지면 참조는 유효하게 유지돼요. 그렇지 않으면 권한 오류로 실패해요.
  • 객체가 교체(swap)되고, 참조 연관에 인코딩된 역할이 교체된 이름을 가진 새 객체에 관련 권한을 가지면 참조는 유효하게 유지돼요. 그렇지 않으면 권한 오류로 실패해요.
  • 객체 삭제와 되살리기(undrop):
    • 참조와 연관된 객체가 삭제되면 참조 연관은 유효하지 않게 돼요.
    • 객체가 되살려지면 참조 연관은 다시 유효해져요.
  • 복제(Cloning):
    • 계정의 객체에 대한 참조를 사용하는 클래스 인스턴스나 그 상위 데이터베이스·스키마를 복제할 수 있어요.
    • 참조된 객체가 완전히 한정된 이름으로 참조되면, 인스턴스 복제본은 원본 객체를 참조해요.
    • 참조된 객체가 부분적으로 한정되거나 정규화되지 않은 이름으로 참조되면, 인스턴스 복제본은 복제 경계에 따라 복제 객체, 원본 객체, 또는 실제 객체를 참조하지 않을 수 있어요.
  • consumer 계정의 객체에 대한 참조를 사용하는 애플리케이션이나 클래스 인스턴스를 포함하는 데이터베이스에 대해 복제(Replication)가 지원돼요. 다음 객체가 복제되면 참조는 대상 계정에서 올바르게 동작해요:
    • 애플리케이션 또는 클래스 인스턴스
    • 참조된 객체
    • 참조를 만든 역할

이 객체들은 서로 다른 복제 또는 장애 조치 그룹으로 복제될 수 있어요. 모든 객체가 복제되면 참조를 사용할 수 있어요.

Snowflake Native App Framework 애플리케이션의 provider는 "참조를 사용할 때의 고려사항"도 참고하세요.

참조 사용 모니터링 (Monitoring usage of references)

SHOW REFERENCES 명령을 사용해서 애플리케이션이 요청한 참조를 볼 수 있어요. 애플리케이션에 대한 참조를 설정했다면, 출력에는 각 참조에 대한 객체, 데이터베이스, 스키마, 식별자 정보가 포함돼요.

예를 들어 애플리케이션 my_app의 참조를 보려면:

SHOW REFERENCES IN APPLICATION my_app;

더 알아보기 (Learn more)