HTTP認証について


HTTP認証

Basic認証

  • ユーザー名とパスワードを:で区切り, BASE64でエンコードした文字列をHTTPヘッダのAuthorizationに指定する.
  • 認証情報を平文で送るため盗聴される恐れがあるため, SSLにより通信を暗号化する等の対策が必要になる.

Base64

  • バイナリをテキストに置換する変換方式.
  • 英大文字, 英小文字, 数字,+ ,/の64文字が使用される.
  • 元データを6 bitずつに区切り, 整数値(0-63)を変換表に従って置換する. 6 bitに満たない場合は0でパディングする.
  • 変換表は以下の通り.
整数値 変換後文字
0-25 A-Z
26-51 a-z
52 +
53 /
  • byte単位でデータを扱うため,変換後の文字列は4文字単位の必要がある. 4文字に満たない場合は=でパディングする.

Digest認証

  • クライアントでユーザー名, パスワード, ランダムな文字列をMD5でハッシュ化し, サーバーに送信する. サーバー側でもハッシュ値を計算し, クライアントから送信されたハッシュ値と合致するかを検証する.
  • ハッシュ値を送信するため, パスワードを平文で送らないという点でBasic認証に比べて盗聴に耐性がある.

フロー

  1. クライアントは認証ページにアクセスする.
  2. サーバーは401を返し認証を要求する. その際にランダムな文字列であるnonceをレスポンスに含める.
  3. クライアントでユーザー名とパスワードを入力する.
  4. クライアントでランダムな文字列であるcnonceを生成し, ユーザー名, パスワード, nonce, cnonceをMD5でハッシュ化しサーバーに送信する.
  5. サーバーでもユーザー名, パスワード, nonce, cnonceをMD5でハッシュ化し, クライアントから送信された値と合致するか検証する.
  6. 成功した場合はコンテンツを返す.

参考