Firebase Firestore | 문서 시각 검증

F

서비스에서 악성 사용자를 일정 시간 동안 차단하거나, 회원권이나 쿠폰의 유효 기간을 검증, 시각에 따라 특정 기능을 제한하는 경우에 시간 유효성을 검증해야 할 필요가 있다.

이 때, 클라이언트에서 제공하는 시간 정보를 사용하게 되면 이용자가 쉽게 조작할 수 있게 된다.

JavaScript의 Date 클래스, Java의 currentTimeMillis 함수 처럼 시스템의 시간을 가져오는 함수를 위 작업을 수행하는 이용하면 기기의 시간이 변경되는 것 만으로도 큰 문제를 야기할 수 있다.

현재 서버 시각 삽입하기

Firebase 의 Firestore 나 Realtime Database 에서는 FieldValue (Firestore) 혹은 ServerValue (Realtime Database)를 이용하여 현재 서버시각을 삽입 할 수 있다.

// Firestore
FieldValue.serverTimestamp()
// Realtime Database
ServerValue.TIMESTAMP

데이터 삽입시 위 값을 삽입하면 데이터베이스에 현재 서버시각이 (Firestore) Timestamp 자료형으로 기록된다.

문서의 Timestamp 요소를 현재 서버 시각과 대조하기

반대로 문서를 쿼리 할 때에는 FieldValue 나 ServerValue 같은 변수를 사용할 수 없다. Firestore의 보안 규칙을 활용해서 현재 서버 시각과 문서의 시각을 대조할 수 있다.

보안규칙은 특정조건(이용자, 문서 값)에 따라 문서의 읽기, 쓰기, 삭제 권한의 허용 여부를 결정할 수 있게한다.

match /suspensions_user/{userId} {
    	allow read : if resource.data.releasedTimestamp > request.time
}
  1. suspensions_user 콜렉션에는 서비스 이용이 제한된 이용자의 데이터를 보관한다.
  2. 위와 같이 보안규칙을 작성해서 요청하는 문서의 “releasedTimestamp” (이용 제한 해제 시각) 값이 요청 시각 보다 클 때에만 읽기(read)를 허용했다.
  3. 매치 되는 경로의 문서에 접근할 수 있게 되어 성공적으로 문서를 읽어오게 되면 경로에 포함 된 userId를 가진 이용자는 이용 정지 상태임을 알 수 있다.

이를 이용해 특정 시각을 넘겨 수행하는 작업들을 차단하는 코드를 작성할 수 있다.

About the author

Gyeongrok Kim

Add comment

Your sidebar area is currently empty. Hurry up and add some widgets.