Firebaseのストレージで有料コンテンツを提供する際に気を付ける事

記事
IT・テクノロジー

Firebaseのストレージで有料コンテンツを提供する際に気を付ける事

Firebaseのストレージ機能を利用すると、オンラインコンテンツを簡単にWebサイト(Webページ)から配信する事ができます。
Javascript(Typescript)のプログラムで簡単にURLを取得できるので、WebサービスやWebアプリと組合わせてダウンロードをするUI(ユーザーインターフェス)を初心者でも簡単に構築できるからです。
無料コンテンツの場合余り大きな問題はないのですが、有料コンテンツを置いて、Webサイト(Webページ)から利用する場合は、幾つか注意すべき点があります。この記事では有料コンテンツをWebサイト(Webページ)から配信する際に注意する点について解説しています。

有料コンテンツの配信は何が違う?

当たり前ですが、有料コンテンツはお金を払った人だけがアクセスできるというのが基本です。従って、オンラインコンテンツのダウンロードの仕組みを構築する際に、お金を払った人だけに提供できる仕組みを提供する必要があります。
この記事で解説するポイントは以下の3点です。
*お金を払った人をどうやって特定するのか
*お金を払っていない人のアクセスをどのように防ぐのか
*その他に気を付ける事

お金を払った人を特定する

お金を払った人を特定するという観点で考えると、どれくらいの期間コンテンツの提供をするのかという事をまず決める必要があります。
*お金を払った時のみ(お金を払った直後のみ)ダウンロード可能
*お金を払った後一定期間(長期間)に渡りダウンロードをサポート
お金を払った直後のみダウンロード可能にする場合
お金を払った直後のみの場合は、決済と組み合わせて決済が正常終了した場合のみ、ダウンロードページを表示するようにすれば良い事になります。
このやり方だと、サービスをシンプルに実装する事が可能です。支払い後のみに限定する方がサービスを作るのも簡単ですし、購入者も購入時にアカウントを作成する必要がありません。
お金を払った後一定期間(長期間)に渡りダウンロードをサポートする場合
お金を払った後一定期間(長期間)に渡りダウンロードをサポートする場合は、購入者と、購入した商品を特定する必要があります。そのためには、購入時にアカウントを作成してもらうのが一番簡単で確実な方法になります。購入のプロセスは次の様になります。
1.購入時にログイン(アカウントがない場合は作成)
2.オンライン決済(購入手続き)
3.決済完了時に、決済情報をデータベースに(商品、日付など)
4.最初のダウンロード画面の表示
5.ダウンロード
購入者が、再度ダウンロードをしたい場合の流れは
1.アカウントにログイン
2.購入品目を表示
3.ダウンロードする商品を選ぶ
4.ダウンロード画面の表示
5.ダウンロード
という流れにすれば再ダウンロードをサポートする事が可能です。
Firebaseを利用する場合、Firebaseの認証機能(ログイン機能)とFirebaseのデータベース機能(Cloud Firestore)を組合わせれば、これらの機能も比較的簡単にサポートする事ができます。

お金を払っていない人のアクセスをどう防ぐか?

結論から書いてしまうと、お金を払っていない人のアクセスを完全に防ぐ事はできません。例えば、お金を払った人が、オンラインコンテンツダウンロードの為のリンクをインターネットなどで公開してしまった場合は防ぐのが難しくなります。
工夫をすれば、お金を払っていない人のアクセスをかなり防ぐ事は可能です。Firebaseなどでサポートされている標準的な機能だけでもかなり改善は可能です。 ポイントは
共通のリンクを使用しない
これが一番効果的な対策です。購入者がオンラインコンテンツをダウンロードする際に毎回、リンクを生成して提供するという方法です。 理想的にはリンクは1回のみ使えるようにできれば、ほぼ全部の購入者以外のダウンロードを防ぐことはできますが、回数の限定は標準でサポートされている機能だけでは簡単に実現できません。
そこで、リンクに有効期限をつけることでアクセス可能な時間を制限するという方法が効果的です。リンクが有効の間は、そのリンクを知る人はオンラインコンテンツのダウンロードは可能という事になります。しかし、期間を限定している事で、無制限にダウンロードされるリスクは低くすることは十分可能です。
あとは、ダウンロードのリンクの有効期限をどう設定すればよいのかを決めれば良いだけです。これは判断が難しいですが、常識的に考えれば、購入後すぐにダウンロードするのが普通なので、1時間程度有効ならば殆どの場合問題にはなりません。
リスクは増えますが、24時間有効にできると利用者には便利かと思います。私の場合は利用者の事も考えて、通常は24時間という数字を選択する場合が多いです。

