설정이 있다는 것과 제대로 동작한다는 건 다른 문제
projects와 typing_phrases 테이블에 RLS가 활성화돼 있다는 것만 확인하고 안전하다고 넘겼다. "RLS가 켜져 있다"는 사실 자체를 안전의 증거로 받아들인 것이다.
실제 정책 조건을 하나씩 대조해봤다. projects 테이블에는 is_confidential이라는 게이트 컬럼이 있는데, 공개 읽기 정책의 조건은 true(무조건 공개)로 걸려 있었다. posts처럼 is_published = true로 걸러야 할 자리에 조건 자체가 없던 것이다. 정책을 is_confidential = false, is_active = true 조건으로 교정하고, dev와 prod 양쪽에 적용한 뒤 실제로 미발행 글과 대외비 프로젝트를 하나씩 만들어서 "진짜 안 보이는지" 눈으로 확인했다.
퍼블릭 페이지에서 대외비 프로젝트와 미발행 글이 노출되지 않도록 RLS(Row Level Security)를 걸어뒀다고 생각했는데, 실제로 조건을 하나씩 뜯어보니 그렇지 않은 부분이 있었다.
이후로는 권한이 걸린 기능마다 "구현했다"는 보고를 그대로 믿지 않고, 실제로 막히는 케이스를 만들어 실측하는 걸 검증 절차에 포함시켰다. 이 과정에서 anon 키를 쓰더라도 요청에 로그인 세션 쿠키가 함께 실리면 관리자 권한으로 데이터가 조회될 수 있다는 것도 추가로 발견해서, 오픈 전 정리 목록에 기록해뒀다.
앞으로 권한/보안이 걸린 테이블을 새로 만들 때는 "RLS가 켜져 있는가"가 아니라 "정책 조건이 실제 게이트 컬럼을 참조하는가"를 먼저 확인하고, 배포 전 반드시 비공개 데이터를 하나 만들어 실측하는 순서를 기본값으로 둔다.
관련 프로젝트
프로젝트 개요 기획자(PM)로서 AI를 활용한 업무 자동화(AX) 사례를 문서화하는 개인 포트폴리오 사이트입니다. 국내 기업의 AX 기획자/AI PM 직군으로의 커리어 전환을 목표로, 사이트 자체가 채용 지원용 스토리텔링 자료로 실사용되고 있습니다. 핵심 패턴: 업무 병목 발견 → AI로 워크플로우 재설계 → Before/After·근거·재현 가능성 문서화 전체 서사는 '실행하지 않은 아이디어 나열'이 아니라, 하나의 검증된 자동화 패턴과 도메인별 확장 블루프린트를 갖춘 재사용 가능한 엔진을 보유하는 방향으로 수렴하고 있습니다. 기술 스택 Next.js 16, Tailwind CSS v4, TypeScript Supabase (개발/운영 환경 분리), Vercel, Resend Claude API 기반 기술 자문 및 프롬프트 설계 보안 아키텍처 관리자 CRUD는 세션 기반 인증과 RLS(Row Level Security)로 보호 공개 읽기 전용 경로는 별도의 익명 클라이언트로 분리 서비스 롤 키는 애플리케이션 코드에서 완전히 배제 권한 검증은 마이그레이션 파일 및 대시보드 검토를 통해서만 진행 작업 방식 (에이전틱 IDE 협업 워크플로우) AI 에이전트 기반 IDE가 파일/버전관리 작업을 담당하고, LLM은 기술 자문 및 프롬프트 작성 역할을 수행하는 협업 구조를 운영합니다. AI 자문 → 에이전트용 프롬프트 작성 → 실행자가 붙여넣기 → 계획 확인 → 자문 검토 → 실행 승인 → 로그 검토 → 직접 클릭 테스트 → 명시적 지시 시에만 커밋 통제 규칙 실행 전 계획 검토 필수 요약 보고가 아닌 직접 클릭 테스트로 검증 개발 환경 우선 적용 후 명시적 승인 하에 운영 환경 반영 커밋은 명시적 지시가 있을 때만 수행 DB 자격증명 직접 연결 및 범위 외 삭제 금지 브랜치 전략: 개발 브랜치에서 작업 후 운영 브랜치는 배포 전용으로 직접 커밋 금지, 병합 전 변경 범위 검증 현재 진행 상황 고객사 미팅 브리핑 자동화 사례: 1단계 완료, 개발/운영 환경 배포 및 실데이터 테스트 완료 범위 변경 감지 자동화 사례: 상태 확인 진행 중 리스크 조기 경보 자동화 사례: 운영 환경 배포 완료 보안 사고 관련 포스트: 'AI 리스크 거버넌스 사례'로 재구성 예정 AI 활용 관련 콘텐츠 시리즈 초안 작성 완료, 게시 미확정 핵심 학습 원칙 보고가 아닌 검증: 버그·보안 이슈는 항상 직접 로그/브라우저 검토를 통해서만 발견되며, 에이전트의 자체 결과 요약을 그대로 신뢰하지 않음 보안 사고의 콘텐츠화: 실제 발생한 권한 관련 이슈 사례를 케이스 스터디로 재구성하여 콘텐츠화 커밋 의미 분리: 기능 단위/변경 유형별로 항상 분리 커밋 자동화하지 않는 것도 스토리: 저사용 빈도 기능을 의도적으로 고도화하지 않은 결정 자체를 AX 스토리텔링 소재로 활용