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


438

중포 기지 웹 응용 프로그램 가이드는 내가 주어진 놓아야 상태 apiKey중포 기지를 초기화 내 HTML에서 :

// TODO: Replace with your project's customized code snippet
<script src="https://www.gstatic.com/firebasejs/3.0.2/firebase.js"></script>
<script>
  // Initialize Firebase
  var config = {
    apiKey: '<your-api-key>',
    authDomain: '<your-auth-domain>',
    databaseURL: '<your-database-url>',
    storageBucket: '<your-storage-bucket>'
  };
  firebase.initializeApp(config);
</script>

이렇게함으로써 apiKey모든 방문자에게 노출됩니다. 그 열쇠의 목적은 무엇이며 실제로 공개되어야 하는가?


1
Firebase 인증 및 Firebase 데이터베이스 규칙을 설정 하면 정보를 공개적으로 제공 할 수 있다고 생각 합니다.
— abbaf33f

Christophe Quintard 사용자는 Firebase API의 보안에 관한 추가 정보가있는 매우 유용한 기사에 대한 링크를 추가 했으므로 여기에 다시 게시하겠습니다 : javebratt.com/hide-firebase-api 품질 저하로 인해 삭제 된 것으로 표시되는 답변)
— Oliver Schafeld

이 특정 프레임 워크가 API 노출에 문제가 없기 때문에 다른 프레임 워크가 괜찮다는 것을 의미하지는 않습니다. 일반적으로 "API 키를 공개해도 괜찮습니다"라는 생각으로이 게시물에서 벗어나고 싶지 않습니다.
— YungGun

아무 문제없이 키를 노출시킵니다. 안전을 위해 프로덕션에서 특정 도메인으로 제한하여 다른 사람이 임의의 도메인 이름으로 API 호출을 호출 할 수 없도록 할 수 있습니다. 보다 안전하게하려면 프로덕션 앱에서 localhost를 제거하십시오.
— BL Λ CK

1
추천자 화이트리스트에서 localhost를 제거하는 것이 테스트를 어렵게 만드는 것 외에는 아무것도하지 않을 것이라고 생각합니다. 이 구성은 IP 화이트리스트와 다릅니다. CORS 설정과 비슷하다고 생각하십시오. Firebase가 작동하는 방식은 API 경로가 클라이언트에서 직접 호출되며 프록시되지 않는 것입니다. 따라서 웹 페이지에 API 키가 필요합니다. 나쁜 행위자가 Postman에서 API 경로를 호출하려는 경우 리퍼러 화이트리스트가 중지하지 않습니다. 다른 공개 사이트가 서버를 차단하지 못하도록하는 데만 유용합니다.
— forresthopkinsa

답변:


451

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

그런 의미에서 동일한 스 니펫에서 프로젝트와 연관된 백엔드 데이터베이스를 식별하는 데이터베이스 URL과 매우 유사합니다 https://<app-id>.firebaseio.com. 이것이 보안 위험이 아닌 이유에 대한이 질문을 참조하십시오. Firebase 데이터 수정을 제한하는 방법은 무엇입니까? 승인 된 사용자 만 백엔드 서비스에 액세스 할 수 있도록 Firebase 서버 측 보안 규칙 사용을 포함하여

Firebase 백엔드 서비스에 대한 모든 데이터 액세스를 보호하는 방법을 배우려면 Firebase 보안 규칙 설명서를 참조하십시오 .


이 구성 데이터를 버전 관리에 커밋 할 위험을 줄이려면 Firebase 호스팅 의 SDK 자동 구성을 사용해보십시오 . 키는 여전히 같은 형식으로 브라우저에 표시되지만 더 이상 코드에 하드 코딩되지 않습니다.


7
다른 사람들이 내 Firebase 데이터베이스의 모든 데이터에 액세스 할 수 있다는 의미입니까?
— Emmanuel Campos 2018 년

31
@EmmanuelCampos Answer는 Yes와 No입니다. 다른 사람들이 데이터베이스의 모든 데이터에 액세스하도록 허용하거나 허용하려는 경우 가능합니다. 그리고 당신이 원하지 않는다면 Firebase 데이터베이스에는 사용자가 제어하는 ​​규칙, 규칙이 있습니다.
— KhoPhi

