Apache mod_rewrite を使って GET API キーを隠す方法



JavaScript で Google などの有料APIを使う実装をしている場合、ユーザ認証手段となるAPI キーはブラウザに渡されるスクリプトファイル内に書かれているので、厳密な意味では隠す事ができません。このため、例えばGoogle APIではむやみに APIキーが他人に利用されないように API キーを使用できるリファラーのドメインを指定する機能が提供されていますが、リファラーを書き換えることはさして難しい話でもないので、完全な防御にはならないのでは無いかと思います。

ということで、Apache の mod_rewrite を使って、API キーを隠す方法です。GET で API にアクセスしている場合に使えます。

API キーを隠す方法の概要

Apache の mod_rewrite の Pフラグ(プロキシ)を利用して、ローカルのパスを APIのURL に書き換えますが、その際、QSAフラグ(クエリ文字列をアペンド)も使って、隠したいパラメータを書き換え先のURL に含めておきます。

Apache の設定ファイルに隠したいパラメータを含め、動的に変更したいパラメータはスクリプトから送るようにします。

隠す API キーを含めた Apache の mod_rewrite 設定

Apache の設定ファイルには以下のように設定します。これは httpd.conf に記載する場合の例です。.htaccess に記載する場合は RewriteBase の設定などを適宜追加して下さい。SSLProxyEngine の設定は、API のURL が https の場合に必要です。

SSLProxyEngine on
RewriteRule ^/any/path$ https://www.apihost.com/api/path?key=xxx&another_param=xxx [P,L,QSA]

ブラウザ(JavaScript)からAPIにアクセスする時のURL

スクリプトからアクセスするURLは、自ホスト内のパスに、動的に変更したパラメータだけを追加してリクエストします。

http://www.myhost.com/any/path?additional_param=xxx

最終的にリクエストしているURL

mod_rewrite の書き換えにより、下記のURLにアクセスした結果を受け取る事ができます。このURLは、アクセスしているユーザ側には見えません。

https://www.apihost.com/api/path?key=xxx&another_param=xxx&additional_param=xxx

API に GET リクエストを送る JavaScript の例

JavaScript 側のコード例は下記のようになります。(jQuery を利用している場合。)

var vals = [
    {name: "additional_param", value: $("#some_field").val()}
];

$.get("/any/path", $.param(vals))
.done(
    function(response_data){
        // リクエストが成功した時の処理
})
.fail(
    function(response_data) {
        // リクエストが失敗した時の処理
})
;