개인정보 보호 및 권한 설명¶
개인정보 보호 규칙은 데이터가 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 데이터는 디스크 캐시에 기록되기 전에 동일한 처리 순서를 사용합니다.
DataModifier: 기존 Tag 및 Field를 하나씩 처리합니다.null을 반환하거나 Native 콜백이0을 반환하면 원래 값을 유지합니다.LineDataModifier: Measurement별로 전체 데이터를 조회하고 기존 필드를 업데이트합니다. 새로 추가된 필드는 무시됩니다.- HTTP 개인정보 보호 규칙: URL Query, 요청 Header 및 응답 Header를 마지막으로 처리하여 사용자 정의 Modifier가 구성된 네트워크 마스킹 규칙을 우회하지 못하도록 합니다.
- 포맷 후 캐시에 기록합니다.
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을 다시 호출할 수 없습니다.
데이터 마스킹¶
네트워크 데이터 수집 비활성화¶
대상 필터링¶
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 세션 리플레이 개인정보 보호 설정 및 개인정보 보호 재정의에 통합되어 있습니다.