Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

Firebase 실시간 데이터베이스 보안 규칙 이해

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Firebase 실시간 데이터베이스 보안 규칙은 데이터베이스에 대한 읽기 및 쓰기 액세스 권한이 있는 사용자, 데이터 구조 및 존재하는 색인을 결정합니다. 이러한 규칙은 Firebase 서버에 상주하며 항상 자동으로 적용됩니다. 모든 읽기 및 쓰기 요청은 규칙에서 허용하는 경우에만 완료됩니다. 기본적으로 규칙은 데이터베이스에 대한 액세스를 허용하지 않습니다. 이것은 규칙을 사용자 정의하거나 인증을 설정할 시간이 있을 때까지 데이터베이스를 남용으로부터 보호하기 위한 것입니다.

실시간 데이터베이스 보안 규칙에는 JavaScript와 유사한 구문이 있으며 네 가지 유형이 있습니다.

규칙 유형
.읽다 사용자가 데이터를 읽을 수 있는지 여부와 시기를 설명합니다.
.쓰다 데이터 쓰기가 허용되는지 여부와 시기를 설명합니다.
.확인 올바른 형식의 값이 어떻게 생겼는지, 자식 속성이 있는지 여부와 데이터 유형을 정의합니다.
.indexOn 순서 지정 및 쿼리를 지원하기 위해 인덱싱할 자식을 지정합니다.

실시간 데이터베이스 보안 개요

Firebase 실시간 데이터베이스는 앱의 보안을 관리하기 위한 전체 도구 세트를 제공합니다. 이러한 도구를 사용하면 사용자를 쉽게 인증하고, 사용자 권한을 적용하고, 입력의 유효성을 검사할 수 있습니다.

Firebase 기반 앱은 다른 많은 기술 스택이 있는 앱보다 더 많은 클라이언트 측 코드를 실행합니다. 따라서 우리가 보안에 접근하는 방식은 이전에 사용하던 방식과 약간 다를 수 있습니다.

입증

앱 보안의 일반적인 첫 번째 단계는 사용자를 식별하는 것입니다. 이 프로세스를 인증 이라고 합니다. Firebase 인증 을 사용하여 사용자가 앱에 로그인하도록 할 수 있습니다. Firebase 인증에는 이메일 및 비밀번호 로그인, 익명 로그인 등은 물론 Google 및 Facebook과 같은 일반적인 인증 방법에 대한 드롭인 지원이 포함됩니다.

사용자 ID는 중요한 보안 개념입니다. 사용자마다 데이터가 다르고 때로는 기능이 다릅니다. 예를 들어 채팅 응용 프로그램에서 각 메시지는 메시지를 만든 사용자와 연결됩니다. 사용자는 자신의 메시지를 삭제할 수도 있지만 다른 사용자가 게시한 메시지는 삭제할 수 없습니다.

권한 부여

사용자 식별은 보안의 일부일 뿐입니다. 그들이 누구인지 알게 되면 데이터베이스의 데이터에 대한 액세스를 제어할 방법이 필요합니다. 실시간 데이터베이스 보안 규칙을 사용하면 각 사용자에 대한 액세스를 제어할 수 있습니다. 예를 들어, 다음은 누구나 /foo/ 경로를 읽을 수 있지만 아무도 쓸 수 없도록 하는 일련의 보안 규칙입니다.

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

.read.write 규칙은 계단식이므로 이 규칙 세트는 /foo/ 경로의 모든 데이터와 /foo/bar/baz 와 같은 더 깊은 경로에 대한 읽기 액세스 권한을 부여합니다. 데이터베이스에서 더 얕은 .read.write 규칙은 더 깊은 규칙을 재정의하므로 이 예제에서는 /foo/bar/baz 경로의 규칙이 false로 평가되더라도 /foo/bar/baz 에 대한 읽기 액세스 권한이 계속 부여됩니다.

실시간 데이터베이스 보안 규칙에는 다른 경로, 서버 측 타임스탬프, 인증 정보 등을 참조할 수 있는 내장 변수 와 함수가 포함되어 있습니다. 다음은 인증된 사용자에게 /users/<uid>/ 에 대한 쓰기 액세스 권한을 부여하는 규칙의 예입니다. 여기서 <uid>는 Firebase 인증을 통해 얻은 사용자의 ID입니다.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

데이터 유효성 검사

Firebase 실시간 데이터베이스는 스키마가 없습니다. 이렇게 하면 개발할 때 쉽게 변경할 수 있지만 앱을 배포할 준비가 되면 데이터의 일관성을 유지하는 것이 중요합니다. 규칙 언어에는 .read.write 규칙에 사용된 것과 동일한 표현식을 사용하여 유효성 검사 논리를 적용할 수 있는 .validate 규칙이 포함되어 있습니다. 유일한 차이점은 유효성 검사 규칙이 계단식으로 배열되지 않으므로 쓰기가 허용되려면 모든 관련 유효성 검사 규칙이 true로 평가되어야 한다는 것입니다.

이 규칙은 /foo/ 에 기록된 데이터가 100자 미만의 문자열이어야 한다고 강제합니다.

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

유효성 검사 규칙은 .read.write 규칙과 동일한 모든 기본 제공 함수 및 변수에 액세스할 수 있습니다. 이를 사용하여 데이터베이스의 다른 곳에서 데이터, 사용자 ID, 서버 시간 등을 인식하는 유효성 검사 규칙을 만들 수 있습니다.

데이터베이스 인덱스 정의

Firebase 실시간 데이터베이스를 사용하면 데이터를 주문하고 쿼리할 수 있습니다. 작은 데이터 크기의 경우 데이터베이스는 임시 쿼리를 지원하므로 일반적으로 개발 중에는 인덱스가 필요하지 않습니다. 하지만 앱을 시작하기 전에 앱이 성장함에 따라 계속 작동하도록 해야 하는 쿼리에 대한 인덱스를 지정하는 것이 중요합니다.

인덱스는 .indexOn 규칙을 사용하여 지정됩니다. 다음은 공룡 목록의 높이 및 길이 필드를 인덱싱하는 인덱스 선언의 예입니다.

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

다음 단계