5
마지막 질문 support.google.com/firebase/answer/6400741에 대한 답변을 여기에서 찾았습니다 . 도움을 주셔서 감사합니다. 이 링크는 나중에 누군가에게 도움이 될 수 있습니다.
— Emmanuel Campos 2016 년

7
@ m.rufca, 인증 된 사용자가 데이터를 사용할 수 있어야합니다. 그리고 여기 속임수가 있습니다. 기본적으로 Firebase 설정에서는 로컬 호스트 및 프로젝트 도메인 만 인증을 수행 할 권한이 있습니다. 따라서 다른 사람은 일반적으로 Firebase와 작동하는 앱을 만들 수 없습니다.
— Artem Arkhipov

15
봇이 내 앱에서 무제한 사용자를 생성하는 경우 보안 문자를 어떻게 요구할 수 있습니까?
— Muhammad Umer

79

prufrofro와 프랭크 반 Puffelen의 답변을 바탕 여기 , 내가 함께 긁어 방지하지 않지만, 약간 어렵게 API 키를 사용하여 만들 수 있습니다이 설정을 넣어.

경고 : 이 방법을 사용하더라도 데이터를 얻으려면 Chrome에서 JS 콘솔을 열고 다음을 입력하십시오.

firebase.database().ref("/get/all/the/data").once("value", function (data) {
    console.log(data.val());
});

데이터베이스 보안 규칙 만이 데이터를 보호 할 수 있습니다.

