보안 필터
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 intString() 메서드를 구현하여 읽기 쉬운 레벨 이름을 반환합니다.
| 상수 | 설명 |
|---|---|
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| 레벨 | 상수 | 설명 |
|---|---|---|
| Development | SecurityLevelDevelopment | 개발 환경, 가장 느슨함 |
| Basic | SecurityLevelBasic | 기본 필터 |
| Standard | SecurityLevelStandard | 표준 필터 |
| Strict | SecurityLevelStrict | 엄격한 필터 |
| Paranoid | SecurityLevelParanoid | 극한 필터 |
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)