문제 발생과 해결의 기록들/Firebase

[문제 해결] FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions. 메세지 해결.

Ardmos :) 2022. 1. 31. 00:12

https://ardmos.tistory.com/entry/Firestore-Cloud-Firestore-Rules-%EC%9D%B8%EC%A6%9D%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%95%A1%EC%84%B8%EC%8A%A4-%EC%A0%9C%EC%96%B4?category=535888 

 

[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의 데이터 구조입니다.

 

 

 

 

문제 해결: 

결국 해결했습니다.

문제는 추가된 보안 규칙 

문제 1.

과 클라이언트측의 요청

 

문제 2.  (문제는 문제1과 문제2의 콜라보.)

이 두 부분이 문제였습니다. 

 

추가된 보안 규칙은 '데이터를 요청하는 클라이언트 사용자의 uid값'과 '요청된 도큐먼트의 uid값'을 비교함으로써 사용자가 본인 외 다른 사용자들의 데이터에는 접근하지 못하도록 하고있었고, 

아래쪽의 클라이언트 앱의 요청 코드는 서버의 'users' 컬렉션의 모든 내용을 요청하게끔 만들어져있습니다.

당시 저는 

 

'사용자 데이터가 한개인 users 컬렉션의 모든 데이터를 요청하는 것 == 유일한 사용자가 본인의 데이터만 요청하는 것'

 

이라고 생각하고 있었습니다. 

어차피 users 컬렉션에 있는 도큐먼트(사용자의 데이터)는 한 개 이니까,  그 한 개 있는 도큐먼트의 uid를 가진 유저가 컬렉션 내의 모든 도큐먼트를 요청해도 문제 없는거 아냐? 라는 생각이었죠. 

하지만!! 바로 그 생각이 문제였습니다. 

 

아래처럼 사용자 본인의 uid에 해당하는 도큐먼트 하나만 요청하도록 하니 정상작동되었습니다. 

.document(user.uid) 를 추가했습니다.

 

생각해보면 어차피 가입자가 늘어나고 user 컬렉션의 도큐먼트들이 늘어나면 당연히 추가했을 코드인데, 

도큐먼트가 하나일때에도 추가해야됐을거라곤 미처 생각을 못한게 문제였습니다. 

 

저와 비슷한 과정을 겪는 분들께 도움이 될까 싶어 글을 남깁니다.

728x90