콘텐츠로 이동

ClumL

  • 기간: 2025.03 - 2026.07

AI 보안 분석 엔진의 외부 LLM API 호출량 제어 로직에서 발생한 동시성 문제

문제와 진단: 고객사 데모 서버의 장시간 대기를 분석하던 중, AI 보안 분석 엔진의 외부 LLM API 요청 제한 로직에서 동시 호출들이 같은 예약 전 상태를 읽어 처리 중 호출 수와 대기 중 토큰 예약량을 허용치 이상으로 늘리는 경합을 발견했습니다. 이를 고정 시간창 경계에서 발생한 별도 대기 문제와 구분하고, 수정 범위를 과다 예약 경합으로 한정했습니다.

제약과 선택: 외부 LLM API 호출의 동시 처리 수와 예상 토큰 예약량은 하나의 최신 상태를 기준으로 확인해야 했지만, 대기하는 동안 잠금을 잡으면 다른 호출 처리까지 막을 수 있었습니다. 용량 확인과 예약만 같은 잠금 구간에서 처리하고, 대기는 잠금을 해제한 뒤 수행하도록 선택했습니다.

도식을 좌우로 스크롤해 전체 흐름을 확인할 수 있습니다.

보안 분석 UI 요청이 API와 분석 작업을 거쳐 호출량 제어기로 전달되고, 제어기가 예약·용량 상태를 확인한 뒤 외부 LLM API를 호출합니다.

수정 전 실패 흐름: 용량 확인과 예약 기록이 서로 다른 잠금 구간에서 처리되어, 동시 호출이 같은 예약 전 상태를 볼 수 있었습니다.

도식을 좌우로 스크롤해 전체 흐름을 확인할 수 있습니다.

동시 호출 A와 B가 같은 예약 전 상태를 읽고 모두 통과한 뒤 각각 예약을 기록해 허용치를 넘길 수 있는 수정 전 경합 흐름입니다.

구현: 외부 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 조회부터 포매터, 목록·상세 화면까지 이어지도록 구현하고, 두 화면의 표시를 원본 이벤트와 대조해 검증했습니다.