Firebase

  • Firebase Firestore | 문서 시각 검증

    ·

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

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

    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를 가진 이용자는 이용 정지 상태임을 알 수 있다.

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