feat: 프로젝트 API Bearer 토큰 인증 + E2E 테스트 스크립트 + 크몽 마케팅 이미지

- app/api/projects, link/route: Cookie + Bearer 토큰 이중 인증 지원 (E2E 테스트 대응)
- app/mypage: 로또 기록 탭 제거, 구독 빈 상태 프롬프트 서비스로 변경
- scripts/test-flow.mjs: 견적서 발송→연결→마일스톤 진행 E2E 테스트 스크립트
- supabase/migrations/003: quotes RLS 비활성화 (관리자 서버 전용 접근)
- marketing/kmong-images: 크몽 서비스 A 상세 이미지 5장 (HTML 스크린샷용)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-02 04:15:47 +09:00
parent 19b09e3b90
commit 2c9af41631
10 changed files with 1589 additions and 77 deletions

View File

@@ -0,0 +1,42 @@
-- ============================================================
-- quotes 테이블 RLS 수정
-- 문제: 이전 마이그레이션이 quotes RLS를 활성화했으나
-- 관리자 클라이언트가 service_role 없이 anon 키를 사용하여 INSERT/SELECT 불가
--
-- 해결: quotes 테이블은 서버 사이드 관리자 코드로만 접근하므로
-- RLS 비활성화 (anon 키에 직접 노출되지 않으므로 안전)
-- project_milestones는 유저 보안상 RLS 유지
--
-- Supabase Dashboard > SQL Editor 에서 실행하세요
-- ============================================================
-- quotes 테이블 RLS 비활성화 (관리자 서버 코드만 접근)
ALTER TABLE quotes DISABLE ROW LEVEL SECURITY;
-- 기존 quotes 정책 삭제 (있다면)
DROP POLICY IF EXISTS "Users view own quotes" ON quotes;
-- quotes 테이블의 모든 RLS 정책 삭제 후 RLS 비활성화
DO $$
DECLARE
pol record;
BEGIN
FOR pol IN
SELECT policyname FROM pg_policies WHERE tablename = 'quotes'
LOOP
EXECUTE format('DROP POLICY IF EXISTS %I ON quotes', pol.policyname);
END LOOP;
END $$;
ALTER TABLE quotes DISABLE ROW LEVEL SECURITY;
-- 확인
SELECT relrowsecurity FROM pg_class WHERE relname = 'quotes';
-- project_milestones: anon 역할도 admin 작업 가능하도록
-- (서버 사이드 코드에서만 사용, 클라이언트 직접 접근 없음)
CREATE POLICY "Admin manage milestones"
ON project_milestones FOR ALL TO anon
USING (true)
WITH CHECK (true);