Claude Code가 거의 모든 프로젝트에서 Supabase 인증 패턴을 보안 구멍이 생기게 작성함
Claude Code writes this Supabase auth pattern in almost every project and it's a security hole
핵심 요약
Claude Code가 Supabase 인증 시 클라이언트에서 수정 가능한 user_metadata를 사용하거나 서비스 키를 노출하는 보안 취약점을 생성한다는 지적입니다.
- 보안 취약점 — Claude Code가 클라이언트에서 조작 가능한 user_metadata를 권한 확인에 사용함
- 서비스 키 노출 — Next.js 컴포넌트 내부에 서비스 역할 키를 포함해 RLS를 우회함
- 정적 린터 도입 — 작성자가 이러한 보안 실수를 자동으로 잡아내는 린터를 직접 개발함
- 보안 전략 — 프롬프트 지침과 린터, 테스트를 결합한 다층 보안 체계가 필요함
이거 다른 사람들도 눈치챘음?
Claude Code한테 Supabase 인증을 역할 기반으로 설정해달라고 할 때마다 이런 코드를 생성함:
if (user.user_metadata.role === 'admin') {
// admin-only action
}
괜찮아 보임. 개발 환경에선 잘 돌아감. 하지만 user_metadata는 클라이언트에서 쓰기가 가능함 — 인증된 사용자라면 누구나 Supabase의 /auth/v1/user 엔드포인트를 호출해서 자신의 역할을 admin으로 설정할 수 있음. 에러도 없고 경고도 없음.
올바른 확인 방식은 서버 전용인 app_metadata.role을 사용하는 거임. Claude Code는 이걸 절대 안 씀.
그리고 이것도 계속 함:
const supabase = createClient(url, process.env.SUPABASE_SERVICE_ROLE_KEY)
...Next.js 컴포넌트 안에서 말임. 서비스 역할 키는 RLS를 완전히 우회하는데 이게 클라이언트 번들에 포함되어 나감.
둘 다 에러가 발생하지 않음. 둘 다 완벽하게 작동함.
다른 사람들도 똑같은지, 아니면 내가 프롬프트를 이상하게 넣어서 이러는 건지 궁금함.


