Apache 2.3/2.4系に実装中の新機能をちょっと先取りして見てみよう
(追記: 続編をupしました。設定例と動作検証を行っています。→こちらへどうぞ)
Apacheといえば、Webサービスを構築する上でだいたいどこかで必ずお世話になるであろう、HTTPサーバのデファクトスタンダードとして幅広く定着したソフトウェアだと思います。KLabでも各所で運用してお世話になっています。
現在、バージョンは2.2系が安定版(stable branch)となっておりますが、開発版である2.3系が既に並行して公開されているのをご存知でしょうか。新しい機能や技術を取り入れて行く為に2.2系との間の互換性を時に犠牲にしつつ、様々なチャレンジが行われているわけです。将来的にはこのバージョンが2.4系となって新しい安定版として提供されることになるでしょう。
このDSASブログでも、Apache 2.3系で取り組まれている新しい機能について着目し、面白そうなものを一つずつ取り上げながら調べて行きたいと思います。
まず最初に、今回はApacheによる認証機能の強化 - mod_auth_formとmod_sessionを取り上げます。
http://httpd.apache.org/docs/2.3/mod/mod_auth_form.html
mod_auth_form - Apache HTTP Server
http://httpd.apache.org/docs/2.3/mod/mod_session.html
mod_session - Apache HTTP Server
SNSやblog、ショッピングサイトなど、ページ閲覧・遷移をユーザごとに紐付ける必要から、多くのWebアプリケーションではユーザ認証の仕組みを必要としています。この認証の仕組みは従来Webアプリケーション側で実装してきました。しかしこれと同じ仕組みを、Webアプリケーションを使わずにApache単独でも構築できるようになるかもしれません。
一般的な認証処理の流れを図示すると下の図のようになります。
太線(1→2、3→4)はユーザのクリックによる遷移、細点線(2→3、4→5)はサーバからのリダイレクト応答(301 Moved Permanentlyないし307 Temporary Redirect)による遷移を表しています。2と4では、CGIなどでログイン・ログアウト処理が内部で行うとします。
mod_auth_formによる認証は、この一連の遷移上の各ページをhttpd.conf内で指定することで構築できます。
まず、1)ログインページのフォームは以下のようになります。
<form method="POST" action="/doauth"> Username: <input type="text" name="httpd_username" value="" /> Password: <input type="password" name="httpd_password" value="" /> <input type="submit" name="login" value="Login" /> </form>
/doauthのURLが上図における2)認証処理に相当しますので、SetHandlerディレクティブを用いてform-login-handlerを割り当てます。
<Location /doauth> SetHandler form-login-handler AuthFormLoginRequiredLocation http://example.com/login.html # 認証失敗、未認証時のリダイレクト先 → 1) AuthFormLoginSuccessLocation http://example.com/mypage/ # 認証成功時のリダイレクト先 → 3) ... </Location>
ちなみにAuthFormLoginRequiredLocationディレクティブは、認証によって保護したいURL配下を指定するためにも使うようです。つまり、<Location>や<LocationMatch>で保護するURLツリーを指定し、そこでAuthFormLoginRequireLocationディレクティブで未認証時は1)のログインフォームのページに飛ばすように指定するわけです。
また、4)のログアウト処理も同じように設定します。form-logout-handlerをSetHandlerで割り当てます。
<Location /dologout> SetHandler form-logout-handler AuthFormLogoutLocation http://example.com/loggedout.html # ログアウト後のリダイレクト先 → 5) ... </Location>
あと他に細かい設定がいくつか可能ですが、それを含んでもCGIスクリプト等を全く作成していない点に注意してください。静的なHTMLファイルだけで認証機能付きのサイトを構築することができるのです。
で、認証が通ってもその状態を保持できなければHTTPリクエストのたびに同じ処理を繰り返す必要が出てきます。なので、一度認証を通したらセッションIDを発行してログアウトまで有効になるようにしておきたいですね。ここでmod_sessionの出番です。先ほどの/doauthのhttpd.conf設定に次のように関連ディレクティブを追加します。
<Location /doauth> SetHandler form-login-handler AuthFormLoginRequiredLocation http://example.com/login.html # 認証失敗、未認証時のリダイレクト先 → 1) AuthFormLoginSuccessLocation http://example.com/mypage/ # 認証成功時のリダイレクト先 → 3) ... Session On SessionCookieName session path=/ SessionCryptoPassphrase secret </Location>
このようにして、プログラム・スクリプト部分無しで認証機構を持たせることが可能になるということです。残るはユーザ登録の処理についてはですがこちらは確認できておりません。今後の調査次第もしくは実装が追加されるかもしれませんが、そうでなければ各自で作り込む必要がありそうです。