{
  "pass": false,
  "risks": [
    {
      "severity": "critical",
      "description": "검색량 조회가 네이버 검색광고 Keyword Tool API가 아니라 DataLab API를 호출합니다. DataLab 응답에는 monthlyPcQcCnt/monthlyMobileQcCnt/compIdx 또는 keywordList가 없어 프론트가 빈 결과를 표시합니다."
    },
    {
      "severity": "high",
      "description": "동작 중인 대시보드는 NAVER_SEARCHAD_CUSTOMER_ID, NAVER_SEARCHAD_API_KEY, NAVER_SEARCHAD_SECRET_KEY와 HMAC 서명으로 /keywordstool을 호출하지만 InsuRo 백엔드는 NAVER_CLIENT_ID/SECRET만 사용합니다. 현재 .env에도 SearchAd 키 설정이 확인되지 않습니다."
    },
    {
      "severity": "high",
      "description": "DataLab 실패 시 블로그 검색 결과 건수를 검색량처럼 표시하는 fallback이 있어 실제 오류를 숨기고 잘못된 데이터를 사용자에게 보여줄 수 있습니다."
    },
    {
      "severity": "medium",
      "description": "API 미설정 또는 네이버 API 오류 상세가 프론트에서 '검색에 실패했습니다'로 뭉개져 완료 시그니처의 '명확한 안내'를 충족하지 못합니다."
    },
    {
      "severity": "medium",
      "description": "빈 키워드는 버튼 disabled와 조기 return만 있고 사용자 안내가 없어 검증 시나리오의 validation 피드백이 부족합니다."
    },
    {
      "severity": "low",
      "description": "블로그 fallback URL에 query를 직접 문자열 삽입하고 있어 공백/특수문자 포함 키워드에서 요청이 깨질 수 있습니다."
    }
  ],
  "suggestions": [
    "InsuRo 백엔드에 대시보드의 SearchAd 구현을 이식하세요: /keywordstool, X-Timestamp, X-API-KEY, X-Customer, X-Signature(HMAC-SHA256) 사용.",
    "환경변수는 NAVER_SEARCHAD_CUSTOMER_ID, NAVER_SEARCHAD_API_KEY, NAVER_SEARCHAD_SECRET_KEY를 기준으로 확인하고, 누락 시 500/503과 함께 '네이버 검색광고 API 키가 설정되지 않았습니다' 같은 명확한 detail을 반환하세요.",
    "프론트는 DataLab 호출과 블로그 fallback을 제거하고 검색량 전용 엔드포인트를 호출하도록 바꾸세요. 응답 shape는 keywordList 또는 results 중 하나로 통일해야 합니다.",
    "네이버 API 오류 detail을 toast에 노출하되 민감정보는 제외하세요.",
    "빈 키워드 입력 시 toast 또는 inline 메시지로 '키워드를 입력하세요'를 표시하세요.",
    "수정 후 '실비보험' 검색, 빈 키워드, npm run build를 검증하세요."
  ],
  "source": "codex_companion",
  "fallback_reason": null,
  "error": null,
  "task_id": "task-2101",
  "timestamp": "2026-04-22T06:22:03.925911+00:00"
}