- Security Gate E2E API 테스트 스크립트 작성 및 실행:
/v1/evidence/presign → S3 presigned URL 발급
→ CI가 S3로 PUT 업로드
→ /v1/evidence/complete로 업로드 완료 콜백
→ /v1/decisions/evaluate로 정책 평가 및 판정(PASS/FAIL/PENDING) 확인
위 플로우를 단일 bash 스크립트로 구성하여 반복 테스트 가능하도록 정리하였다.
- IRSA(OIDC Provider) 연동 이슈 분석 및 해결:
Pod에서 AssumeRoleWithWebIdentity 호출 시 "No OpenIDConnect provider found" 예외가 발생하여
EKS OIDC Provider 설정 누락/불일치를 의심하고 원인 분석을 진행하였다.
eksctl utils associate-iam-oidc-provider 실행 결과 OIDC Provider는 이미 연결된 상태였으며,
실제 문제는 IAM Role(security-gate-irsa)의 trust policy가 템플릿(OIDC_PROVIDER_ID) 값으로 남아 있어
클러스터 OIDC ID와 불일치한 점으로 확인되었다.
trust policy를 실제 OIDC ID 값으로 업데이트하고 ServiceAccount annotation/Deployment 롤아웃을 통해
IRSA가 정상 작동하도록 조치하였다.
- Signature 인증 규칙/문서 정리:
API 인증은 HMAC 기반 헤더 방식(X-SG-Timestamp/X-SG-Signature)을 사용하며,
서명 문자열 구성 방식(timestamp.method.path.raw_body)을 스크립트로 구현하였다.
특히 GET 요청에서 query string을 포함하여 서명할 경우 AUTH_SIGNATURE_INVALID가 발생하는 문제를 확인했고,
서버 규칙에 맞춰 "path only (no query string)"로 canonicalization 규칙을 고정하였다.
- EKS 상에서 운영 디버깅 절차 확립:
kubectl logs 기반으로 FastAPI/Starlette 예외 추적 후,
presign/complete 단계별로 실패 원인을 S3 또는 DynamoDB/STS(IRSA) 영역으로 분리하여
장애 범위를 빠르게 좁히는 기준을 수립하였다.
- GitHub Checks API + Slack Alert(알림) 연동 계획 수립:
Decision Engine 결과를 기반으로 GitHub Required Status Check(Check Runs API)를 업데이트하여
PR 머지 차단/허용이 되도록 하는 구조를 확정하였다.
인증 방식은 PAT이 아닌 GitHub App 기반(JWT → installation token)으로 설계하였다.
또한 Slack 외 대체 알림 채널로 PagerDuty/Opsgenie(온콜), Jira(Service Management) 등 확장 가능성을 검토하였다.
- GitHub-hosted runner로 Gate 호출 방식 검토:
GitHub-hosted runner 환경에서 EKS 내부 서비스 접근을 위해
(1) Ingress(ALB)로 공개 엔드포인트 제공 방식
(2) kubectl port-forward 기반 임시 접근 방식
두 가지를 비교 검토하여 MVP 단계에서는 운영 단순성과 안정성을 고려한 Ingress 기반 접근을 우선 검토하였다.
- 워커 handle_execute: 큐 아이템별 LLM 플랜 → MCP 툴 실행(순차) → 최종 한 번 요약하는 구조로 정리, args 전달 지원
- 이벤트 확장: execution.tool_call, execution.tool_result, execution.item_completed 등 툴 실행 흐름 로그 발행(민감정보 마스킹 없음)
- MCP Tool Server: /tools에 inputSchema/meta 포함, execute 요청에 args 허용, 주요 툴(katana/hakrawler/httpx/nuclei/arjun/ffuf/kiterunner/zap/sslyze 등) args 매핑, httpx -no-redirects 제거, URL 결합 시 포트/스킴 보존
- Playwright: actions/headless/block_resources/max_steps 반영, 기본 탐색 제한(페이지 20, 액션 80 등) 유지, 커스텀 액션 최소 지원
- UI(App.tsx): 실행 중 중간 LLM 응답 노출 제거, 최종 요약만 표시(필요 시 재활용 가능). selecting/페이징/더미 데이터 등 디자인 개선을 여러 차례 적용(페이드인, 정렬, 버튼 폭 통일 등)
Security Gate의 presign API는 정상화되었으나, complete/evidence 조회/decision 평가 단계에서 INTERNAL_ERROR 및 AUTH_SIGNATURE_INVALID 이슈가 발생하여 서버/클라이언트의 signature canonicalization 규칙 통일이 필요했다. 또한 complete 단계는 DynamoDB 권한/테이블/환경변수 설정 여부에 영향을 크게 받으므로, 500 응답을 단순 INTERNAL_ERROR로 처리하는 대신 AccessDenied/ValidationException 등을 명확한 에러 코드로 매핑하도록 예외 처리 개선이 필요하다. GitHub-hosted runner 접근을 위한 Ingress 도입 시 인터넷 노출에 따른 보안 강화(HTTPS, WAF, rate limiting, 인증 강화) 정책