---
task_id: task-1989
type: context
scope: task
created: 2026-04-20
updated: 2026-04-20
status: completed
---

# 맥락 노트: task-1989

**task**: task-1989

---

## 결정 근거

### require_plan의 user_id 키
- `require_plan()` 함수는 L285에서 `{**plan_info, "_user_id": user_id}`를 반환
- 다른 모든 엔드포인트는 `plan_info.get("_user_id", "")` 사용
- L663만 `plan_info.get("user_id")`로 잘못 작성 → Gemini HIGH 지적 정당

### IDOR 취약점
- `get_keyword_result`에서 job_id만으로 조회 → 타 사용자의 분석 결과 접근 가능
- service role client 사용으로 RLS 우회 → user_id 필터 필수
- `.eq("user_id", plan_info.get("_user_id"))` 추가로 소유권 검증

### 에러 메시지 민감정보
- `f"...{exc}"` 패턴은 스택 트레이스/DB 구조 노출 위험
- logger.exception()으로 서버 측 로깅 + 일반 메시지 반환으로 수정

## 3 Step Why

1st Why: "왜 이 수정이 필요한가?" → 보안 취약점(IDOR, 정보 노출)과 기능 버그(잘못된 키)가 프로덕션 배포를 차단
2nd Why: "왜 Gemini 제안대로 수정하는 것이 최선인가?" → 제안이 정확하고, 코드 패턴이 기존 다른 엔드포인트와 일관성 유지
3rd Why: "왜 이 접근이 다른 대안보다 나은가?" → 최소 변경으로 보안 이슈 해결, 기존 코드 변경 불필요

## 참조 자료

- Gemini 코멘트: `gh api repos/JonghyukJeon/InsuRo/pulls/4/comments`
- require_plan 함수: `server/main.py:285`

## 추가 결정 (2026-04-20 세션 2)

### Gemini 재리뷰 타임아웃 대응
- 04/20 08:08 push 후 5분 대기 → 타임아웃
- 04/20 08:23 빈 커밋 재트리거 → 5분 대기 → 타임아웃
- 규칙에 따라 머지 차단 → 아누 승인 대기로 결정
- 근거: DIRECT-WORKFLOW.md Step 4.7.6 "5분 타임아웃 시 머지 차단"

### L1 스모크테스트 실행
- 서버 기동 성공 (worktree에서 uvicorn 직접 실행)
- 3개 수정 엔드포인트 curl 검증 → 인증 미포함 시 401, 내부 정보 미노출 확인

## 주의사항

- PR #4의 기존 코드 변경은 유지 — Gemini 지적 사항만 수정
- 기존 테스트 회귀 금지