그럼에도 불구하고 프로덕션 API 키 사용을 다음과 같이 도메인 이름으로 제한했습니다.

  1. https://console.developers.google.com/apis
  2. Firebase 프로젝트를 선택하십시오
  3. 신임장
  4. API 키에서 브라우저 키를 선택하십시오. ' 브라우저 키 (Google 서비스에서 자동 생성) '
  5. 년은 " 이러한 HTTP 리퍼러의 요청 허용 (웹 사이트) 앱 URL을 추가, (exemple를 :" projectname.firebaseapp.com/*)

이제 앱은이 특정 도메인 이름에서만 작동합니다. 그래서 로컬 호스트 개발을 위해 비공개로 될 또 다른 API 키를 만들었습니다.

  1. 신임 정보 작성> API 키를 클릭하십시오.

Emmanuel Campos가 언급 한대로 기본적으로 Firebase는 화이트리스트 localhost및 Firebase 호스팅 도메인 만 허용 합니다 .


실수로 잘못된 API 키를 게시하지 않도록하기 위해 다음 방법 중 하나를 사용하여 프로덕션에서 더 제한된 키를 자동으로 사용합니다.

Create-React-App 설정

에서 /env.development:

REACT_APP_API_KEY=###dev-key###

에서 /env.production:

REACT_APP_API_KEY=###public-key###

에 /src/index.js

const firebaseConfig = {
  apiKey: process.env.REACT_APP_API_KEY,
  // ... 
};

Webpack에 대한 나의 이전 설정 :

Webpack을 사용하여 프로덕션 앱을 빌드하고 index.html평소처럼 개발자 API 키를 내부에 넣습니다 . 그런 다음 webpack.production.config.js파일 내 index.html에서 프로덕션 빌드에 복사 할 때마다 키를 바꿉니다.

plugins: [
    new CopyWebpackPlugin([
      {
        transform: function(content, path) {
          return content.toString().replace("###dev-key###", "###public-key###");
        },
        from: './index.html'
      }
    ])
  ]

1
그게 당신에게 잘 작동합니까? Android 앱에 대해서도 동일한 작업을 수행하려고했습니다. Firebase가 보안 섹션에서이를 다루지 않는 이유가 궁금합니다.
— steliosf 2016 년

2
나는 지금까지 아무런 문제가 없었지만, 아마도 공격도 없었을 것입니다
— 지금

3
긁히지 않도록 보호하지 않으므로 가이드에 언급되어 있지 않습니다. 이 모든 것은 다른 사람이 귀하의 Firebase를 사용하여 정상적으로 작동하는 브라우저에서 데이터를 읽거나 쓰는 웹 응용 프로그램을 만들 수 없다는 것입니다.
— thoutbeckers

@thoutbeckers 당신이 맞아요, 감사합니다. 나는 대답을 편집했지만 여전히 유용 할 수있는 방법을 남겼습니다.
— 지금

1
@FrankvanPuffelen 내가 이해 한 바에 따르면 큰 차이는 없지만 잘 작동하는 브라우저에서는 HTML / JS와 함께 제공되는 API 키가 의도 한 것에서 만 작동하기 때문에 할당량 남용을 약간 더 성가 시게 할 수 있습니다 로컬 호스트 또는 다른 도메인이 아닌 도메인 그러나 추가 된 보호 기능이 Firebase가 이미 제공 한 보호 기능과 비교할 때 한계가 있음에 동의합니다. 나는 덜 극적인 것에 대한 답을 다시 말하겠다.
— 지금

22

보안 / 구성 키를 클라이언트에 노출 시키지는 않습니다. 누군가 개인 정보를 훔칠 수 있기 때문에 누군가가 과도한 요청을하고 할당량을 소진하고 Google에 많은 돈을 빚을 수 있기 때문에 안전한 것으로 생각하지 않습니다.

사람들이 의도하지 않은 위치, DOS 공격 등에 액세스하지 못하도록 제한하는 많은 개념에 대해 생각해야합니다.

나는 클라이언트가 먼저 웹 서버에 충돌하는 것을 더 선호합니다. 거기에서 방화벽, 보안 문자, 클라우드 플레어, 클라이언트와 서버 사이 또는 서버와 파이어베이스 사이에 사용자 지정 보안을 배치하면 좋습니다. 최소한 의심스러운 활동이 firebase에 도달하기 전에 먼저 중지 할 수 있습니다. 훨씬 더 융통성이 있습니다.

내부 사용을 위해 클라이언트 기반 구성을 사용하는 좋은 사용 시나리오가 하나만 보입니다. 예를 들어 내부 도메인이 있고 외부인이 액세스 할 수없는 것이 확실하므로 브라우저-> firebase 유형과 같은 환경을 설정할 수 있습니다.


10
그러나 다른 REST API를 "노출"하는 것과 동일하지 않습니까? REST API URL을 사용하면 사용자가 사용할 수 있음을 의미합니다. URL을 사용하여 원하는 모든 요청을하고 할당량을 소진 할 수 있습니다. firebase는 api 키와 함께 config를 사용하여 백엔드의 일부를 식별하고 사용자가 요청을 할 수 있어야합니다.
— mbochynski

3
@mbochynski 그러나 청구서를 지불하게하는 자원에 다소 직접 요청할 수 있습니다. Firebase 측에는 DDoS 공격 등을 방지하는 제어 메커니즘이 많지 않습니다. 클라이언트가 REST API를 호출하도록 허용하지만 REST API는 API 키를 비공개로 유지해야하며 Firebase 리소스에 도달하기 전에도이를 검증해야합니다. 합법적 인 요청 인 경우 (Cloudflare 등을 통해). 또는 캐시에서 결과를 검색합니다. 그런 다음 필요한 경우에만 Firebase 리소스 만 공격합니다. 이것은 내가 구현하는 것이 무엇 firebase.google.com/docs/admin/setup
— 테오 만 shipahi

3
브라우저에서 키를 노출시키는 것은 매우 나쁜 생각입니다. 이 모든 가이드 / 기사를 작성하는 사람들은 무엇을 생각하고 있었습니까? 보안에 대한 http 리퍼러? 쉽게 스푸핑됩니다
— Nick Chan Abdullah

1
너희들은 이것에 대해 생각하지 않는다. API 키를 비밀로 생각하지 마십시오. 개인 키가 아니라 ID 일 뿐이므로 Firebase API는 누가 어떤 프로젝트에 액세스하고 있는지 알 수 있습니다. 많은 유연성을 원하고 서버 / 클라이언트 상호 작용의 모든 단계를 제어해야하는 경우 Firebase를 사용하지 말고 GCP를 사용해야합니다.
— forresthopkinsa

@ forresthopkinsa 나는 어떤 접근법을 취할 것인지 언급하는 위의 링크가 있습니다. 여기에 아무도 비밀 키라고 제안 할만 큼 순진한 사람은 없습니다.
— Teoman shipahi

4

데이터베이스 규칙이 정확하게 작성되면 데이터를 보호하기에 충분하다고 생각합니다. 또한 데이터베이스를 적절하게 구성하기 위해 따라야 할 지침이 있습니다. 예를 들어, 사용자 아래에 UID 노드를 만들고 그 아래에 모든 정보를 넣습니다. 그런 다음 아래와 같이 간단한 데이터베이스 규칙을 구현해야합니다.

  "rules": {
    "users": {
      "$uid": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}

다른 사용자는 다른 사용자의 데이터를 읽을 수 없으며 도메인 정책은 다른 도메인에서 오는 요청을 제한합니다. Firebase 보안 규칙 에서 자세한 내용을 읽을 수 있습니다


3

사용자 / 암호 가입이 활성화되면 API 키 노출로 인해 취약점이 발생합니다. API 키를 사용하여 누구나 새 사용자 계정을 만들 수있는 공개 API 엔드 포인트가 있습니다. 그런 다음이 새 계정을 사용하여 Firebase Auth 보호 앱에 로그인하거나 SDK를 사용하여 사용자 / 패스로 인증하고 쿼리를 실행할 수 있습니다.

나는 이것을 구글에보고했지만 그들이 의도 한대로 작동한다고 말합니다.

사용자 / 암호 계정을 비활성화 할 수없는 경우 다음을 수행해야합니다. 클라우드 기능을 생성하여 새 사용자를 자동으로 비활성화합니다. 액세스를 관리 할 새 DB 항목을 생성하고 생성합니다.

예 : MyUsers / {userId} / 액세스 : 0

exports.addUser = functions.auth.user().onCreate(onAddUser);
exports.deleteUser = functions.auth.user().onDelete(onDeleteUser);

액세스> 1 인 사용자에 대한 읽기만 허용하도록 규칙을 업데이트하십시오.

오프 리스너에서 리스너 기능은 계정을 충분히 빨리 비활성화하지 않으므로 읽기 규칙으로 인해 데이터를 읽을 수 없습니다.


3

이 내용을 읽은 후 가능성에 대해 조사한 후 권한이없는 사용자의 데이터 사용을 제한하는 약간 다른 접근 방식을 찾았습니다.

사용자도 DB에 저장하고 프로필 데이터를 저장합니다. 그래서 나는 다음과 같이 db 규칙을 설정했다.

".read": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()",
".write": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()"

이렇게하면 이전에 저장된 사용자 만 DB에 새 사용자를 추가 할 수 있으므로 계정이없는 사람은 DB에서 작업을 수행 할 수 없습니다. 또한 사용자에게 특별한 역할이 있고 관리자 또는 해당 사용자 만 편집 할 수있는 경우에만 새 사용자를 추가 할 수 있습니다.

"userdata": {
  "$userId": {
    ".write": "$userId === auth.uid || root.child('/userdata/'+auth.uid+'/userRole').val() === 'superadmin'",
   ...

-2

이 정보를 노출해서는 안됩니다. 공개, 특히 API 키. 개인 정보 유출로 이어질 수 있습니다.

웹 사이트를 공개하기 전에 숨겨야합니다. 두 가지 이상의 방법으로 할 수 있습니다

  1. 복잡한 코딩 / 숨김
  2. Firebase SDK 코드를 웹 사이트 나 앱 하단에두면 Firebase가 자동으로 모든 작업을 수행합니다. 어디서나 API 키를 넣을 필요가 없습니다.

1
Firebase에서 "이 스크립트를 복사하여 <body> 태그의 맨 아래에 붙여 넣지 만 Firebase 서비스를 사용하기 전에"API 키가 포함되어 있습니다.
— Luke-zhang-04
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.