Firebaseの特徴を理解する

次に考慮する点は、Firebaseの特徴を理解しておくことです。 無料で公開する場合は、無料で手に入るので余り変な事をする人は殆どいないと思いますが、有料になると無料で手に入れようと考える人は出てくるものです。
実は、Firebaseの場合、Firebaseのストレージのフォルダーのパスとファイル名を知っていると、リンクを取得できる可能性があるという事です。簡単には分かりませんが、JavascriptのソースコードはWebブラウザーから閲覧する事は基本的に可能です。
従って、フロントエンドで実装している場合は、Firebaseのストレージにアクセスする方法はある程度調べる事は可能という事になってしまいます。
こうした意図をしないアクセスを防ぐことも重要になります。
対策としては
*Firebaseにアクセスできるドメインを限定する(特に「localhost」は要注意) 
*読みやすい形でのソースコードを提供しない 
*Firebaseのストレージのアクセスをバックエンドで行う 
などがあげられます。
ドメインの限定は、Webサイトをホスティングしているドメインのみに設定する事でかなり制限が可能になります。ただし、開発などでは開発用のPCでサーバーを動かして検証しながら開発する場合が多いので「localhost」を許可している場合が殆どです。localhostが許可されていると誰でも、PC上でサーバーを動かせばFirebaseのプロジェクト情報があればアクセスが可能になります。
ソースコードは、ReactやVueで公開用のイメージを作った場合には人間には読みにくいコードになります。(コメントが削除されて、改行等も削除されるため)しかし、あくまで読みにくいだけで、ソースコードは見られる状態は余り変わらないので、効果は限定的です。
最後が、Firebaseストレージのアクセスをバックエンドで行う方法ですが、これを使うと、アクセス件の確認等をバックエンドで行うことが可能になります。バックエンドのコードは通常は、Webブラウザからは参照する事はできないのでセキュリティは格段に高くなります。セキュリティルールで、Firebaseストレージのアクセスを禁止にしておけば、URL以外ではFirebaseストレージにアクセスは基本的にできなくなるので、より安全な方法と言えます。

商品の価格情報にも注意!

Firebaseのストレージとは直接関係がありませんが、決済する際に、商品の価格情報などを扱う場合も注意が必要です。
例えば、商品の価格をフロントエンドのWebブラウザから送信してその金額を使うのは避けた方が無難です。これは、技術的には別の価格情報をWebブラウザから送る事が可能だからです。 安全な実装としては、価格や通貨情報は、サーバー側で別途取得して決済に使うという方が安全です。こうする事で、悪意のある人が、価格情報を改変して決済しようとすることをかなり予防できるからです。

まとめ

お金が絡んでくると、悪い事を考える人も増えます。 無料のオンラインコンテンツの提供では余り問題にならなかった事も、有料でオンラインコンテンツを提供する場合大きな問題になる可能性を秘めています。
有料でのオンラインコンテンツの提供を考えた場合、Firebaseストレージにあるオンラインコンテンツの処理や、価格情報などの決済の処理はサーバ側のバックエンドで行った方が、セキュリティ上は安全です。
WebサービスやWebアプリの実装も有料サービスをする場合は、必要な処理はバックエンドで行った方が安全です。セキュリティルールと組み合わせれば、多くの対策は可能です。Firebaseではバックエンド処理のサポートも可能です。
セキュリティを考慮した安全なWebサービス、Webアプリの設計が求められます。


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す