FixVibe

// docs / baas security / firebase if-true explainer

Firebase allow read, write: if true 설명: 무엇을 하며 어떻게 고치는가

<code>allow read, write: if true;</code>는 프로덕션에서 가장 흔한 단일 Firebase 설정 오류입니다. 이는 새 데이터베이스를 생성할 때 Firebase Console이 제안하는 테스트 모드 기본값이며, AI 코딩 도구가 문서에서 재생성하는 규칙이며, 전체 Firestore 데이터베이스를 인터넷의 누구에게나 여는 규칙입니다. 이 기사는 구문을 정확히 설명하고, 이 규칙이 활성화되었을 때 공격자가 보는 것을 보여주며, 다른 사용 사례에 맞는 점진적으로 더 엄격한 네 가지 교체를 제공합니다.

줄별 구문

완전한 Firestore 테스트 모드 규칙 문서는 6줄입니다:

firebase
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

디코딩:

  • rules_version = '2';는 v2 규칙 엔진(현재)을 선택합니다. 이전 v1 규칙은 더 이상 사용되지 않습니다.
  • service cloud.firestore는 블록을 Firestore로 범위 좁힙니다. Realtime Database는 다른 JSON 기반 구문을 사용합니다. Cloud Storage는 service firebase.storage를 사용합니다.
  • match /databases/{database}/documents는 특별한 (default) 데이터베이스를 바인딩합니다(대부분의 프로젝트는 하나뿐입니다).
  • match /{document=**}는 재귀적 와일드카드입니다. **는 모든 깊이의 모든 경로와 일치합니다. {document}와 결합하여 모든 컬렉션의 모든 문서를 캡처합니다 — 전체 데이터베이스를 지배하는 단일 match 절.
  • allow read, write: if true;는 규칙 본문입니다. readwrite 모두 허용되며, 조건 if true는, 글쎄, 항상 참입니다. readgetlist 작업을 포함하고, writecreate, update, delete를 포함합니다.

순효과: Firebase 프로젝트 ID와 올바른 SDK를 가진 모든 클라이언트가 모든 컬렉션의 모든 문서를 읽거나 쓸 수 있습니다. 인증이 필요하지 않습니다. 속도 제한이 적용되지 않습니다.

Firebase가 왜 이를 기본으로 제공하는가

Firebase는 프로젝트를 생성한 후 처음 30초 안에 코딩을 하길 원합니다. 대안 — 읽기나 쓰기가 작동하기 전에 올바른 규칙을 작성하도록 만드는 것 — 은 온보딩을 차단할 것입니다. 그래서 Console은 데이터베이스를 생성할 때 두 가지 옵션을 제공합니다: Production mode(모든 것을 거부, 당신이 규칙을 작성) 또는 Test mode(30일 동안 모든 것 허용). 대부분의 개발자는 테스트 모드를 클릭하고 다시 방문하는 것을 잊습니다. 이전 프로젝트는 30일 타이머가 있었고, 현재 프로젝트는 자동 만료 없는 무기한 if true 규칙이 있습니다.

구조적 문제: AI 코딩 도구는 테스트 모드 규칙을 보여주는 문서, 튜토리얼, Stack Overflow 답변에서 훈련됩니다. Cursor나 Claude Code에 "Firebase를 설정하는 방법"을 물으면 답은 종종 마치 프로덕션 규칙인 것처럼 정확한 allow read, write: if true 블록을 포함합니다. AI는 알지 못하며 — 알도록 안내받지 않습니다 — 이 규칙이 프로덕션에 안전하지 않다는 것을.

공격자가 보는 것

구체적으로, 당신의 Firebase 프로젝트 ID(배포된 앱의 번들에서 30초 안에 추출 가능)를 알고 다음을 실행하는 공격자는 모든 컬렉션의 모든 문서를 나열할 수 있습니다:

단일 인증되지 않은 curl 요청으로 모든 컬렉션을 열거하는 데 충분합니다. 아래 강조된 블록을 참조하세요.

bash
curl 'https://firestore.googleapis.com/v1/projects/[project-id]/databases/(default)/documents:listCollectionIds' \
  -X POST \
  -H 'Content-Type: application/json' \
  -d '{}'

응답은 최상위 컬렉션의 전체 목록입니다. 각 컬렉션에 대해 두 번째 요청이 문서를 반환합니다. if true 규칙이 익명 트래픽을 받아들이기 때문에 이 경로에는 속도 제한이 없습니다. 한 시간 이내에 수백만 개의 문서가 열거된 Firebase 데이터베이스를 봤습니다.

쓰기 경로에서: {fields}가 있는 단일 POST가 새 문서를 만듭니다. 공격자는 컬렉션을 쓰레기로 오염시키고, Firestore에서 읽는 사용자 대면 페이지를 훼손하거나, 무료 메시지 브로커로 데이터베이스를 사용할 수 있습니다 — 사용량 청구서가 치솟고, 조사하면 청구서가 문제를 설명합니다.

네 가지 프로덕션 안전 교체

앱의 데이터 모델과 일치하는 교체를 선택하세요. 네 가지 모두 사용자 인증(Firebase Auth 또는 Firebase ID 토큰을 발급하는 모든 공급자)이 있다고 가정합니다:

옵션 1: 사용자 소유 문서

가장 흔한 SaaS 패턴. 문서는 /users/{userId}/... 하위에 있으며 소유자만 접근할 수 있습니다. match /users/{userId}/{document=**} { allow read, write: if request.auth != null && request.auth.uid == userId; }

firebase
match /users/{userId}/{document=**} {
  allow read, write: if request.auth != null
                     && request.auth.uid == userId;
}

옵션 2: 각 문서의 소유자 필드

