[Firestore] Cloud Firestore Rules - 인증에 따른 액세스 제어
위 규칙은 일반적인 인증 패턴으로 사용자가 자신의 데이터만 읽고 쓸 수 있도록 허용하는 방식입니다. match /users/{userID} { allow read, update, delete: if request.auth != null && request.auth.uid..
ardmos.tistory.com
로그인 기능을 구현하던중, 기존에 테스트할때는 멀쩡하던 녀석이 위 내용처럼 보안규칙을 변경하자마자
'~ FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions. ' 라는 에러를 띄우며 작동이 안됐습니다.
권한이 잘못됐다는건데 아무리 봐도 보안규칙에는 문제가 없고...
클라이언트 앱의 코드를 다시 살펴봤습니다.
이때까진 뭐가 문제인지 알아채지 못했습니다. 아래는 데이터를 읽어오려는 Firestore의 데이터 구조입니다.
문제 해결:
결국 해결했습니다.
문제는 추가된 보안 규칙
과 클라이언트측의 요청
이 두 부분이 문제였습니다.
추가된 보안 규칙은 '데이터를 요청하는 클라이언트 사용자의 uid값'과 '요청된 도큐먼트의 uid값'을 비교함으로써 사용자가 본인 외 다른 사용자들의 데이터에는 접근하지 못하도록 하고있었고,
아래쪽의 클라이언트 앱의 요청 코드는 서버의 'users' 컬렉션의 모든 내용을 요청하게끔 만들어져있습니다.
당시 저는
'사용자 데이터가 한개인 users 컬렉션의 모든 데이터를 요청하는 것 == 유일한 사용자가 본인의 데이터만 요청하는 것'
이라고 생각하고 있었습니다.
어차피 users 컬렉션에 있는 도큐먼트(사용자의 데이터)는 한 개 이니까, 그 한 개 있는 도큐먼트의 uid를 가진 유저가 컬렉션 내의 모든 도큐먼트를 요청해도 문제 없는거 아냐? 라는 생각이었죠.
하지만!! 바로 그 생각이 문제였습니다.
아래처럼 사용자 본인의 uid에 해당하는 도큐먼트 하나만 요청하도록 하니 정상작동되었습니다.
생각해보면 어차피 가입자가 늘어나고 user 컬렉션의 도큐먼트들이 늘어나면 당연히 추가했을 코드인데,
도큐먼트가 하나일때에도 추가해야됐을거라곤 미처 생각을 못한게 문제였습니다.
저와 비슷한 과정을 겪는 분들께 도움이 될까 싶어 글을 남깁니다.