タイトルどおり、会員サイトで画像ファイルにもアクセス制限をかける方法です。
ちなみにBlogWriteを購入したので、BlogWriteで書いてます。USBメモリでログを持ち歩いてます。
というわけで会社からカキコ。
本題にもどり、知人に聞きまわったのですが、いくつか方法があるようです。
- ApacheのBASIC認証を利用する
- 画像ファイルを非公開ディレクトリに配置し、プログラムで読み出してContent-type: image/****で返す
- SetEnvIfでリファラーを見る
- Javaの場合はTomcatで画像ファイルにServletFilterをかます
- リバースプロクシを使って4みたいなことをする
順番に説明していきます。
その前に、Mixiは制限かけてないのでログインしていなくても画像ファイル見れます。
プロフィール画像とかMixiのアカウントが無くても見れるはずです。
1のBASIC認証を利用する方法です。
ブラウザ依存のダイアログが出てしまうのと毎回HTTPヘッダに認証の情報が載ります。また、会員サイトはCGIやPHP、Servletで会員の登録をし、またそのアプリで認証を行うため、Apache側に認証をしたとしても二重認証になってしまいます。つまり、HTMLフォームにIDとパスワードを入力して、画像を見ようと思ったらBASIC認証のダイアログが出てしまう。この回避策としては、全てBASIC認証に統一するしかないと思います。
昔の会員系サイトではBASIC認証のサイトを結構見かけましたが、現状では現実的ではないと思います。
次は2の方法です。
URL指定ではアクセスできない場所に画像ファイルを配置し、CGIでバイナリデータを読み込みそのまま返す。というもの。
<img src="hogehoge.cgi?name=abc.jpg"/>みたいな感じ。CGIで認証チェックを行うため、利用者から見ると違和感はない。
でもサーバの負荷が尋常ではないような気がします。
次に3のリファラーではじく方法。
これはきるごあ先生に教えてもらったサイトで実装されてたようです。
例えばアプリサーバがapp.example.comというドメインで、画像サーバがimg.example.comというドメインだとします。
.htaccessファイルでは様々な方法でアクセス制限をかける事ができるのですが、その方法の一つにSetEnvIfがあります。これでリファラーをチェックしてapp.example.comではなければForbiddenを返すというもの。ブラウザのアドレス欄にURLを直接打ち込まれた場合はリファラーが空になるので、この場合もはじけます。また他サイトからリンクされた場合もはじけます。
ただし、リファラーは簡単に偽装が可能なため完全なる制限とは言えません。
次はServletFilterを使う方法です。
完全にアクセス制限をかけたい場合、かつServletで構築しているサイトであればこの方法がお勧めです。
ApacheとTomcatを連携させている場合、静的ファイルはApache側で処理させていると思いますが、画像ファイルをTomcat側に転送させます。するとTomcat側のHTTPエンジン(Coytoteでしたっけ?)で処理されます。このTomcatのweb.xmlにServletFilterをかまします。すると画像ファイルにアクセスする前にプログラムを実行することができるので、このプログラム内で認証チェックを行います。
ただし、TomcatはApacheと比較して画像ファイルを返すスループットがちょっとだけ低いです。
最後にReverseProxyを使う方法です。
これはServletFilterを使うのと同じ要領です。フロントのApacheで画像ファイルにアクセスしたらReverseProxyで特定のプログラムに飛ばします。そして飛ばしたプログラムで判定する。
実際は、そこまで制限したいか?ということになると思いますが・・・。
個人的にですが、基本的にサイトはServletで構築しているので4番目のServletFilterを使う方法が楽チンだと思ってます。
ところどころ脳内補完で説明がぶっとんでますが、行間読んでください・・。
さまい
考えてもまとめるの難しいね。
もっと普通に賢い方法があるかと考えたけど、そうだったらmixiがいつまでも素通しなのもおかしいんで、やはりみんなそれなりに苦労してるってことなのかな。
タムタム
そこまでやるほどのものでもないってだけのような気がする。
Mixiは無料だから良いけど、有料会員サイトの場合はちゃんとしたいですよねー。
規模にもよるけど、妥当なのは2,3,4!