프로덕션 체크리스트
기본 설정
- [ ]
HighSecurityConfig()또는 커스텀 보안 설정 사용 - [ ] 비즈니스 요구에 따라 적절한
MaxInputSize설정 - [ ] 장시간 차단을 방지하기 위해
ProcessingTimeout설정 - [ ] DOM 깊이를 제한하는
MaxDepth설정 - [ ] 콘텐츠 정제를 위해
EnableSanitization활성화
Processor 라이프사이클
- [ ]
defer p.Close()를 사용하여 Processor 가 올바르게 해제되도록 보장 - [ ] 종료 후 Processor 를 계속 사용하지 않기
- [ ] 리소스를 재사용하기 위해 싱글톤 Processor 사용 고려
go
p, err := html.New(html.HighSecurityConfig())
if err != nil {
log.Fatal(err)
}
defer p.Close()감사와 모니터링
- [ ] 감사 시스템 활성화
- [ ] 적절한 감사 레벨 필터링 설정
- [ ]
WriterAuditSink를 사용하여 감사 로그 영구 저장 - [ ]
GetStatistics()의 오류 카운트 모니터링 - [ ]
ErrInternalPanic오류와AuditEventPathTraversal감사 이벤트에 주의
go
auditFile, _ := os.OpenFile("audit.jsonl", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
defer auditFile.Close()
cfg := html.HighSecurityConfig()
cfg.Audit.Sink = html.NewWriterAuditSink(auditFile)컨텍스트와 타임아웃
- [ ] 모든 추출 작업에
ExtractWithContext버전 사용 - [ ] 적절한 컨텍스트 타임아웃 설정
- [ ] 배치 작업에 취소가 포함된 컨텍스트 사용
go
ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
defer cancel()
result, err := html.ExtractWithContext(ctx, data)오류 처리
- [ ] 비즈니스 오류와 보안 오류 구분
- [ ] 모든
ErrInputTooLarge와ErrMaxDepthExceeded기록 - [ ]
ErrInternalPanic발생 빈도 모니터링 - [ ]
ErrFileNotFound에 대해 원시 오류 메시지 대신SafePath()확인
리소스 관리
- [ ] 배치 작업은 한 번에 10000 건을 초과하지 않기
- [ ]
WorkerPoolSize를 적절하게 설정 - [ ] 정기적으로
ClearCache()를 호출하여 캐시 해제 - [ ] 메모리 사용량과 캐시 적중률 모니터링
파일 처리
- [ ] 파일 경로 출처 검증 (사용자가 경로를 제어하지 못하도록 방지)
- [ ] 파일 읽기 디렉토리 제한
- [ ] 파일 크기를 먼저 확인한 후 처리