Skip to content

보안 필터

DD 는 민감 데이터 필터링 기능을 내장하여 로그 내 비밀번호, 키, Token 등 민감 정보를 자동으로 감지하고 마스킹합니다.

SensitiveDataFilter

정규식 기반의 민감 데이터 필터로, 동적 패턴과 캐싱을 지원합니다.

생성

함수시그니처설명
NewSensitiveDataFilter() *SensitiveDataFilter완전 패턴 집합
NewEmptySensitiveDataFilter() *SensitiveDataFilter빈 필터
NewCustomSensitiveDataFilter(patterns ...string) (*SensitiveDataFilter, error)커스텀 패턴

메서드

메서드시그니처설명
AddPattern(pattern string) error정규식 패턴 추가
AddPatterns(patterns ...string) error일괄 패턴 추가
ClearPatterns()모든 패턴 제거
PatternCount() int패턴 수
Enable()필터 활성화
Disable()필터 비활성화
IsEnabled() bool활성화 여부
Filter(input string) string문자열 필터
FilterFieldValue(key string, value any) any단일 필드값 필터
FilterValueRecursive(key string, value any) any중첩 구조 재귀 필터
GetFilterStats() FilterStats필터 통계 가져오기
ActiveGoroutineCount() int32활성 필터 goroutine 수
WaitForGoroutines(timeout time.Duration) bool필터 goroutine 완료 대기
Close() bool필터 닫기 및 캐시 해제

커스텀 패턴

go
filter, _ := dd.NewCustomSensitiveDataFilter(
    `(?i)password\s*[:=]\s*\S+`,     // 비밀번호
    `(?i)api[_-]?key\s*[:=]\s*\S+`,  // API Key
    `\b\d{16,19}\b`,                  // 신용카드 번호
)

SecurityConfig

보안 구성 구조체로, 필터 동작과 보안 레벨을 제어합니다.

go
type SecurityConfig struct {
    MaxMessageSize  int                       // 메시지 크기 상한 (바이트, 0 은 제한 없음, 사전 설정 구성 기본값 5MB)
    MaxWriters      int                       // 최대 Writer 수 (사전 설정 구성 기본값 100)
    SensitiveFilter *SensitiveDataFilter      // 민감 데이터 필터
    RateLimitConfig *internal.RateLimitConfig // 속도 제한 구성 (내부 타입, nil 이면 제한 비활성화; 사전 설정 구성은 이 필드를 채우지 않음)
}

정보 RateLimitConfig 에 대하여

RateLimitConfig는 로그 속도 제한을 제어하여 로그 홍수 (DoS) 를 방지하고 고부하 상황에서 시스템 안정성을 유지하는 데 사용됩니다. 이 필드는 내부 타입 (*internal.RateLimitConfig) 으로 직접 생성할 수 없습니다. 모든 사전 설정 구성 (DefaultSecurityConfig, DefaultSecureConfig, SecurityConfigForLevel 등) 은 이 필드를 채우지 않으며, 즉 기본적으로 속도 제한이 활성화되지 않습니다. 명시적으로 설정한 경우에만 Logger 가 이에 따라 속도 제한기를 초기화합니다. 속도 제한을 끄려면 nil로 설정하면 됩니다.

FilterStats

필터 통계 데이터 구조, 모니터링과 가시성에 사용됩니다.

go
type FilterStats struct {
    ActiveGoroutines  int32         // 현재 활성 필터 goroutine 수
    PatternCount      int32         // 등록된 민감 데이터 패턴 수
    SemaphoreCapacity int           // 최대 동시 필터 작업 수
    MaxInputLength    int           // 입력 길이 절단 임계값
    Enabled           bool          // 필터 활성화 여부
    TotalFiltered     int64         // 총 필터 작업 수
    TotalRedactions   int64         // 총 마스킹 횟수
    TotalTimeouts     int64         // 총 타임아웃 횟수
    AverageLatency    time.Duration // 평균 필터 지연
    CacheHits         int64         // 캐시 적중 횟수
    CacheMiss         int64         // 캐시 미스 횟수
}

SecurityLevel

보안 레벨 열거, SecurityConfigForLevel로 사전 설정 구성을 빠르게 가져오는 데 사용됩니다.

go
type SecurityLevel int

String() 메서드를 구현하여 읽기 쉬운 레벨 이름을 반환합니다.

상수설명
SecurityLevelDevelopment개발 환경 (민감 필터 없음, 속도 제한 없음)
SecurityLevelBasic기본 필터 (비밀번호, 토큰, API Key, 신용카드, SSN, 전화번호, SWIFT/CVV 등 약 40 종의 일반적인 민감 데이터)
SecurityLevelStandard표준 필터 (프로덕션 권장)
SecurityLevelStrict엄격한 필터 (PII/금융 데이터 환경)
SecurityLevelParanoid극한 필터 (고위험 환경)

사전 설정 구성

함수설명적용 시나리오
DefaultSecurityConfig()기본 민감 데이터 필터프로덕션 환경 (권장)
DefaultSecureConfig()완전 민감 데이터 필터고보안 요구
HealthcareConfig()HIPAA 규정 준수의료 산업
FinancialConfig()PCI-DSS 규정 준수금융 산업
GovernmentConfig()정부 표준공공 부문

레벨별 구성

go
func SecurityConfigForLevel(level SecurityLevel) *SecurityConfig
레벨상수설명
DevelopmentSecurityLevelDevelopment개발 환경, 가장 느슨함
BasicSecurityLevelBasic기본 필터
StandardSecurityLevelStandard표준 필터
StrictSecurityLevelStrict엄격한 필터
ParanoidSecurityLevelParanoid극한 필터

Clone

go
func (c *SecurityConfig) Clone() *SecurityConfig

보안 구성의 딥 카피를 생성합니다.

사용 방식

Config 로 구성

go
// DefaultConfig 에는 DefaultSecurityConfig() 가 내장되어 있어, 보통 명시적 할당 불필요
cfg := dd.DefaultConfig()
logger, _ := dd.New(cfg)

// 더 높은 보안 레벨 구성으로 교체해야 한다면 명시적으로 덮어쓰기
// cfg.Security = dd.DefaultSecureConfig()

런타임 수정

go
// 보안 구성 업데이트
logger.SetSecurityConfig(dd.DefaultSecureConfig())

// 현재 구성 읽기
sec := logger.GetSecurityConfig()

중첩 구조 필터

go
filter := dd.NewSensitiveDataFilter()

// 문자열 필터
filtered := filter.Filter("password=s3cr3t")
// → "password=[REDACTED]"

// 중첩 구조 (자동 재귀, 순환 참조 감지 지원)
data := map[string]any{
    "user": map[string]any{
        "name":     "admin",
        "password": "s3cr3t",
        "token":    "eyJhbGciOi...",
    },
}
filteredData := filter.FilterValueRecursive("data", data)

필터 통계 모니터링

go
filter := dd.NewSensitiveDataFilter()
// ... 필터 사용 ...
stats := filter.GetFilterStats()
fmt.Printf("총 필터: %d, 마스킹: %d, 평균 지연: %v\n",
    stats.TotalFiltered, stats.TotalRedactions, stats.AverageLatency)

다음 단계