2つのFirebaseのアクセス方法 フロントエンドとバックエンド

記事
IT・テクノロジー

2つのFirebaseのアクセス方法 フロントエンドとバックエンド

Firebase のデータベースを利用する場合、フロントエンドからアクセスする方法とバックエンドからアクセスする方法があります。

手軽なのは、フロントエンドからアクセスする方法です。バックエンドサービスを作る必要がないので簡単に実装できるのは魅力です。一方で、アクセスの権限の細かい設定は、セキュリティルールで設定する必要があるので、複雑な権限やデータを扱う場合には面倒な点もあります。

手軽に利用できるフロントエンドからのアクセス

一番一般的でポピュラーな方法は Firebase のクライアント機能を利用する方法です。

一番簡単な方法は、CDN(Contents Delivary Network)を利用する方法で、HTML で CDN のリンクを指定すれば、簡単に Firebase のデータベースにアクセスすることが可能です。

テストモードならば簡単

Firebase のデータベースは、Firebase のプロジェクトを作成して、データベースを作成する時に設定するようになっています。この時聞かれるのが、「プロダクションモード」と「テストモード」です。

プロダクションモードは基本的にアクセスが禁止になっているので、必要に応じてセキュリティールールを設定してアクセスを許可していく必要があります。

テストモードは基本的に全てのアクセスを許可しています。従って、誰でも全てのデータにアクセスできるのでインターネット上にサービスを公開する際には、セキュリティルールを設定して必要最低限のアクセスを許可するように変更する事は必須です。通常は、設定時に 30 日間のみアクセスができるような設定になっています。この期間を超えてこのモードを利用する場合には、期間の設定を更新する必要があります。

セキュリティルールが必要な理由

セキュリティルールを設定しない場合(全てのアクセスを許可してしまう場合)は、該当する Firebase のプロジェクトの全てのデータベースのデータに誰でもアクセスできます。つまり、新たなコレクションを作成したり、データの更新や削除も自由にできることになります。 クライアント側(Web ブラウザ)から Firebase にアクセスするための情報は、基本的に Web ブラウザから見ることが可能です。 つまり、悪意のある利用者がいる場合には、何をされるかわかりません。

全てのアクセスを許可する場合は、パスワードなどがなくても全ての情報にアクセスが可能なので、通常はセキュリティルールで細かいルール(権限)の設定をしないと問題になります。

Firebase データベースのセキュリティルール

Firebase のセキュリティルールは専用のスクリプトのような形式で記述する形式になっています。簡易的なスクリプトなので設定可能なルールにもある程度制限があります。

アクセスの制限(権限)の単位は、3つの種類に分けられます

* アクセス可能なユーザー
* アクセス可能なコレクション・ドキュメント
* アクセスのタイプ
ユーザーを識別する方法は、Firebase で認証したユーザならば UID を利用できます。それ以外の場合、Fiebase の認証をしているかしていないかでも設定可能です。

アクセス先のデータは、Firebase Cloud Firestore の場合、コレクション単位か、ドキュメント単位で権限を分けることができます。

アクセスのタイプは、読み込みか書き込みかですが、さらに細かく分けて新規作成、更新、削除などのように細かく分けることもできます。 また、書き込みや更新のアクセスの場合、アクセス前のデータと書き込むデータの両方にセキュリティルールからアクセスができるため、こうしたデータの書き換えや更新に制限をかけることもできます。

この3つを基にアクセスの権限を定義するというのがセキュリティルール設定の基本です。

セキュリティルールから、Firebase のデータベースへのアクセスも可能で、関数などを定義すれば、例えば、Firebase の持つユーザーの情報以外にも、グループを設定してグループ事の権限を定義することも可能です。

複雑なセキュリティルールを設定する場合、セキュリティルールの書き方の詳細を理解する必要がありますが、大抵のルールの設定は技術的には可能です。

セキュリティールールでアクセスの権限がないと判断された場合、Web ブラウザで動作するプログラムからアクセスをしようとしても、エラーになるためアクセスはできません。

バックエンドを経由した実装も可能
Firebase には「Firebase admin SDK」という機能もあって、バックエンドのサービスを実装すると、Firebase admin SDK を利用したアクセスも可能になります。この場合は、Firebase のデータベースのアクセスは基本的にバックエンドを経由したアクセスをすることになります。(もちろん通常のフロントエンドからのアクセスも可能です)

