보안을 다시 설계하고 정식 오픈까지
①②의 편법(무단 계정 생성, 서비스 롤 우회)이 발견된 뒤, 정식 오픈 전 보안 구조 전체를 재검토해야 했다. 어드민 세션이 퍼블릭 페이지에서 새어나갈 가능성, ISR(revalidate=60)이 동적 렌더링에 의해 무력화되는 문제 등 겉으로는 드러나지 않는 리스크가 남아있었다.
createPublicClient(쿠키 미포함 anon)로 전환해 어드민 세션 노출과 ISR 무력화 문제를 동시에 해결했다. RLS 정책을 모든 CRUD(문의 삭제 포함)에 대해 dev/prod 양쪽에 동일하게 적용했고, 서비스 롤은 프로젝트에서 완전히 제거했다. 이 모든 변경을 docs/SECURITY_CHECKLIST.md에 기록한 뒤 develop→main 머지, Vercel Production 배포까지 완료했다.
보안을 다시 설계하고 정식 오픈까지
보안 문제 하나를 고치다 보면 다른 문제가 같이 풀리는 경우가 있다. createPublicClient 전환이 그 예시였다 — 세션 노출과 ISR 문제가 사실은 같은 원인(쿠키 포함 클라이언트 사용)에서 나온 것이었다. 개별 증상을 하나씩 패치하기보다, 근본 원인을 찾아 구조를 바꾸는 것이 더 적은 코드로 더 많은 문제를 해결했다.
"증상이 여러 개면 원인이 하나일 수 있다"는 이 패턴은 보안 이슈뿐 아니라 일반적인 디버깅에도 적용 가능하다. 여러 버그를 개별적으로 패치하기 전에, 공통 원인이 있는지 먼저 확인하는 습관이 이번 프로젝트에서 재사용 가능한 자산이 되었다.