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.