この場合は、データベースへのアクセスは通常の利用者からは直接は見ることはできなくなります。また、セキュリティルールを設定する必要もありません。

必要なアクセスをフロントエンドに提供すれば良いのでセキュリティ上も安全度を高くする事が可能になります。ただし、アクセスに必要なインターフェース(API)をきちんと決める必要があります。実際のセキュリティはこのインターフェースで決まります。 ただし、セキュリティルールよりは、アクセスの権限の設定の自由度は高くなります。

アクセスの形としては、一般的な PHP と SQL サーバーを利用した場合のアクセスと似た実装になります。

バックエンドの場合、セキュリティルールの設定にかかわらず、Firebase admin SDK(firebase-admin パッケージ)を利用してアクセスする限り全てのデータに読み書きのアクセスが可能になります。

従って、フロントエンドからバックエンドを経由してアクセスするような仕組みを作る場合、セキュリティルールに変わるセキュリティの確保を API レベルで考慮して、API を設定する必要があります。認証した、UID を使うだけのシンプルな物から、特別なトークン(公開鍵)などを利用したセキュリティの確保など、セキュリティの実装をアプリで行う必要がありますので、通常のクライアントアクセスに比べるとハードルが高くなります。

バックエンドとのアクセスのインターフェースだけではなく、クロスドメインのアクセス(CORS)の設定と併用すれば、よりセキュリティを高くすることが可能です。

どちらを使うか?
フロントエンドとバックエンドから Firebase のデータベースにアクセスする方法があることはおわかりいただけたかと思います。では、どちらを Web アプリを実装する際に使うかが課題になります。

初心者の場合は、通常のクライアント(Web ブラウザ)からアクセスする方が無難です。理由は、バックエンドの実装と、フロントエンドとバックエンドの API を十分なセキュリティを考えた上で設定する必要がるため、全ての仕組みを Firebase 側で準備しているクライアントアクセスの方が安全です。

クライアント側からのアクセスを行う場合のポイントは、セキュリティルールです。 シンプルなセキュリティルールで住む場合は余り問題はありませんが、少し複雑なルールが必要になる場合は、セキュリティルール自体も時間をかけて検証とデバッグを行う必要があります。

では、どんな時にバックエンド側からのアクセスを使うかですが、これは主に管理用のアクセスにはバックエンド側からのアクセスを考えた方が便利です。 管理用には基本的に全てのアクセス権限が必要な事が多く、管理用のセキュリティールールの設定がセキュリティホールになる可能性も大きいので、管理用のツールはインターネットに公開せずに、管理用の PC から利用するアプリの形で実装するとセキュリティ上も安心です。この辺りが、この機能を「admin SDK」と呼ぶ理由だと思います。

もう一つは、外部の Web サービスを使う場合です。 例えば、外部の Web サービスが提供する RestAPI などを利用して自分の Web アプリをホスティングしているサーバー以外からデータを取得するような場合です。データの更新はバックエンド側から行って、データの取得(読み込み)は、クライアント(Web ブラウザ)側から行うようにアクセスを分けると、クライアント側からのセキュリティルールの実装がシンプルになる場合が多いからです。

実例としては、メルマガなどの配信サービスを SendGrid を介して行う場合のデータの置き場所として、Firebase のデータベースを利用した例などがあります。

まとめ
Firebase のデータベースのアクセスは、クライアント(Web ブラウザ)側からも、バックエンド(サーバー)側からの両方でアクセスする事ができます。

どちらを使うかは、基本はクライアント(Web ブラウザ側)から利用する方が、Firebase の利点を最大限に使うことができると思います。この方法ならば、バックエンド側のサービスを一切作る事なく、データベース機能を取り込んだ本格的なアプリを開発できます。

サーバー側のアクセスは、インターネットに公開ぜずにアプリの管理機能などに使うとセキュリティ上も利点が大きいといえます。他のケースとしては、外部のサービスも取り込んだ少し複雑なアプリの場合は、上手く利用すると便利です。

いずれにしても、Firebase のデータベースをクライアント(Web ブラウザ)側から利用する場合のポイントは、確実にセキュリティルールを実装することで、アプリ本体の検証・デバッグだけではなく、セキュリティルールの検証・デバッグにも十分時間をかけて確認する事が重要です。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す