이 문서에서는 Spanner의 매개변수화된 뷰를 설명합니다. 파라미터화된 뷰를 사용하면 쿼리와 함께 전달된 세션 파라미터를 기반으로 데이터를 동적으로 필터링할 수 있으며, 특히 대규모 언어 모델(LLM)을 사용하는 에이전트 애플리케이션 및 시스템에 유용합니다.
파라미터화된 뷰는 컨텍스트 파라미터를 뷰 정의에 직접 삽입하여 데이터베이스 뷰의 기능을 확장합니다. 파라미터화된 뷰를 사용하면 다음을 수행할 수 있습니다.
- 사용자 또는 테넌트 ID와 같은 쿼리 시간 컨텍스트 매개변수를 뷰 정의에 전달합니다.
- 제공된 매개변수와 일치하는 행으로만 쿼리 결과를 제한합니다.
- 사용자가 생성된 SQL 쿼리 또는 임시 SQL 쿼리에서 애플리케이션 수준 데이터 필터를 우회하지 못하도록 합니다.
자세한 내용은 파라미터화된 뷰 만들기를 참조하세요.
파라미터화된 뷰 작동 방식
파라미터화된 뷰는 파라미터를 사용하여 사용자 ID와 같은 애플리케이션 수준 컨텍스트를 데이터베이스에 안전하게 전달합니다. 애플리케이션이 쿼리를 실행하면 쿼리 문과 함께 컨텍스트를 전송합니다. Spanner는 실행 중에 이 컨텍스트에 액세스하지만 쿼리나 애플리케이션 사용자는 이를 읽거나 수정할 수 없습니다.
SECURE_CONTEXT() 함수는 뷰 정의 내에서 이러한 보안 매개변수에 액세스하기 위한 SQL 인터페이스를 제공합니다. 파라미터화된 뷰에는 정의자의 권한 뷰 보안 모델이 필요합니다. 여기서 뷰는 SECURE_CONTEXT()를 사용하여 값에 액세스하고 결과를 필터링합니다.
예를 들어 쿼리를 실행하는 사용자의 ID를 기준으로 데이터를 필터링하려면 뷰의 WHERE 절에 다음을 포함하면 됩니다.
CREATE VIEW MyUserData
SQL SECURITY DEFINER AS
(SELECT *
FROM AllUserData
WHERE UserID = CAST(SECURE_CONTEXT('user_id'), INT));
이렇게 하면 애플리케이션에서 자신의 데이터는 볼 수 있지만 다른 사용자의 데이터는 볼 수 없습니다. 또한 운영자가 모든 사용자의 덜 민감한 데이터를 볼 수 있는 뷰를 만들 수도 있습니다.
CREATE VIEW SafeUserData
SQL SECURITY DEFINER AS
(SELECT UserID, AccountCreationTime, PublicProfileText
FROM AllUserData
WHERE SECURE_CONTEXT('role') = 'Moderator');
뷰 쿼리 정의의 어디에서나 SECURE_CONTEXT()를 사용할 수 있지만 성능을 위한 권장사항은 WHERE 절에서 이를 사용하여 테이블 또는 색인의 선행 키 열을 필터링하는 것입니다. 이렇게 하면 Spanner가 필터 로직을 스토리지 레이어로 효율적으로 푸시합니다.
기본적으로 데이터베이스 역할에 spanner_secure_context_reader 역할이 없으면 임시 쿼리에서 SECURE_CONTEXT() 함수를 직접 쿼리할 수 없습니다.
이렇게 하면 권한이 없는 사용자가 파라미터 값을 직접 검사할 수 없습니다.
권장되는 패턴은 파라미터화된 뷰를 정의자 권한 뷰 및 세분화된 액세스 제어(FGAC)와 결합하는 것입니다. 사용자가 뷰를 통해서만 데이터를 쿼리할 수 있도록 하려면 다음 안내를 따르세요.
- FGAC를 사용 설정하고 애플리케이션의 데이터베이스 역할을 만듭니다.
- 뷰에 대한
SELECT권한을 역할에GRANT합니다. public시스템 역할에 기본 테이블 또는 뷰에 대한 권한이 부여되지 않았는지 확인합니다.
예를 들면 다음과 같습니다.
-- Create a role for the application user
CREATE ROLE pv_user;
-- Grant SELECT permission on the view to the role
GRANT SELECT ON VIEW MyUserData TO ROLE pv_user;
파라미터화된 뷰를 만든 후 일반적인 요청 프로세스는 다음과 같습니다.
- 애플리케이션이 쿼리 요청에 보안 컨텍스트를 설정합니다. 컨텍스트에는 사용자 ID 또는 역할과 같이 애플리케이션 사용자를 식별하는 정보가 포함됩니다.
- 애플리케이션이 정의자의 권한 뷰에 대해 쿼리를 실행합니다.
- 뷰는
WHERE절의SECURE_CONTEXT()함수를 사용하여 보안 컨텍스트에 제공된 값을 기준으로 행을 필터링합니다. - Spanner는 필터와 일치하는 행만 반환하여 쿼리 결과를 사용자의 세션 컨텍스트와 연결된 데이터로 효과적으로 필터링합니다.
예를 들어 애플리케이션은 Spanner 클라이언트 라이브러리 중 하나를 사용하여 보안 컨텍스트에서 현재 사용자의 ID를 전달할 수 있습니다. 다음 예시에서는 C++ 클라이언트 라이브러리를 사용하여 user_id 보안 매개변수를 설정합니다.
(*request.mutable_secure_context())["user_id"] = "ca6095c4-1a68-44a8-9562-dd9e897326f0";
그러면 애플리케이션이 뷰에 대해 표준 SQL 쿼리를 실행합니다. 뷰는 WHERE 절에서 이 user_id를 사용하여 해당 사용자에게 속한 레코드만 반환합니다.
--Query executed by the application
SELECT * FROM MyUserData;
파라미터화된 뷰의 이점
매개변수는 다음과 같은 목표를 달성하는 데 도움이 됩니다.
멀티 테넌트 애플리케이션에서 테넌트 데이터 격리: 매개변수를 사용하여 쿼리가 특정 테넌트의 데이터만 반환하도록 합니다.
에이전트형 AI 쿼리 제한: 자연어 쿼리를 사용자 또는 테넌트의 데이터로 제한합니다.
임시 사용자 인증 정보로 데이터 필터링: Identity and Access Management(IAM)에 존재하지 않는 사용자 또는 테넌트 ID를 기반으로 데이터 액세스를 제한합니다.
필터링에 비공개 사용자 인증 정보 사용: 최종 사용자에게 반환되지 않아야 하는 쿼리에 필요한 값을 사용하여 데이터를 필터링합니다.
보안 위험 완화
파라미터화된 뷰는 최종 사용자가 데이터베이스에서 신뢰할 수 없는 쿼리(예: 자연어 쿼리)를 실행할 때 보안 위험을 완화하는 데 도움이 됩니다. 이러한 위험에는 다음이 포함됩니다.
- 악성 프롬프트: 사용자가 기본 모델을 조작하여 모든 애플리케이션 데이터에 액세스하려고 시도할 수 있습니다.
- 범위가 넓은 SQL 쿼리: 대규모 언어 모델(LLM)은 좋은 의도를 가진 사용자 쿼리에서도 민감한 정보를 노출하는 SQL 쿼리를 생성할 수 있습니다.
파라미터화된 뷰를 사용하면 사용자가 쿼리를 어떻게 작성하든 개별 애플리케이션 사용자에게 반환되는 행의 범위를 제한할 수 있습니다.
권장사항
파라미터화된 뷰를 효과적으로 구현하려면 다음 권장사항을 따르세요.
정의자의 권한 뷰 및 FGAC와 결합: 정의자의 권한 뷰와 세분화된 액세스 제어 역할이 포함된 포괄적인 보안 모델의 일부로 파라미터를 사용합니다. 뷰에만
SELECT역할 권한을 부여하고 역할과public시스템 역할에 기본 테이블에 대한 권한이 없는지 확인합니다.복잡한 컨텍스트에 JSON 사용: 여러 역할이 있는 사용자와 같은 구조화된 컨텍스트를 전달하려면 데이터를 JSON 문자열로 직렬화합니다. JSON 문자열을 단일 매개변수로 전달합니다. Spanner의 기본 제공 JSON 또는 JSONB를 사용하여 뷰 내의 값을 추출합니다.
SQL UDF로 액세스 간소화: 구조화된 JSON 컨텍스트 내의 필드에 자주 액세스하는 경우 사용자 정의 SQL 함수(UDF)를 만들어 추출 로직을 캡슐화합니다. 뷰에서 UDF를 사용하면 가독성과 유지보수성이 향상됩니다.
Model Armor를 사용한 프롬프트 인젝션 방지: 신뢰할 수 없는 사용자 입력이 있는 LLM을 사용하여 쿼리를 생성할 때는 Model Armor를 사용하여 프롬프트 인젝션 및 탈옥 시도를 사전에 식별하고 차단합니다.
제한사항
파라미터화된 뷰에는 다음과 같은 제한사항이 있습니다.
- 인수 유형:
SECURE_CONTEXT()함수에는 문자열 리터럴 인수가 필요합니다. - 결과 유형:
SECURE_CONTEXT()함수는 문자열을 반환합니다. - Spanner 기능 상호작용: 생성된 열, 기본 열 값 표현식 또는 사용자 정의 함수(UDF) 내에서
SECURE_CONTEXT()를 사용할 수 없습니다. - 보안 장벽: Spanner의 파라미터화된 뷰에는 보안 장벽이 포함되지 않습니다. 쿼리 결과를 반환하기 전에 모든 필터가 적용되지만 내부 쿼리 처리 중에 액세스되는 데이터는 제한되지 않을 수 있습니다.
다음 단계
- 파라미터화된 뷰를 만드는 방법 알아보기
- 파라미터화된 뷰 사용 방법 알아보기
- 정의자의 권한 뷰 자세히 알아보기
- 세분화된 액세스 제어 자세히 알아보기