情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

サーバサイドウェブ開発基礎 HTTP詳説 認証

サーバやプロキシはHTTPリクエストを認証することができます。

認証はサーバやプロキシがチャレンジと呼ばれるデータをHTTPレスポンスの一部としてクライアントに送信し、クライアントがチャレンジに対するクレデンシャルと呼ばれるデータをHTTPリクエストの一部としてサーバやプロキシに送信することによって行います。

サーバは認証が必要なHTTPリクエストを受け取った場合にはステータスコードが401Unauthorized)でWWW-Authenticateヘッダフィールドの値に1個以上のチャレンジのリストを,区切りで指定したHTTPレスポンスを返信するようにします。

また、プロキシは認証が必要なHTTPリクエストを受け取った場合にはステータスコードが407Proxy Authentication Required)でProxy-Authenticateヘッダフィールドの値に1個以上のチャレンジのリストを,区切りで指定したHTTPレスポンスを返信するようにします。

逆に、クライアントはサーバからの認証が必要なHTTPリクエストを送信する場合にはAuthorizationヘッダフィールドの値にサーバからの何れか1つのチャレンジに対するクレデンシャルを指定したHTTPリクエストを送信しなければなりません。

また、プロキシからの認証が必要なHTTPリクエストを送信する場合にはProxy-Authorizationヘッダフィールドの値にプロキシからの何れか1つのチャレンジに対するクレデンシャルを指定したHTTPリクエストを送信しなければなりません。

なお、サーバやプロキシは認証には成功したもののその認証では行う権限のないHTTPリクエストを受け取った場合にはステータスコードが403Forbidden)のHTTPレスポンスを返信するようにします。

認証方式には下のようなものがあります。

  • Basic
  • Digest

Basic認証

Basic認証はユーザ名とパスワードによる認証です。

Basic認証のチャレンジを指定するにはBasic、1文字の空白、realm=、認証の識別子を順番に記述します。ただし、認証の識別子は"で囲まなければなりません。

Basic認証のクレデンシャルを指定するにはBasic、1文字の空白、ユーザ名とパスワードを:で結合したものをBASE64でエンコードしたものを順番に記述します。

Digest認証

Digest認証はユーザ名とパスワードによる認証ですが、パスワードが直接送信されることはなく、代わりにユーザ名とパスワードなどから計算されるハッシュ値を使用します。

Digest認証のチャレンジを指定するにはDigest、1文字の空白、パラメータを順番に記述します。

パラメータを指定するには名称、=、値を順番に記述します。また、パラメータが複数存在する場合には,で区切ります。

パラメータには下のようなものがあります。

  • realm・・・認証の識別子を"で囲んで指定します。
  • domain・・・認証が適用されるURI(URL)参照を"で囲んで指定します。このパラメータは指定しなくても構いません。
  • nonce・・・ハッシュ値の計算に使用されるナンスと呼ばれる無作為なデータを"で囲んで指定します。
  • opaque・・・クレデンシャルにそのまま格納されるデータを"で囲んで指定します。このパラメータは指定しなくても構いません。
  • stale・・・クレデンシャルのハッシュ値の計算に使用したナンスが古過ぎる場合にはtrueを指定します。このパラメータは指定しなくても構いません。
  • algorithm・・・クレデンシャルのハッシュ値を計算するアルゴリズムを指定します。md5md5-sessを指定します。このパラメータは指定しなくても構いません。デフォルトはmd5です
  • qop・・・サーバがサポートしている1個以上の認証の種類のリストを,区切りで"で囲んで指定します。認証の種類にはauthauth-intがあります。authは通常の認証を表し、auth-intは完全性のチェックを伴う認証を表します。認証の種類に応じてハッシュ値の計算方法が変わります。

Digest認証のクレデンシャルを指定するにはDigest、1文字の空白、パラメータを順番に記述します。

