それで、少し調べてみることにした。
試したのは Apache の 2.2.10。
ブラウザは、Mac OS X版の Firefox 3.0.5。
【Basic認証のヘッダ】
まず Apache で、Basic 認証するように設定する。
AuthType Basic
AuthName "Members Only"
AuthUserFile (htpasswd で作成したファイル)
Require user test設定したサイトにアクセスしたときにやりとりされるヘッダを見てみると、サーバーから以下のようなレスポンスヘッダが送られていることがわかる。
WWW-Authenticate: Basic realm="Members Only"ブラウザはこのヘッダを受け取ると、ユーザー名とパスワードを尋ねるダイアログを表示する仕組みらしい。
ユーザーがユーザー名とパスワードを入力すると、ブラウザは以下のようなヘッダをサーバーに送る。
Authorization: Basic dGVzdDpob2dlaG9nZQ==dGVzdDpob2dlaG9nZQ== の部分は、なんとなく Base64 エンコードされた文字列のように見える。実際、Linux などのコマンドラインで Base64 をデコードさせると
$ echo dGVzdDpob2dlaG9nZQ== | base64 -d
test:hogehogeとなり、まさにそのままのデータが送られていることがわかる。
【Digest 認証のヘッダ】
では、Digest 認証ではどうなるのだろうか。
Apache 設定を次のように変更してみる。
AuthType Digest
AuthName "Members Only"
AuthDigestDomain /members/ http://www.xxx.yyy.zzz/members/
AuthDigestProvider file
AuthUserFile (htdigest で作成したファイル)
Require user testアクセスしてみると、次のようなヘッダが返されてくる。
WWW-Authenticate: Digest realm="Members Only", nonce="UCErxQJgBAA=adcfa99be662765c4ee565776bb72e56e9484f1a", algorithm=MD5, domain="Members Only http://www.xxx.yyy.zzz/members/", qop="auth"認証ダイアログで、ユーザー名とパスワードを入力すると、
Authorization: Digest username="test", realm="Members Only", nonce="UCErxQJgBAA=adcfa99be662765c4ee565776bb72e56e9484f1a", uri="/members/", algorithm=MD5, response="51152682c7c236b3b19c01a68d9f5cdd", qop=auth, nc=00000001, cnonce="3e20e8e2ac01a260"といったヘッダがサーバーに送られる。
おそらく、
UCErxQJgBAA=adcfa99be662765c4ee565776bb72e56e9484f1aがチャレンジで、それに対して 51152682c7c236b3b19c01a68d9f5cdd を返す仕組みと思われる。
