理系学生日記

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

忍者TOOLS

mod_auth_cookie (テスト編)

テスト用 CGI

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

#!/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 がブラウザに送られていることが確認できます.

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 に載せるようにします.

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 に載せられる場合に対応できるようになります.

    <Directory "/var/www/basic-test1/">
        AuthName "Members Only"
        AuthType Basic
        AuthUserFile /etc/apache2/htpasswd
        Require user test1
        AuthCookieName idpass
        AuthCookieOverride On
        AuthCookieBase64 On
    </Directory>