パラメータを指定するには名称、=、値を順番に記述します。また、パラメータが複数存在する場合には,で区切ります。

パラメータには下のようなものがあります。

  • username・・・ユーザ名を"で囲んで指定します。
  • realm・・・認証の識別子を"で囲んで指定します。
  • nonce・・・チャレンジのnonceパラメータと同じです。
  • uri・・・クレデンシャルを含むHTTPリクエストのリクエストターゲットを指定します。
  • response・・・ハッシュ値を16進文字列として"で囲んで指定します。
  • algorithm・・・チャレンジのalgorithmパラメータと同じです。
  • opaque・・・チャレンジのopaqueパラメータと同じです。
  • qop・・・認証の種類を指定します。authauth-intを指定します。
  • cnonce・・・nonceパラメータとは別のナンスを"で囲んで指定します。
  • nc・・・nonceパラメータのナンスを使用したHTTPリクエストが何回目のものであるかを8桁の16進数として指定します。

responseパラメータのハッシュ値は下のように計算します。

まず、algorithmパラメータの値がmd5である場合にはユーザ名とrealmパラメータの認証の識別子とパスワードを順番に:で結合したもののMD5ハッシュ値を計算します。md5-sessである場合にはこのMD5ハッシュ値とnonceパラメータのナンスとcnonceパラメータのナンスを順番に:で結合したもののMD5ハッシュ値を計算します。

そして、qopパラメータの値がauthである場合には上のMD5ハッシュ値とnonceパラメータのナンスとncパラメータの回数とcnonceパラメータのナンスとqopパラメータの認証の種類とクレデンシャルを含むHTTPリクエストのメソッドとリクエストターゲットを順番に:で結合したもののMD5ハッシュ値がresponseパラメータのハッシュ値となります。qopパラメータの値がauth-intである場合には上のMD5ハッシュ値とnonceパラメータのナンスとncパラメータの回数とcnonceパラメータのナンスとqopパラメータの認証の種類とクレデンシャルを含むHTTPリクエストのメソッドとリクエストターゲットとボディのMD5ハッシュ値を順番に:で結合したもののMD5ハッシュ値がresponseパラメータのハッシュ値となります。

Authentication-Infoヘッダフィールド

Digest認証の場合、サーバは認証に成功した場合にはAuthentication-Infoヘッダフィールドの値に認証の結果を指定したHTTPレスポンスを返信するようにします。

また、プロキシは認証に成功した場合にはProxy-Authentication-Infoヘッダフィールドの値に認証の結果を指定したHTTPレスポンスを返信するようにします。

認証の結果を指定するにはパラメータを記述します。

パラメータを指定するには名称、=、値を順番に記述します。また、パラメータが複数存在する場合には,で区切ります。

パラメータには下のようなものがあります。

  • nextnonce・・・以降のHTTPリクエストで使用すべきナンスを"で囲んで指定します。
  • qop・・・クレデンシャルのqopパラメータと同じです。
  • rspauth・・・ハッシュ値を16進文字列として"で囲んで指定します。
  • cnonce・・・クレデンシャルのcnonceパラメータと同じです。
  • nc・・・クレデンシャルのncパラメータと同じです。

rspauthパラメータのハッシュ値はクレデンシャルのresponseパラメータのハッシュ値とほぼ同じように計算しますが、HTTPリクエストのメソッドは使用しません。また、HTTPリクエストのボディのMD5ハッシュ値の代わりにHTTPレスポンスのボディのMD5ハッシュ値を使用します。

使用できる文字

チャレンジやクレデンシャルのパラメータの値にはヘッダフィールドの名称に使用できる文字しか使用することができません。

ただし、空白と水平タブと下の文字に関しては値全体を"で囲むことによって使用することができます。

  • (
  • )
  • ,
  • /
  • :
  • ;
  • <
  • =
  • >
  • ?
  • @
  • [
  • ]
  • {
  • }
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-http, web