문서가 평평한 컬렉션에 있을 때(사용자 ID 하위에 중첩되지 않음) owner_uid 필드를 저장하고 이를 확인합니다. match /posts/{postId} { allow read: if resource.data.public == true || resource.data.owner_uid == request.auth.uid; allow write: if request.auth.uid == resource.data.owner_uid; }

firebase
match /posts/{postId} {
  allow read:  if resource.data.public == true
              || resource.data.owner_uid == request.auth.uid;
  allow write: if request.auth.uid == resource.data.owner_uid;
}

옵션 3: 멀티 테넌트 조직 격리

조직 범위 데이터가 있는 B2B SaaS용. 모든 문서에 org_id 필드를 저장하고 사용자의 사용자 정의 클레임과 대조하여 확인합니다. allow read, write: if request.auth.token.org_id == resource.data.org_id;. Firebase Admin SDK를 통해 가입 중에 사용자 정의 클레임을 설정해야 합니다.

firebase
allow read, write: if request.auth.token.org_id == resource.data.org_id;

옵션 4: 읽기 전용 공개 콘텐츠

마케팅 콘텐츠, 공개 프로필, 제품 카탈로그용 — 진정으로 공개 읽기이지만 관리자만 쓰는 모든 것. match /products/{productId} { allow read: if true; allow write: if request.auth.token.admin == true; }. admin 사용자 정의 클레임은 관리자 계정에만 설정됩니다.

firebase
match /products/{productId} {
  allow read:  if true;
  allow write: if request.auth.token.admin == true;
}

빠른 감사 쿼리

수정 전에 if true가 실제로 활성화되어 있는지 확인하세요. Firebase Console → Firestore → Rules를 열고 if true를 검색하세요. 주석 외부 어디에서든 발견하면 열린 규칙 발견입니다. 동일한 UI의 규칙 시뮬레이터를 사용하면 공격자의 요청을 로컬에서 재생할 수 있습니다 — 익명 GET /users/somebody를 붙여넣고 시뮬레이터가 Allowed를 반환하는지 확인하세요.

외부 확인: 프로덕션 URL에 대해 FixVibe 스캔을 실행하세요. baas.firebase-rules 검사는 Firestore, Realtime Database, Storage 규칙을 탐사하고 Firebase Console이 보여주는 것과는 독립적으로 공격자가 발견할 동일한 발견을 보고합니다.

자주 묻는 질문

<code>if true</code>와 <code>if request.auth != null</code>의 차이는 무엇인가요?

if true는 익명 접근을 허용합니다 — 인터넷의 누구든. if request.auth != null은 로그인한 모든 사용자를 요구하며, 이는 더 낫지만 여전히 잘못되었습니다: 앱의 모든 사용자가 다른 모든 사용자의 데이터를 읽을 수 있습니다. 프로덕션 규칙은 request.auth.uid == resource.data.owner_uid 또는 유사한 방식으로 특정 사용자나 조직으로 범위가 좁혀져야 합니다.

Firebase가 <code>if true</code> 규칙을 자동으로 만료시키나요?

이전 프로젝트(2023년 이전)는 if true 규칙을 if false로 변환하는 30일 타이머가 있었습니다. 현재 프로젝트는 그렇지 않습니다 — 규칙은 수동으로 교체될 때까지 무기한 지속됩니다. 2023년 이전에 프로젝트를 만들고 규칙이 괜찮아 보이면 다시 확인하세요: 타이머가 이미 그것들을 if false로 뒤집어 자신의 앱을 차단했을 수 있습니다.

미래 날짜 타임스탬프 검사를 안전망으로 사용할 수 있나요?

아니요 — 타임스탬프 조건은 보안 통제가 아닙니다. 미래 날짜에 열린 규칙을 만료시키며, 이는 그 날짜까지 공격자가 전체 접근을 가진다는 의미입니다. 그리고 당신은 그 날짜를 잊을 것입니다. 시간 제한이 아닌 인증 범위 규칙으로 if true를 교체하세요.

내 앱이 정말로 공개 읽기(블로그, 제품 카탈로그)라면 어떻게 하나요?

그렇다면 공개 컬렉션에만 명시적으로 allow read: if true; allow write: if false;를 작성하세요 — 데이터베이스의 모든 컬렉션이 아닙니다. 컬렉션당 별도의 match 절을 사용하고 쓰기 가능한 규칙에서 재귀적 {document=**} 와일드카드를 결코 사용하지 마세요.

다음 단계

프로덕션 URL에 대해 FixVibe 스캔을 실행하세요 — baas.firebase-rules 검사는 if true가 현재 공개 인터넷에서 악용 가능한지 확인합니다. 스캐너 메커니즘과 Realtime Database 및 Storage에 대한 병렬 탐지에 대해서는 Firebase 규칙 스캐너를 참조하세요. Supabase의 동등한 설정 오류 클래스는 Supabase RLS 스캐너를 읽으세요.

// baas 표면 스캔

다른 누군가가 발견하기 전에 열린 테이블을 찾으세요.

프로덕션 URL을 입력하세요. FixVibe는 앱이 통신하는 BaaS 제공자를 열거하고, 공개 엔드포인트의 지문을 채취하며, 인증되지 않은 클라이언트가 무엇을 읽거나 쓸 수 있는지 보고합니다. 무료, 설치 불필요, 카드 불필요.

  • 무료 티어 — 월 3회 스캔, 가입 시 카드 불필요.
  • 수동 BaaS 지문 채취 — 도메인 소유권 확인 불필요.
  • Supabase, Firebase, Clerk, Auth0, Appwrite 등.
  • 모든 발견에 AI 수정 프롬프트 — Cursor / Claude Code에 그대로 붙여넣기.
Firebase allow read, write: if true 설명: 무엇을 하며 어떻게 고치는가 — Docs · FixVibe