CodeSoom/ConStu

[Note] Firebase api키에 대한 참고 사항

saseungmin opened this issue · 0 comments

📌 Firebase api키에 대한 참고 사항

FIREBASE_API_KEY= "your api-key"
FIREBASE_AUTH_DOMAIN = "your auth-domain"
FIREBASE_DATA_BASEURL = "your data-baseurl"
FIREBASE_PROJECT_ID = "your project-id"
FIREBASE_STORAGE_BUCKET = "your storage-bucket"
FIREBASE_MESSAGING_SENDER_ID = "your messaging-sender-id"
FIREBASE_APP_ID = "your app-id"
FIREBASE_MEASUREMENT_ID = "your measurement-id"
  • pull request 단계에서 firebase api test를 통과하기 위해서 firebase의 api key가 필요했다.
  • 테스트를 할때는 api호출되는 부분을 mocking해서 할려고 했으나, 쉽게 진행하기 힘들었다.

🤔 Firebase apiKey를 공개하는 것이 안전합니까?

  • 찾아보다가 firebase의 api key에 관해서 스택 오버플로우에 Is it safe to expose Firebase apiKey to the public? 라는 제목으로 올라온 질문을 확인할 수 있었다. (링크 참고)
  • 거기에 Google의 Firebase 엔지니어분께서 답변을 해주셨다.
  • 내용은 대충 다음과 같았다.

apiKey는 Google 서버에서 Firebase 프로젝트만 식별합니다. 누군가가 그것을 아는 것은 보안 위험이 아닙니다. 사실, 그들이 당신의 Firebase 프로젝트와 상호 작용하기 위해서는 그들이 그것을 알아야합니다. 이 동일한 구성 데이터는 Firebase를 백엔드로 사용하는 모든 iOS 및 Android 앱에도 포함됩니다.

  • 답변은 공개를 해도 상관없다. 보안에 문제가 되지 않는다. 라는 답변이였지만, 무려 4년 전 질문이였고 그래도 API Key인데 라는 의심이 있어서 더 찾아보았다.
  • 그래서 공식 문서에서 그 답을 찾을 수 있게 되었다. (링크 참고) 내용은 다음과 같다.

Firebase 용 API 키는 일반적인 API 키와 다릅니다. API 키가 일반적으로 사용되는 방식과 달리 Firebase 서비스 용 API 키는 백엔드 리소스에 대한 액세스를 제어하는 ​​데 사용되지 않습니다. Firebase 보안 규칙으로만 수행할 수 있습니다. 일반적으로 API 키를 신속하게 보호해야합니다 (예 : 저장소 서비스를 사용하거나 키를 환경 변수로 설정). 그러나 Firebase 서비스 용 API 키는 코드 또는 체크인 된 구성 파일에 포함해도 괜찮습니다.

image

  • 이런 이유로 .env 를 사용하여 관리했던 방법을 현재와 같이 변경하였다.
  • 그리고 마지막 말에 빨간색 표시로 경고가 있는데 Firebase 보안 규칙를 설정하여 보호하라는 말이 있다.

API 키를 제한하거나 가리지 않고 Firebase 보안 규칙 을 사용하여 데이터베이스 및 저장소 데이터를 보호 하세요.

  • 이 부분에 대해서 인지를 하고 공식 문서를 참조하여 rules를 다음과 같이 추가해줬다.
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /groups/{group} {
      allow read: if true; // 읽기는 전부다
      allow write: if request.auth.uid != null; // 쓰기는 인증된 사용자만 가능
    }
  }
}

📌 Firebase api키에 대한 전략 변경(Update 2021-01-08)

  • Google APIs에서 이 프로젝트에 대한 사용자 인증 정보 탭의 API 키 목록에서 브라우저 키의 권한을 변경해주었다.
  • 이 브라우저 키에서 애플리케이션 제한사항에 HTTP 리퍼러(웹사이트) 옵션을 선택한 뒤 웹사이트 제한사항에 배포되어있는 주소만 허용하게 하면 다른 주소에서는 해당 API키를 사용할 수 없으며, Firebase 프로젝트에서 글을 작성하거나, 로그인, 회원가입등을 할 수 없게 된다.
  • 다만, localhost를 사용해서 로컬에서 개발서버로 실행해도 다음과 같이 제한이 걸리게 된다.

image

  • 그렇기 때문에 개발 서버만을 위한 firebase 프로젝트를 새로 만들고 firebase 구성 파일을 변경한다.
import firebase from 'firebase/app';

import 'firebase/auth';
import 'firebase/firestore';

import devConfig from '../../config/dev';
import prodConfig from '../../config/prod';

const config = process.env.NODE_ENV === 'production'
  ? prodConfig
  : devConfig;

firebase.initializeApp(config);

export const fireStore = firebase.firestore;

export const db = firebase.firestore();

export const auth = firebase.auth();
  • 그리고 프로덕션 레벨의 배포를 위한 firebase api 키는 안전하게 .env 파일로 저장한다.

🤔 참고 자료