Basic認証とDigest認証の手順を学習してみる
HTMLフォームからのID/Passwordによるログインや、OpenIDを利用してのログイン等が主流で、あまり目にする(&実装する)機会の無い認証方法なので手順をなかなか覚えきれません><
というワケで、以下それぞれの手順をメモしておきます。
Basic認証
ブラウザのダイアログが出て「ユーザー名・パスワード」を要求されるアレですね。認証をかけたいディレクトリに.htaccessを置く必要があるので、.htaccessが利用可能である事が前提です。
まずは、照合用の.htpasswdファイルを作成。言わずもがなですが、公開ディレクトリより上層に配置します。シェルで以下のコマンドを実行します。
;; 公開ディレクトリが/var/www/htmlなので # htpasswd -b -c /var/www/.htpasswd ユーザー名 パスワード
「-b」オプションで、端末から入力したパスワードを利用出来るようです。ただし、コマンド入力時にパスワードが丸見えなので気をつけなさい!!みたいな事がmanに書いてありました。
「-c」オプションは新規ファイル生成(create)なので、認証ユーザーを追加したい場合には不要のようです。取りあえず上記のコマンドで、「hoge」ユーザーのパスワード「hogehoge」を作成してみました。
で、次に認証をかけたいディレクトリ下に.htaccessファイルを配置します。取りあえずローカル環境でのテストなので、公開ディレクトリ以下全てを認証制にしてみます。.htaccessの内容はこんな感じです。
AuthUserFile /var/www/.htpasswd AuthName "Input ID and password" AuthType Basic require valid-user
ポイントは「.htpasswdのパスは絶対パスで記述する」という点でしょうか。AuthNameに記述した内容がダイアログに表示されます。
Basic認証は、認証情報がリクエスト毎に送信され、尚かつその情報が暗号化ではなくbase64による「符号化」でしかない為、実質平文のID・パスワードがネットワーク上に流れるのであまりセキュアな方法とは言えないようです。
Firebugでリクエストヘッダを見てみると、以下の情報が送信されています。
Authorization Basic aG9nZTpob2dlaG9nZQ==
この文字列をPHPのbase64_decode()関数などに与えてみると…
$ php -a
php > echo base64_decode("aG9nZTpob2dlaG9nZQ==");
php > hoge:hogehoge
と、ユーザー名/パスワードがあっさり分かってしまいました。
そこで、次のDigest認証が推奨されています。
Digest認証
こちらの認証方法はBasic認証とほとんど同様のようですので、まずは照合用の.htdigestファイルを作成します。
# htdigest -c /var/www/.htdigest レルム ユーザー名 Adding password for hoge in realm Secret Area. New password: [パスワード応答] Re-type new password: [パスワード応答]
「レルム」というのは、.htaccessファイルに記述する「AuthName」と同一である必要があります。ここがBasic認証とは違いますね。
で、.htaccessは以下のようになります。
AuthType Digest AuthName "Secret Area" AuthDigestDomain / AuthUserFile /var/www/.htdigest require valid-user
「AuthType」が「Digest」になる点と、前述のように「AuthName」の意味合いが変わる事ぐらいでしょうか。
続いてこの場合のリクエストヘッダを見てみると、以下のような情報が送信されていました。
Authorization Digest username="hoge", realm="Secret Area", nonce="QlGMVhl2BAA=d7dd8bd6c5659d1efd515d79ed699ab1d694e99d", uri="/", algorithm=MD5, response="afc54b31313e200977dcc5c0721d39bb", qop=auth, nc=00000006, cnonce="303473c2c65228c6"
「algorithm=MD5」とありますので、認証情報が暗号化されて送信されているようです。この辺りが、Basic認証の代わりに推奨される理由でしょうか。
色々と調べてみると、Basic認証では「-b」オプションが無くても良かったり、Basic認証でも暗号化が利用出来たり、とまだまだ勉強する事がありそうですが、最低限の知識としては今の所これで充分かな??と思います。
今日はここまで。

Basic認証、非常に勉強になりました!
仕事で昔の案件案件を担当するとよく利用されているんですが、Basic認証が「よくない」理由がはっきりと認識できました・・・
このエントリを参考に体制をかえていかないと!!
>pazサン
コンニチハ
いつもpazサンのエントリで勉強させてもらってばかりなので、お役に立てたなら何よりです^^
一応ローカル環境で検証していますが、嘘ついてたら遠慮なくつっこんでください。
ネットワーク上の通信とかになるとTCP/IPも勉強しないとイケナイですよね。
課題盛りだくさんですが、楽しそうなのでちゃんと身に付けたいです!!