理系学生日記

おまえはいつまで学生気分なのか

mod_auth_cookie (テスト編)

-mod_auth_cookie (インストール編) - 理系学生日記 -mod_auth_cookie (設定編) - 理系学生日記 -mod_auth_cookie (テスト編) - 理系学生日記

**テスト用 CGI

ここでは,クライアントにクッキーを設定するための単純な CGI (cookie.cgi) を作成しました.この CGI にアクセスすると,test1 ユーザの id/pass が Set-cookie: ヘッダによってブラウザに送られるはずです.

|perl|

!/usr/bin/perl -T

use strict; use warnings; use CGI;

my $q = CGI->new;

my $cookie = $q->cookie( -name => 'idpass', -value => "test1:test1", );

print $q->header( { type => 'text/html', -cookie => $cookie } ), $q->start_html( -title => 'set cookie' ), $q->h1( 'Setting Cookie to Your Browser' ), $q->end_html; ||<

**テスト

では実験です.まずは ブラウザから cookie.cgi にアクセスします.この時に送られる HTTP リクエスト/レスポンスヘッダの抜粋は以下のようになり,Set-Cookie ヘッダによって test1 ユーザの id/pass がブラウザに送られていることが確認できます.

|bash| GET /cgi-bin/cookie.cgi HTTP/1.1

HTTP/1.x 200 OK Set-Cookie: idpass=test1%3Atest1; path=/ Content-Type: text/html; charset=ISO-8859-1 ||<

では,この後 test1 ユーザにしかアクセスできない /var/www/basic-test1/a.txt にアクセスしてみます.以下では敢えて HTTP リクエストによって送られている全てのヘッダを示しました. 注目すべきなのは,Authorization ヘッダが送られていないにも関わらず,Basic 認証の対象である a.txt に GET をすると 200 OK が返ってきていることであり,これによってクッキーによる Basic 認証が確認できました.

GET /basic-test1/a.txt HTTP/1.1
Host: my-webserver.com
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: idpass=test1%3Atest1

HTTP/1.x 200 OK

もちろん,この状態で /var/www/basic-test2/a.txt にアクセスしてみると,401 Authorization Required が返ってきて,id/pass を要求されます.

GET /basic-test2/a.txt HTTP/1.1
Host: my-webserver.com
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: idpass=test1%3Atest1


HTTP/1.x 401 Authorization Required

正しく動いているようですね.

**Cookie

ちなみに Cookie の方も,セッションが切れたら削除されるようになっています.

**Base64 変換

まぁ Cookie を覗けば id も pass も読めるというのは大変不安になるので,Base64 変換するのも良いかもしれません.とは言え平文とほとんど変わりませんが. そういうわけで,CGI を改修して,id/pass を Base64 変換したものを Cookie に載せるようにします.

|perl| use strict; use warnings; use CGI; use MIME::Base64 ();

my $q = CGI->new;

my $cookie = $q->cookie( -name => 'idpass', -value => MIME::Base64::encode( "test1:test1" ), );

print $q->header( { type => 'text/html', -cookie => $cookie } ), $q->start_html( -title => 'set cookie' ), $q->h1( 'Setting Cookie to Your Browser' ), $q->end_html; ||<

これによって,Set-Cookie ヘッダには Base64 変換した結果の文字列が載せられます.

HTTP/1.x 200 OK
Date: Sun, 21 Dec 2008 09:43:54 GMT
Server: Apache/2.2.9 (Ubuntu) mod_ssl/2.2.9 OpenSSL/0.9.8g mod_perl/2.0.4 Perl/v5.10.0
Set-Cookie: idpass=dGVzdDE6dGVzdDE%3D%0A; path=/
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 273
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=ISO-8859-1

結果としてブラウザから送られる Cookie にも Base64 変換したものが載せられることになるので,mod_auth_cookie でもそれに対応しなければなりません.この対応付けを行ってくれるのが AuthCookieBase64 ディレクティブですね.こんな感じにすれば,Base64 変換した結果の文字列が Cookie に載せられる場合に対応できるようになります.

|apache| AuthName "Members Only" AuthType Basic AuthUserFile /etc/apache2/htpasswd Require user test1 AuthCookieName idpass AuthCookieOverride On AuthCookieBase64 On ||<