콘텐츠로 이동

개인정보 보호 및 권한 설명

개인정보 보호 규칙은 데이터가 RUM 또는 Log 큐로 유입되기 전에 적용되어야 합니다. C#과 Native C/C++ 모두 URL Query, HTTP 요청 Header 및 응답 Header 마스킹을 지원하며, 범용 Modifier를 통해 비즈니스 민감 필드를 처리할 수 있습니다.

권한 구성 설명

Windows SDK는 시스템 권한을 스스로 요청하지 않습니다. 애플리케이션은 프로세스가 구성된 업로드 주소와 캐시 디렉터리에 액세스할 수 있도록 보장해야 합니다. WebView2, 창 핸들 및 네트워크 구성 요소는 호스트 애플리케이션 자체의 권한 및 보안 정책을 따릅니다.

기본 동작

데이터 .NET / C# Native C/C++
URL Query 민감하지 않은 값은 유지하며, 기본적으로 민감한 매개변수는 <redacted>로 대체합니다. 동일
HTTP Header 기본적으로 인증 관련 Header를 수집하고 마스킹합니다. 동일
사용자 및 사용자 정의 속성 DataModifier 또는 LineDataModifier를 통해 마스킹할 수 있습니다. 동일
Log 콘텐츠 및 속성 DataModifier 또는 LineDataModifier를 통해 마스킹할 수 있습니다. 동일
Trace Header ShouldTrace/should_trace에서 허용한 대상에만 전송합니다. 동일

기본적으로 민감한 Query 이름에는 token, access_token, refresh_token, client_secret, password, passwd, secret, api_key, apikey, auth 및 authorization이 포함됩니다. 기본적으로 민감한 Header 이름에는 Authorization, Cookie, Set-Cookie, Proxy-Authorization, X-Api-Key, X-Auth-Token 및 X-Datakit-Token이 포함됩니다.

통일된 처리 순서

RUM, Log, WebView 및 Native Browser Bridge 데이터는 디스크 캐시에 기록되기 전에 동일한 처리 순서를 사용합니다.

  1. DataModifier: 기존 Tag와 Field를 하나씩 처리합니다. null을 반환하거나 Native 콜백이 0을 반환하면 원래 값을 유지합니다.
  2. LineDataModifier: Measurement 단위로 전체 데이터를 확인하고 기존 필드를 업데이트합니다. 새로 추가된 필드는 무시됩니다.
  3. HTTP 개인정보 보호 규칙: URL Query, 요청 Header 및 응답 Header를 마지막으로 처리하여 사용자 정의 Modifier가 구성된 네트워크 마스킹 규칙을 우회하지 못하도록 합니다.
  4. 형식화한 후 캐시에 기록합니다.

Modifier는 여러 수집 스레드에서 동시에 실행될 수 있으므로 콜백에서 시간이 오래 걸리는 작업을 수행해서는 안 됩니다. 콜백 예외는 데이터 수집을 중단하지 않으며 해당 필드는 원래 값을 유지합니다.

개인정보 보호 구성

GuanceSdk.Init(new GuanceConfig
{
    DatawayUrl = "https://openway.guance.com",
    ClientToken = "<client-token>",
    RumAppId = "<rum-app-id>",
    DataModifier = (key, value) =>
    {
        return key switch
        {
            "user_email" => "<redacted>",
            "phone" => "<redacted>",
            _ => null
        };
    },
    LineDataModifier = (measurement, data) =>
    {
        if (measurement == "error" && data.ContainsKey("error_message"))
        {
            return new Dictionary<string, object?>
            {
                ["error_message"] = "<redacted-error>"
            };
        }
        return null;
    },
    Privacy = new RumPrivacyConfig
    {
        CaptureHttpHeaders = true,
        CaptureUrlQueryString = true,
        RedactAllUrlQueryValues = false,
        RedactedValue = "<redacted>",
        RedactedHeaderNames = new[]
        {
            "Authorization",
            "Cookie",
            "Set-Cookie",
            "X-Api-Key"
        },
        RedactedQueryParameterNames = new[]
        {
            "token",
            "password",
            "secret"
        }
    }
});
매개변수 기본값 설명
CaptureHttpHeaders true 마스킹된 요청 및 응답 Header 기록 여부입니다.
CaptureUrlQueryString true URL Query 유지 여부입니다. 비활성화하면 Query 전체가 제거됩니다.
RedactAllUrlQueryValues false 모든 Query 값 숨김 여부입니다.
RedactedValue <redacted> 마스킹 대체 텍스트입니다.
RedactedHeaderNames 인증 관련 Header Header 목록이며 대소문자를 구분하지 않습니다.
RedactedQueryParameterNames 민감 매개변수 목록 Query 매개변수 목록이며 대소문자를 구분하지 않습니다.

DataModifier와 LineDataModifier는 모두 선택적 구성입니다. 기본 HTTP 마스킹만 필요하다면 Privacy만 구성하면 됩니다.

