보안사례 인기

service_role 키 실수로 깃에 올렸어요… 어떻게 수습하죠?

M
@minu
1시간 전 · 조회 1.2k

코딩은 거의 모르고 Cursor한테 시키면서 가계부 앱을 만들었어요. 어제 깃허브에 올렸는데, 오늘 보니까 .env 파일이 그대로 같이 올라가 있더라고요.

그 안에 Supabase service_role 키가 들어 있어요. 검색해보니 이게 RLS를 우회하는 마스터 키라던데… 일단 커밋에서 .env를 지우면 되는 건가요? 아니면 키 자체를 새로 발급받아야 하나요?

급해서 우선 레포를 private으로 돌려놨습니다. 비슷한 경험 있으신 분 조언 부탁드려요 🙏

취약점

service_role 키가 프론트엔드 번들에 그대로 포함돼, 누구나 개발자도구로 키를 꺼내 RLS를 전부 우회하고 DB 전체를 읽고 쓸 수 있었습니다.

방어

클라이언트엔 공개돼도 되는 anon 키만 환경변수로 주입하고, service_role 은 서버 전용으로 분리. 이미 노출된 키는 Supabase 대시보드에서 즉시 재발급합니다.

supabaseClient.ts+83
11 import { createClient } from '@supabase/supabase-js'
2+import { createClient } from '@supabase/supabase-js'
23
3// ❌ service_role 키가 프론트 코드에 노출
4+
5+// ✅ 공개돼도 되는 anon 키만 클라이언트에
46 export const supabase = createClient(
5 'https://xxxx.supabase.co',
6 'eyJ...service_role...KEY' // RLS 전체 우회
7+export const supabase = createClient(
8+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
9+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
710 )
11+)
12+// service_role 은 서버 환경변수로만 (노출 키는 대시보드에서 재발급)
supabase키노출긴급
댓글 3

댓글 3

Y
S
@sora52분 전 베스트 댓글

지우는 걸로는 부족해요. 깃 히스토리에 남아있고, public이었던 순간 이미 봇들이 긁어갔다고 보는 게 안전합니다. 순서는 (1) Supabase 대시보드에서 service_role 키 **즉시 재발급(rotate)** → (2) 코드에서 .env 제거 + .gitignore 추가 → (3) git filter-repo로 히스토리 정리. 1번이 제일 급해요.

M
@minu40분 전

헉 봇이 이미 긁어갔을 수 있군요… 방금 키 재발급부터 했습니다. 감사합니다!

K
@kev31분 전

Vyb 진단 한번 돌려보세요. 노출된 키 위치랑 .gitignore 수정 제안까지 한국어로 정리해줘요. 저도 똑같이 당했었는데 이걸로 빠뜨린 거 없나 확인했어요.

D
@dana20분 전

private으로 돌린 건 잘하셨어요. 근데 키 재발급 안 하면 private이어도 이미 새어나간 키는 계속 유효하니 꼭 rotate 하세요!