# InforKeyword 기술 리서치 보고서

**작성일**: 2026-03-04
**작성**: 개발2팀 (오딘 팀장, 토르, 프레이야, 미미르, 헤임달)
**프로젝트**: InforKeyword — 정보성 키워드 자동 판별 웹앱

---

## 1. 네이버 자동완성어 가져오는 방법

### 방법: 비공식 API (인증 불필요)

**엔드포인트** (검증 완료):
```
GET https://mac.search.naver.com/mobile/ac?q={키워드}&q_enc=UTF-8&st=100&frm=mobile_nv&r_format=json
```

**응답 구조**:
```json
{
  "query": ["암보험"],
  "items": [[
    ["암보험"], ["암보험비갱신형"], ["암보험금"],
    ["암보험가입시"], ["암보험비교사이트"],
    ["50대암보험"], ["환급형암보험"], ["갱신형암보험"]
  ]]
}
```

- **추출 경로**: `response.items[0][n][0]` → n번째 자동완성 키워드
- **핵심 파라미터**: `st=100` 필수 (없으면 빈 배열 반환)
- **인증**: 불필요
- **비용**: 무료
- **차단 리스크**: 낮음 (키워드당 1초 이상 간격 권장)
- **실현 가능성**: 높음 (실제 테스트로 검증 완료)

### 추천안
즉시 사용 가능. Rate limit 자체 조절(1초 간격) + User-Agent 설정 권장.

---

## 2. 네이버 검색광고 API (키워드 검색량)

### 방법: 공식 RESTful API (인증 필수)

**엔드포인트**:
```
GET https://api.searchad.naver.com/keywordstool
```

**인증 방법** — HTTP 헤더 4개:
- `X-API-KEY`: 액세스 라이선스
- `X-Customer`: 고객 ID
- `X-Timestamp`: Unix timestamp (밀리초)
- `X-Signature`: HMAC-SHA256 서명 (Base64)

**서명 생성**:
```python
import hashlib, hmac, base64
message = f"{timestamp}.{method}.{uri}"
sig = base64.b64encode(hmac.new(secret.encode(), message.encode(), hashlib.sha256).digest())
```

**응답 구조**:
```json
{
  "keywordList": [{
    "relKeyword": "암보험",
    "monthlyPcQcCnt": 12000,
    "monthlyMobileQcCnt": 45000,
    "compIdx": "중간"
  }]
}
```

**계정 생성**: searchad.naver.com → 도구 → API 사용 관리 → 신청 (광고비 없이 무료 발급 가능)

- **비용**: API 자체 무료 (검색광고 계정만 필요)
- **차단 리스크**: 없음 (공식 API)
- **실현 가능성**: 높음 (계정 발급 후 즉시 사용)

### 추천안
**필수 사용**. 검색량 20 이상 판별(4단계)에 유일한 공식 데이터 소스.

### 액션 필요
- [ ] searchad.naver.com에서 검색광고 계정 생성
- [ ] API Key / Secret Key / Customer ID 발급

---

## 3. 네이버 연관검색어

### 방법: HTML 크롤링 (공식 API 없음)

연관검색어는 통합검색 HTML 내 `<script>` 블록에 URL-encoded JSON으로 포함됨.

**추출 경로**: `relatedKeywords` 배열
```python
# URL-encoded JSON에서 추출
pattern = r'relatedKeywords%22%3A%5B([^%\]]*(?:%[A-F0-9]{2}[^%\]]*)*?)%5D'
```

**테스트 결과**: "암보험" → `["실비보험", "유병자보험", "의료실비보험", "실비보험보장"]`

- **비용**: 무료
- **차단 리스크**: 중간 (HTML 구조 변경 가능)
- **실현 가능성**: 중간

### 추천안
자동완성 API를 연관검색어 대용으로 병행 사용. HTML 파싱은 백업으로.

---

## 4. 네이버 블로그탭/카페탭 크롤링

### 4-1. 블로그탭

**URL**: `https://search.naver.com/search.naver?where=blog&query={키워드}`

**렌더링**: SSR — `axios`/`fetch`로 직접 파싱 가능 (Headless browser 불필요)

**핵심 선택자**:
- 결과 아이템: `[data-template-id="ugcItem"]`
- 광고 판별: `_fe_view_power_content` 클래스 or `integration_66.naver` 링크
- 제목/URL: `a[data-heatmap-target=".imgtitlelink"]`
- 작성자: `[data-heatmap-target="articleSourceJSX_title"]`

**블로그 소스 구분**:
- `blog.naver.com` → 네이버 블로그
- `tistory.com` → 외부 블로그 (탈락 대상)
- `brunch.so`, `blog.daum.net` → 외부 블로그

### 4-2. 블로그 본문 크롤링

**URL**: `https://blog.naver.com/PostView.naver?blogId={id}&logNo={no}&redirect=Dlog&widgetTypeCall=true&directAccess=false`

- SSR 응답 (274KB), Referer 헤더 필수
- 본문 텍스트: `p.se-text-paragraph span`
- 이미지: `data-linkdata` JSON에서 `src` 추출
- 외부 링크: `data-linkdata`의 `linkUse=true` + `link` 필드
- 톡톡: `talk.naver.com`, `talkpf.naver.com`
- 플레이스: `place.naver.com`, `map.naver.com`
- 첨부파일: `.se-module-file`

### 4-3. 카페탭

**URL**: `https://search.naver.com/search.naver?ssc=tab.cafe.all&where=cafe&query={키워드}`