#include <cstring>

static int modify_data(
    const char* key,
    const guance_data_value*,
    guance_data_value* replacement,
    void*) {
    if (std::strcmp(key, "user_email") != 0) {
        return 0;
    }
    replacement->type = GUANCE_DATA_VALUE_STRING;
    replacement->value.string_value = "<redacted>";
    return 1;
}

static void modify_line(
    const char* measurement,
    guance_data_item* data,
    uint32_t data_count,
    void*) {
    if (std::strcmp(measurement, "error") != 0) {
        return;
    }
    for (uint32_t index = 0; index < data_count; ++index) {
        if (std::strcmp(data[index].key, "error_message") == 0) {
            data[index].value.type = GUANCE_DATA_VALUE_STRING;
            data[index].value.value.string_value = "<redacted-error>";
        }
    }
}

guance_sdk_config sdk_config;
guance_sdk_config_init(&sdk_config);
sdk_config.dataway_url = "https://openway.guance.com";
sdk_config.client_token = "<client-token>";
sdk_config.rum_app_id = "<rum-app-id>";
guance_sdk_handle rum = guance_sdk_init(&sdk_config);

guance_data_modifier_config modifiers;
guance_data_modifier_config_init(&modifiers);
modifiers.data_modifier = modify_data;
modifiers.line_data_modifier = modify_line;
guance_configure_data_modifiers(rum, &modifiers);

const char* redacted_query_names[] = {
    "token",
    "password",
    "secret"
};
const char* redacted_header_names[] = {
    "Authorization",
    "Cookie",
    "Set-Cookie",
    "X-Api-Key"
};

guance_rum_resource_collection_config privacy;
guance_rum_resource_collection_config_init(&privacy);
privacy.capture_http_headers = 1;
privacy.capture_url_query = 1;
privacy.redact_all_url_query_values = 0;
privacy.redacted_value = "<redacted>";
privacy.redacted_query_parameter_names = redacted_query_names;
privacy.redacted_query_parameter_name_count = 3;
privacy.redacted_header_names = redacted_header_names;
privacy.redacted_header_name_count = 4;

guance_rum_configure_resource_collection(rum, &privacy);

모든 Native 구성 구조체는 먼저 해당 *_init()을 호출해야 합니다. HTTP 개인정보 보호 구성은 Header 및 Query 목록을 복사하며, Modifier는 함수 포인터와 user_data를 유지합니다. 해당 값들은 재구성하거나 guance_sdk_shutdown()을 호출할 때까지 유효해야 합니다. Modifier는 동시에 실행될 수 있으며 동일한 SDK Handle을 다시 호출할 수 없습니다.

데이터 마스킹

네트워크 데이터 수집 비활성화

GuanceSdk.EnableAutomaticInstrumentation(new AutomaticInstrumentationOptions
{
    EnableHttpClient = false,
    EnableWebView = false
});

Header 또는 Query만 비활성화:

Privacy = new RumPrivacyConfig
{
    CaptureHttpHeaders = false,
    CaptureUrlQueryString = false
}
guance_rum_resource_collection_config resource_config;
guance_rum_resource_collection_config_init(&resource_config);
resource_config.enabled = 0;
guance_rum_configure_resource_collection(rum, &resource_config);

대상 필터링

Native Resource는 should_collect를 통해 수집 대상을 필터링할 수 있습니다. C#은 비즈니스 Handler 또는 수동 Resource 경계에서 동일한 필터링을 수행해야 합니다. Trace Header는 Trace 구성의 대상 허용 목록을 통해 신뢰할 수 있는 서비스로 제한해야 합니다.

사용자, Log 및 사용자 정의 필드

  • 비밀번호, 토큰, 신분증, 결제 정보 또는 전체 인증 Header를 기록하지 마세요.
  • 사용자 ID는 비즈니스에서 허용하는 안정적인 식별자 또는 해시 값을 사용해야 합니다.
  • Log 콘텐츠 및 속성은 비즈니스 민감 필드를 자동으로 인식하지 않으므로, Modifier를 통해 또는 AddLog() 호출 전에 마스킹을 완료해야 합니다.
  • 사용자 정의 속성은 SDK 예약 필드를 덮어쓸 수 없으며, 충돌하는 필드는 무시됩니다.

Session Replay 개인정보 보호

실험적 기능

Session Replay는 기본적으로 비활성화되어 있으며 명시적으로 활성화하여 검증할 수 있지만, 여전히 실험적 기능입니다. 활성화하기 전에 기본 정책과 요소 수준 재정의가 비즈니스 개인정보 보호 요구사항을 충족하는지 확인해야 합니다.

Session Replay의 전역 개인정보 보호 수준, 요소 수준 재정의 및 WebView2/Electron 개인정보 보호 경계는 Windows 세션 리플레이 개인정보 보호 구성 및 개인정보 보호 재정의에 통합되어 있습니다.

문서 평가

이 페이지가 도움이 되었나요?