파라미터화된 뷰 개요
Bigtable에서는 파라미터화된 뷰를 사용하여 애플리케이션 컨텍스트를 기반으로 논리 뷰의 데이터 범위를 동적으로 필터링할 수 있습니다. 이 접근 방식은 애플리케이션을 SQL 삽입으로부터 보호하고 여러 정적 뷰의 필요성을 줄입니다.
민감한 정보를 처리하기 위해 Bigtable 파라미터화된 뷰는 SQL 쿼리 텍스트와 분리된 격리된 컨텍스트를 사용합니다. 데이터베이스가 서버 측에서 이러한 값을 바인딩하므로 사용자와 AI 에이전트는 쿼리 매개변수를 조작할 수 없습니다. 데이터베이스는 쿼리 작성 방식과 관계없이 데이터 액세스를 특정 컨텍스트로 자동 제한합니다.
파라미터화된 뷰의 이점
파라미터화된 뷰는 특히 자연어에서 변환된 자유 형식 쿼리를 처리하는 애플리케이션에서 데이터베이스 수준에서 데이터 범위 지정 을 관리하는 데 적합합니다. 데이터 범위 지정은 쿼리 결과를 특정 데이터 하위 집합으로 제한하는 프로세스입니다. 이러한 뷰는 다음과 같은 작업을 구현하는 유연한 방법을 제공합니다.
- 심층 계층 ID 전파: 사용자 수준에서 세분화된 데이터 권한을 적용하여 사용자가 자신의 데이터 컨텍스트에만 액세스할 수 있도록 합니다. 예를 들어 애플리케이션은 사용자 또는 테넌트가 지정된 경계 내에 있는 행만 검색하도록 할 수 있습니다.
- 사용자 관리 간소화: 각 사용자에게 별도의 역할을 사용하는 대신 모든 데이터베이스 사용자에게 단일 데이터베이스 역할을 사용합니다.
- 매개변수 격리: 파라미터화된 뷰는 LLM 또는 최종 사용자 제어 외부에 유지되는 격리된 컨텍스트로 값을 전달하여 위험을 완화합니다. 이러한 값은 쿼리 텍스트와 분리되어 유지되므로 쿼리를 생성하는 사용자 또는 AI 에이전트는 이러한 값을 조작할 수 없습니다.
- SQL 삽입 완화: 애플리케이션을 빌드할 때 쿼리 텍스트 내에서 클라이언트 측의 매개변수를 대체하면 쿼리 조작이 발생할 수 있습니다. 파라미터화된 뷰는 쿼리 구조가 파싱된 후 서버 측에서 매개변수 바인딩을 실행하여 이 위험을 완화합니다. 공격자가 제어하는 값이 쿼리 구조를 변경할 수 없으므로 SQL 삽입이 방지됩니다.
예를 들어 콜레스테롤 수치를 비롯한 환자 의료 기록을 저장하는 건강 추적 애플리케이션을 생각해 보세요. 환자가 자신의 데이터를 쿼리하는 경우 악의적이거나 잘못된 동작을 하는 에이전트가 다른 환자의 기록을 검색하려고 시도하는 쿼리를 생성하거나 요청할 수 있습니다. 파라미터화된 뷰를 사용하면 애플리케이션이 데이터베이스 수준에서 환자 격리를 적용합니다. 뷰는 patient_id 뷰 매개변수로 정의됩니다.
CREATE VIEW patient_health_pv AS
(SELECT * FROM patient_health_records WHERE patient_id = CAST(VIEW_PARAMETERS('patient_id') AS BYTES))
클라이언트가 환자의 cholesterol 판독값을 쿼리하려는 경우:
SELECT readings['value'], readings['date']
FROM patient_health_pv
WHERE readings['test_name'] = 'cholesterol'
뷰가 쿼리되므로 Bigtable은 격리된 매개변수 맵에서 patient_id 값을 자동으로 바인딩하고 적용합니다. LLM 또는 최종 사용자는 이 필터를 변경하거나 삭제할 수 없으므로 강력한 사용자 수준 범위 지정이 보장되고 SQL 삽입 벡터가 제거됩니다.
파라미터화된 뷰 작동 방식
파라미터화된 뷰는 뷰 매개변수 라는 메커니즘을 사용하여 사용자 ID와 같은 애플리케이션 수준 컨텍스트를 데이터베이스에 안전하게 전달합니다. 파라미터화된 뷰는 뷰 매개변수 값을 쿼리 요청과 함께 별도의 격리된 컨텍스트로 전달하여 이를 달성합니다. 그러면 Bigtable은 쿼리 실행 중에 이 컨텍스트에 액세스할 수 있지만 쿼리 자체는 컨텍스트를 읽거나 수정할 수 없습니다.
VIEW_PARAMETERS() 함수는 뷰 정의 내에서 이러한 매개변수에 액세스하기 위한 SQL 인터페이스입니다. 예를 들어 쿼리를 실행하는 사용자의 ID를 기반으로 데이터를 필터링하려면 뷰의 WHERE 절에 다음을 포함하면 됩니다.
CREATE VIEW purchase_history_pv AS
(SELECT * FROM purchases WHERE user_id = CAST(VIEW_PARAMETERS('user_id') AS BYTES))
VIEW_PARAMETERS()를 사용하여 열 한정자를 파라미터화할 수도 있습니다. 이렇게 하면 뷰가 제공된 애플리케이션 컨텍스트를 기반으로 특정 필드를 동적으로 반환할 수 있습니다.
CREATE VIEW specific_test_result_pv AS
SELECT
tests[VIEW_PARAMETERS('test_name')] AS reading,
_timestamp AS reading_time
FROM patients
표준 쿼리 매개변수와의 차이점
뷰 매개변수는 표준 쿼리 매개변수와 다르게 작동합니다.
- 구문 및 컨텍스트: 표준 쿼리 매개변수는
@param구문을 사용하여 정의되며 뷰 정의 내에서 선언할 수 없고 쿼리에서만 선언할 수 있습니다. 뷰 매개변수는VIEW_PARAMETERS('key')함수를 사용하여 액세스되며, 이 함수는 모든 쿼리 또는 뷰 컨텍스트에서 호출할 수 있습니다. - 실패 폐쇄 동작:
VIEW_PARAMETERS('key')참조가 포함된 뷰 정의가 쿼리되지만 요청의 뷰 매개변수 맵에 해당 값이 제공되지 않으면 쿼리가not found / missing parameter오류와 함께 즉시 실패합니다. 이렇게 하면 구성이 잘못 적용된 경우 실수로 데이터가 노출되는 것을 방지할 수 있습니다.
제한사항
파라미터화된 뷰에는 다음과 같은 제한사항이 적용됩니다.
- 논리 뷰에서만 파라미터화된 뷰를 만들 수 있습니다. Google Cloud CLI를 사용하여 새 파라미터화된 논리 뷰를 만듭니다. 기존 논리 뷰는 수정하지 않습니다.
- 뷰 매개변수는 문자열 유형의 값만 지원합니다. 매개변수가 뷰의 SQL 정의에서 다른 데이터 유형을 나타내는 경우 파라미터 값을 문자열로 전달하고 뷰 정의 내에서 캐스팅해야 합니다(예:
CAST(VIEW_PARAMETERS('parameter_name') AS INT64)).