ClumL¶
- 기간: 2025.03 - 2026.07
AI 보안 분석 엔진의 외부 LLM API 호출량 제어 로직에서 발생한 동시성 문제¶
문제와 진단: 고객사 데모 서버에서 AI 보안 분석 엔진이 외부 LLM API로 보내는 호출이 장시간 대기하는 증상을 분석했습니다. 여러 호출이 같은 예약 전 상태를 읽어 처리 중 호출 수와 대기 중 토큰 예약량이 각각 허용치를 넘도록 함께 통과하는 확인-예약 경합을 원인 중 하나로 분리했으며, 고정 시간창 때문에 생기는 최대 대기 시간은 별개의 원인이었습니다.
제약과 선택: 외부 LLM API 호출의 동시 처리 수와 예상 토큰 예약량은 하나의 최신 상태를 기준으로 확인해야 했지만, 대기하는 동안 잠금을 잡으면 다른 호출 처리까지 막을 수 있었습니다. 용량 확인과 예약만 같은 잠금 구간에서 처리하고, 대기는 잠금을 해제한 뒤 수행하도록 선택했습니다.
도식을 좌우로 스크롤해 전체 흐름을 확인할 수 있습니다.
수정 전 실패 흐름: 용량 확인과 예약 기록이 서로 다른 잠금 구간에서 처리되어, 동시 호출이 같은 예약 전 상태를 볼 수 있었습니다.
도식을 좌우로 스크롤해 전체 흐름을 확인할 수 있습니다.
구현: 외부 LLM API 호출량 제어 로직이 하나의 예약 상태에서 통과 여부를 확인하고, 즉시 동시 호출 슬롯과 예상 토큰을 예약하도록 수정했습니다.
검증과 결과: 수정 전에는 처리 중 호출 수와 대기 중 토큰 예약량이 각각 허용치의 10배 이상으로 늘어나는 과다 예약을 재현했습니다. 수정 후에는 같은 동시성 조건에서 두 값이 각각의 허용치 이하로 유지되는지 회귀 테스트로 확인했습니다.
Rust 서비스의 네트워크 이벤트 탐지 임계값을 외부 설정으로 분리¶
문제와 진단: 작은 임계값 변경에도 코드 수정과 새 바이너리 배포가 필요했습니다. 탐지 로직 자체보다 pcap 재생 과정에서 반복 조정하는 값이 코드에 고정된 것이 변경 비용의 원인이었습니다.
제약과 선택: 반복 조정 대상은 발생 횟수 기반 탐지 임계값이었습니다. 탐지 모델 전체를 재작성하지 않고 이 값을 코드 경계 밖의 외부 설정으로 옮겼습니다.
구현: Rust 서비스가 임계값을 외부 설정에서 읽도록 변경했습니다.
- 변경 전: 코드 수정 → 빌드 → 바이너리 교체 → 서비스 재시작 → pcap 재생·DB 확인
- 변경 후: 설정 수정 → 서비스 재시작 → pcap 재생·DB 확인
검증과 결과: 동일한 pcap 재생과 DB 이벤트 확인을 기준으로 전후 절차를 비교했습니다. 반복 설정 변경 1회에서 코드 수정, 빌드, 바이너리 교체가 사라져 pcap 재생과 DB 확인 전까지의 운영 변경 작업 시간이 30% 이상 줄었습니다.
추가 작업¶
Chrono에서 Jiff로 시간 처리 의존성 전환¶
문제와 진단: 컴파일 성공만으로는 의존성 전환 뒤에도 타임스탬프 변환과 화면 표시가 유지되는지 확인하기 어려웠습니다.
제약과 선택: MITRE·클러스터링 화면의 타임스탬프 처리 헬퍼에서 기존 Chrono 동작을 테스트로 먼저 고정하고, Jiff 전환과 기존 의존성 정리를 단계별 변경으로 나눴습니다.
구현과 검증: 해당 타임스탬프 처리 헬퍼를 Jiff 기반으로 전환하고 Chrono 의존성을 제거했습니다. 각 단계의 테스트, 영향받는 화면, 기능별 동작, 서버 호환성, 변경 전후 화면을 대조했습니다.
리포트 조회 범위·DHCP 옵션 표시 검증¶
리포트 첫 이벤트 시간 조회와 고객 목록 로딩을 서로 다른 문제로 분리하고, 고객 목록에는 화면에 필요한 필드만 조회하는 리포트 전용 경량 쿼리와 점진적 렌더링 방향을 검토했습니다. DHCP 옵션은 GraphQL API의 options 필드, 표시 포매터, 원본 이벤트, 탐지 목록과 상세 화면을 함께 대조해 API 변경이 실제 표시까지 이어지는지 확인했습니다.