[INDEX]
2001-07-11

Basic認証でのログアウトの仕方

Basic認証の仕組み

WebのBasic認証は、予め認証が必要と設定されているURLに対するアクセス要求をWebサーバが受け取ったときに、Webサーバから認証要求の応答を返し、それに対してブラウザがログインのダイアログボックスを表示する、という手順で行われる。さらに具体的に説明すると、以下のような動作となる:
  1. ユーザがブラウザ上で、URL:http://server/hoge/を入力するか、リンクをクリックする。
  2. ブラウザが認証が必要なURL、http://server/hoge/に対するリクエストをサーバに送る。このときのヘッダ情報は
    	GET /hoge/ HTTP/1.0
    		:
    
  3. サーバがリクエストを受けた/hoge/というURIは、.htaccessなどにより、Basic認証を要求するように設定されており、サーバをこの情報を元にブラウザに以下の応答を返す。
    	HTTP/1.0 401 Unauthorized
    	WWW-Authenticate: Basic Realm="valid users only"
    		:
    
  4. 1行目の「401」という応答コードは、認証されていないという意味を持つ。2行目の「WWW-Authenticate」は認証の種別が「Basic」であり、Realm(範囲)が「valid users only」であることを示している。
  5. ブラウザは、このヘッダ情報を受け取ると、ログインのダイアログボックスをユーザに対して表示する。このとき、ダイアログボックスには、ユーザIDとパスワードの入力フィールドとともに上のRealm情報がダイアログボックスに表示される。
  6. ユーザがログイン情報を入力し、「OK」ボタンをクリックすると、ブラウザはサーバに対して入力に基づいた認証情報を送る。このときのリクエストのヘッダ情報は
    	GET /hoge/ HTTP/1.0
    	Authorization: Basic dXNlcjpwYXNzd29yZA==
    		:
    
  7. ここで、2行目の「dXNlcjpwYXNzd29yZA==」が認証情報で、
    	"user:password"
    
    という内容の文字列をBase64でエンコードしたものである。「user」がユーザIDで、「password」がパスワードとなる。(もちろん、ユーザによってこれらの文字列は変わる)
  8. サーバは上記の認証情報をデコードして、ユーザデータベースなどと比較し、一致していればリクエストされたURIのコンテンツを返す。
  9. ユーザ情報が正しくない場合は3.に戻る。ユーザが、ブラウザに対するユーザ情報の入力をキャンセルした場合は、3.のコンテンツの部分がブラウザに表示される。
  10. 以降は、WWW-Authenticateヘッダで指定されたURI(以下)に対するリクエストでは、ブラウザは常にAuthorizationヘッダを付加して送るようになる。

ログアウトするCGIプログラム

ユーザは、一旦あるURL領域に対してログインすると、10.以降で常にそのユーザで利用することになる。普通のユーザは1つのユーザIDしか使わないので、わざわざログアウトする必要もないが、Webシステムの開発者や管理者は複数のIDを使い分ける必要がある。そのためには、通常ブラウザを再起動しなければならない。これは大変不便なので、ブラウザを起動したままログアウトする方法がないかを考える。

上記のBasic認証の仕組みを考えると、サーバからどうにかして、「401」レスポンスを送ってやれば解決できそうである。

普通はCGIなどのユーザプログラムでは、Webサーバのレスポンスコードを指定することはできないが、ApacheのようなCERNやNCSAの流れを汲むWebサーバでは、「nph-」で始まる名前のCGIではそれができるようになっている。これを利用してnph-logout.cgiというプログラムを作る。内容は

#!/usr/bin/perl
print <<EOF;
HTTP/1.0 401 Unauthorized
WWW-Authenticate: Basic Realm="valid users only"
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD><TITLE>401 Authorization Required</TITLE></HEAD>
<BODY>
<H1>Authorization Required</H1>
</BODY>
</HTML>
EOF
これだけである。Realmの部分を設置する環境に合わせて書きかえる必要はあるが、ログインした状態でこのプログラムにアクセスすると、「認証に失敗しました」というダイアログボックスに続き、ログイン情報の入力ダイアログボックスが表示される。

ここでキャンセルすると、以降はこのURL領域に対しては認証を求められるので、「ログアウト」された状態になっていることがわかる。

以上
kazm-s@shorindo.com