🕸️ Web

Cloud Database Service(2) - Firebase의 Realtime Database 규칙

loose 2023. 5. 24. 01:07
반응형

이전 글에도 설명했다시피 Realtime Database를 선택할 일은 거의 드물다.

그래서 Realtime Database 규칙에 관한 글을 찾기에도 꽤나 정보가 부족했다.(사실 아예 없었다)

그래서 혹여나 Realtime Database를 사용할 사람이 있다면 아래와 같은 규칙으로 사용하면 된다.

직접 코드부터 보고 싶다면 예시부터 확인하는 게 좋다.

 

규칙

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

초기 권장 설정으로 진행하면 해당 DB에 대한 읽기 쓰기 권한을 다 false로 설정이 된다.

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

그리고 Firestore의 인증 서비스를 이용해 회원가입하고 로그인한 사람을 대상으로 read와 write가 가능하도록 위와 같이 설정하는 것이 기본 방식이다.

  {
    "rules": {
      ".write": false,
      "votes": {
        ".write": true,
        ".validate": "newData.isNumber() && newData.val() == (data.exists() ? data.val() + 1 : 0)"
      }
    }
  }

위는 조금 더 복잡한 방식이다.

  • 모든 쓰기에 대한 규칙은 false로 잠가둔다.
  • "votes"라는 키워드에 대해서만 write를 허용한다.
  • "votes" 키워드가 숫자(isNumber())이면서 현재 DB에 저장된 votes값이 존재한다면 저장하는 값이 DB에 저장된 값보다 1이 증가된 값이어야한다라는 유효성 검사를 통과해야 저장된다.

올바른 조회수 증가를 보장하기 위한 규칙이라고 볼 수 있다.

 

예시

 

사실 글로 보면 어려우니 실제 적용 사례는 어떤지 아래에서 확인해보자.

firebaseConfig 값은 Firebase에서 App을 만들면 아래 버튼을 클릭해서 본인이 사용할 값을 확인할 수 있다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
안녕하세요

<script src="https://www.gstatic.com/firebasejs/8.8.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.8.1/firebase-database.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.8.1/firebase-analytics.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.8.1/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.8.1/firebase-firestore.js"></script>

<script>
var firebaseConfig = {
	// 개인 firebaseConfig 값 사용해야 함.
};

firebase.initializeApp(firebaseConfig);

var database = firebase.database();
        
function writeUserData(value) {
	firebase.database().ref('users/').set(value);
}

function readUserData(value) {
	firebase.database().ref('users/').on('value', (snapshot) => {
		const data = snapshot.val();
		console.log(data);
	});
}
</script>
</body>
</html>

그리고 writeUserData 함수를 실행하면 users 키워드에 저장되고

readUserData를 실행하면 users 키워드를 불러온다.

728x90