파라미터화된 뷰 개요

이 문서에서는 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)와 결합하는 것입니다. 사용자가 뷰를 통해서만 데이터를 쿼리할 수 있도록 하려면 다음 안내를 따르세요.

  1. FGAC를 사용 설정하고 애플리케이션의 데이터베이스 역할을 만듭니다.
  2. 뷰에 대한 SELECT 권한을 역할에 GRANT합니다.
  3. 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;

파라미터화된 뷰를 만든 후 일반적인 요청 프로세스는 다음과 같습니다.

  1. 애플리케이션이 쿼리 요청에 보안 컨텍스트를 설정합니다. 컨텍스트에는 사용자 ID 또는 역할과 같이 애플리케이션 사용자를 식별하는 정보가 포함됩니다.
  2. 애플리케이션이 정의자의 권한 뷰에 대해 쿼리를 실행합니다.
  3. 뷰는 WHERE 절의 SECURE_CONTEXT() 함수를 사용하여 보안 컨텍스트에 제공된 값을 기준으로 행을 필터링합니다.
  4. 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의 파라미터화된 뷰에는 보안 장벽이 포함되지 않습니다. 쿼리 결과를 반환하기 전에 모든 필터가 적용되지만 내부 쿼리 처리 중에 액세스되는 데이터는 제한되지 않을 수 있습니다.

다음 단계