본문 바로가기
🌐 유니티 (Unity)

Day 62 - Firebase 보안 규칙 설정과 최적화 방법 🛡️

by shin0707 2024. 12. 27.
728x90
반응형
728x90

 

  • 주제

>>  Firebase 보안 규칙 기본 이해

>>  사용자 인증 기반 보안 규칙

>>  특정 필드에 대한 액세스 제어

>>  Firebase 보안 규칙 꿀팁

>>  성능 최적화 방법


  • 공부내용

Firebase는 강력한 기능을 제공하지만, 올바른 보안 규칙이 없으면 데이터베이스가 외부에 노출될 위험이 있다. 이번 게시글에서는 Cloud Firestore의 보안 규칙 설정 방법과 성능 최적화를 위한 팁을 소개한다. 소소한 꿀팁들도 추가했으니 놓치지 말자!

 

1. Firebase 보안 규칙 기본 이해

Firebase 보안 규칙은 데이터베이스에 대한 읽기/쓰기 액세스를 제어한다. 프로젝트 설정에 맞게 규칙을 작성하면 데이터를 보호할 수 있다.

 

기본적인 보안 규칙 구조는 다음과 같다:

json

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

이 규칙은 모든 읽기 및 쓰기를 차단한다. 실제 사용자는 규칙을 커스터마이징해야 한다.


 

2. 사용자 인증 기반 보안 규칙

 

예시: 인증된 사용자만 자신의 데이터를 읽고 쓰기 가능

json

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

 

  • request.auth != null: 인증된 사용자만 허용한다.
  • request.auth.uid == userId: 사용자가 자신의 데이터에만 접근 가능하도록 제한한다.

 

3. 특정 필드에 대한 액세스 제어

 

읽기 또는 쓰기를 특정 필드로 제한할 수도 있다.

 

예시: 사용자의 Coins 필드만 업데이트 가능

json

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{userId} {
      allow update: if request.auth.uid == userId && request.resource.data.keys().hasOnly(['Coins']);
    }
  }
}

request.resource.data.keys().hasOnly(['Coins']): 업데이트 시 Coins 필드만 포함되었는지 확인한다.


 

4. Firebase 보안 규칙 꿀팁

 

  • 테스트 환경과 프로덕션 환경 분리
    테스트 중에는 보안 규칙을 느슨하게 설정할 수 있지만, 배포 전에 반드시 프로덕션 수준으로 강화해야 한다.
  • Firebase Emulator 활용
    Firebase Emulator를 사용하면 실제 데이터에 영향을 주지 않고 보안 규칙을 테스트할 수 있다.
  • 로그를 활용한 문제 디버깅
    Firebase Console에서 보안 규칙의 동작을 확인할 수 있는 로깅 기능을 활성화하자.
  • 데이터베이스 계층화 설계
    컬렉션과 문서를 명확하게 계층화하여 규칙 관리가 용이하도록 구조를 설계한다.

 

5. 성능 최적화 방법

5-1. 필요한 데이터만 요청

데이터를 읽을 때 필요한 필드만 요청하여 네트워크와 비용을 절약한다.

 

예시: 특정 필드만 가져오기

FirebaseManager.Instance.Firestore
    .Collection("Users")
    .Document(userId)
    .GetSnapshotAsync()
    .ContinueWith(task =>
    {
        if (task.IsCompleted)
        {
            var snapshot = task.Result;
            if (snapshot.Exists)
            {
                int coins = snapshot.GetValue<int>("Coins");
                Debug.Log($"사용자의 코인: {coins}");
            }
        }
    });

 

 

 

5-2. 쿼리 효율화

Firestore는 복잡한 쿼리를 지원하므로, 인덱스를 적절히 활용하여 성능을 높인다.

 

예시: 특정 조건에 맞는 데이터 필터링

FirebaseManager.Instance.Firestore
    .Collection("Users")
    .WhereGreaterThan("Score", 1000)
    .GetSnapshotAsync()
    .ContinueWith(task =>
    {
        if (task.IsCompleted)
        {
            var docs = task.Result.Documents;
            foreach (var doc in docs)
            {
                Debug.Log($"사용자 ID: {doc.Id}, 점수: {doc.GetValue<int>("Score")}");
            }
        }
    });

 

 

5-3. 배치 쓰기 사용

여러 문서를 한 번에 처리할 때 배치 쓰기를 사용하면 네트워크 요청 횟수를 줄일 수 있다.

 

예시: 배치 쓰기

WriteBatch batch = FirebaseManager.Instance.Firestore.StartBatch();

var userDoc = FirebaseManager.Instance.Firestore.Collection("Users").Document(userId);
batch.Set(userDoc, new { Score = 1500, Coins = 300 });

var logDoc = FirebaseManager.Instance.Firestore.Collection("Logs").Document();
batch.Set(logDoc, new { UserId = userId, Action = "Updated Data" });

batch.CommitAsync().ContinueWith(task =>
{
    if (task.IsCompleted)
    {
        Debug.Log("배치 쓰기 완료");
    }
});

< Firebase 보안과 성능에 관한 결론 >

 

Firebase 보안 규칙은 데이터를 보호하는 가장 중요한 방어선이다.

사용자 인증을 기반으로 설정하고, 필드별 액세스를 제한하며,

성능 최적화를 통해 비용과 네트워크 사용량을 줄일 수 있다.

반응형
728x90
반응형

loading