콘텐츠로 이동

개인정보 보호 및 권한 설명

개인정보 보호 규칙은 데이터가 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, authauthorization이 포함됩니다. 기본 민감 Header 이름에는 Authorization, Cookie, Set-Cookie, Proxy-Authorization, X-Api-Key, X-Auth-TokenX-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 매개변수 목록으로, 대소문자를 구분하지 않습니다.

DataModifierLineDataModifier는 모두 선택적 설정입니다. 기본 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 및 사용자 정의 필드

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

Session Replay 개인정보 보호

실험적 기능

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

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

문서 평가

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