---
task_id: task-2103
type: context
scope: task
created: 2026-04-22
updated: 2026-04-22
status: in-progress
---

# 맥락 노트: task-2103

**task**: task-2103

---

## 결정 근거

### JWT 인증 방식: Supabase createClient + getUser
- generate-content Edge Function의 패턴 참조
- Supabase JS SDK의 createClient에 Authorization 헤더의 토큰을 전달하면 자동으로 인증된 클라이언트 생성
- getUser()로 user_id 추출 후 subscription 테이블 조회

### 플랜 검증: PLAN_FEATURE_MAP의 ai_topic_suggest → "프로" 기준 적용
- main.py의 PLAN_FEATURE_MAP에서 ai_topic_suggest는 "프로" 최소 요구
- subscription_plans.sort_order >= 프로(3) 확인

### 프론트엔드 변경 불필요
- supabase.functions.invoke()는 자동으로 현재 세션의 access_token을 Authorization 헤더로 포함
- Supabase SDK 기본 동작이므로 추가 코드 불필요

## 3 Step Why

### 1st Why: "왜 이 설계가 필요한가?"
- A: suggest-topics URL을 직접 호출하면 인증/플랜 검증 없이 AI 주제 추천이 가능하여 비용 누수 및 기능 우회 발생

### 2nd Why: "왜 Edge Function 내 JWT 검증이 최선인가?"
- B: Edge Function 레벨에서 검증하면 모든 호출 경로(프론트, 직접 API, 외부)에서 일관된 보안 적용. 프론트만 막으면 curl로 우회 가능.

### 3rd Why: "왜 Supabase createClient 방식이 다른 대안보다 나은가?"
- C: generate-content 등 기존 Edge Function과 동일한 패턴이라 일관성 유지. Supabase SDK가 JWT 파싱/검증을 자체 처리하므로 수동 jwt.decode보다 안전하고 유지보수 용이.

A→B→C 논리 일관성: ✅ (서버측 우회 → Edge Function 레벨 검증 → Supabase SDK 활용)

## 참조 자료

- generate-content/index.ts: `/home/jay/projects/InsuRo/supabase/functions/generate-content/index.ts` (JWT+플랜 검증 패턴)
- main.py PLAN_FEATURE_MAP: `/home/jay/projects/InsuRo/server/main.py:219` (ai_topic_suggest → 프로)

## 주의사항

- CORS 헤더에 authorization 포함 확인 (이미 포함됨)
- Supabase Edge Function에서는 Deno.env.get으로 환경변수 접근