- `ssc=tab.cafe.all` 파라미터로 구형 렌더러 사용 권장
- **대표 뱃지**: `i.spnew.api_ico_total` (텍스트: "대표")
- **광고**: `i.spcafe.ico_ad`

### 크롤링 스택 추천

| 대상 | 방법 | 난이도 |
|------|------|--------|
| 검색 결과 | axios + cheerio | 쉬움 |
| 네이버 블로그 본문 | axios + PostView URL | 쉬움 |
| 티스토리 본문 | axios 직접 | 쉬움 |
| 카페 본문 | Puppeteer (로그인 필요) | 어려움 |

**차단 대응**: User-Agent(Chrome 120+), 요청 간격 300ms~1s, Accept-Language: ko-KR

---

## 5. 이미지 OCR (전화번호/주소 감지)

### 기술 비교

| 항목 | Tesseract | Google Vision | Clova OCR | EasyOCR |
|------|-----------|---------------|-----------|---------|
| 한국어 정확도 | 70~85% | 90~97% | 95~98% | 80~90% |
| 전화번호 인식 | 낮음 | 높음 | 최고 | 중간 |
| 주소 인식 | 낮음 | 양호 | 최고 | 중간 |
| 이미지당 비용 | 무료 | $0.0015 | ~₩3 | 무료 |
| 월 무료 한도 | 무제한 | 1,000장 | 제한적 | 무제한 |
| 응답 속도 | 1~5초 | 0.5~2초 | 1~3초 | 2~10초 |
| 구현 난이도 | 중 | 낮음 | 낮음 | 중 |

### 추천안: Google Cloud Vision API (1순위)

1. 기존 GCP 프로젝트(`insuwiki-j2h`) 즉시 활용 가능
2. 월 1,000장 무료 (PoC/초기 충분)
3. 정확도 95% 미만 시 Clova OCR로 전환 검토

### 전화번호/주소 정규식 (OCR 결과 후처리)

```python
# 전화번호
PHONE_PATTERNS = [
    r'(?<!\d)0\d{1,2}[-.\s]?\d{3,4}[-.\s]?\d{4}(?!\d)',
    r'(?<!\d)1[0-9]{3}[-.\s]\d{4}(?!\d)',
]
# 주소
ADDR_PATTERN = r'(?:서울|경기|인천|부산|대구|광주|대전|울산|세종|강원|충[남북]|전[남북]|경[남북]|제주)[시도]?\s*[가-힣\s\d]+(?:로|길|동|구|시|군)\s*\d{1,5}'
```

---

## 6. LLM 연동

### 6-1. 키워드 30개 자동 생성

**추천 모델**: Gemini 2.5 Flash

| 모델 | 입력 비용/1M | 출력 비용/1M | 추천도 |
|------|-------------|-------------|--------|
| Gemini 2.5 Flash | $0.30 | $2.50 | 1순위 |
| GPT-4o mini | $0.15 | $0.60 | 2순위 |

- **InsuWiki 기존 Gemini API 키 활용 가능** (신규 비용 없음)
- 1회 호출 비용: ~$0.001 (₩1.4)
- 2단/3단 키워드 구조화 프롬프트 설계 완료

### 6-2. 홍보성 글 판별 ("누가봐도 홍보")

**추천 모델**: Gemini 2.5 Flash (동일)

- 1개 글 분석 비용: ~$0.0008 (₩1.1)
- 텍스트 앞 1,500자 + 뒤 500자 청크 추출 전략
- JSON 출력 (is_promotional, confidence, signals)

### 6-3. 비용 종합 (1회 분석: 5키워드 × 10블로그)

| 항목 | 비용 |
|------|------|
| LLM 키워드 생성 (5회) | $0.005 |
| LLM 홍보성 판별 (50회) | $0.040 |
| OCR (150장, 무료구간) | $0.00 |
| **1회 총계** | **$0.045 (₩63)** |

**월간 추정 (일 5회)**:
- LLM: $6.75/월
- OCR (22,500장): $32.25/월
- **월 총계: ~$39 (₩54,600)**

---

## 7. InsuWiki 기존 자산 활용

| 자산 | 활용 방안 |
|------|----------|
| Firebase (insuwiki-j2h) | 인증, Firestore DB 재활용 가능 |
| GCP 프로젝트 | Cloud Vision API 활성화 |
| Gemini API 키 | 키워드 생성 + 홍보성 판별 |
| Vercel 계정 | 프론트엔드 배포 |
| 네이버 검색광고 API | **신규 발급 필요** |

---

## 8. 기술스택 제안 (다음 섹션: 아키텍처 설계서 참조)

| 영역 | 기술 | 근거 |
|------|------|------|
| 프론트엔드 | Next.js 15 (App Router) | InsuWiki와 동일 스택, Vercel 배포 |
| 백엔드 | Next.js API Routes + Python Worker | 크롤링/OCR는 Python이 유리 |
| DB | Firestore | 기존 insuwiki-j2h 프로젝트 활용 |
| OCR | Google Cloud Vision API | GCP 인프라 재활용 |
| LLM | Gemini 2.5 Flash | 기존 API 키 활용 |
| 검색량 | 네이버 검색광고 API | 유일한 공식 소스 |
| 크롤링 | axios + cheerio (Node.js) | SSR 대응 충분 |
| 인증 | Firebase Auth | 기존 인프라 |
| 배포 | Vercel (Frontend) + Cloud Run (Python Worker) | |
