ぼちぼちクラウド

クラウド系SEのぼちぼち技術ブログ

【読書記録】Webを支える技術 第3部③

第9章 HTTPヘッダ

HTTPヘッダの意義

  • ヘッダにはメッセージのメタデータが設定されている
  • クライアントやサーバはヘッダを見てメッセージに対する挙動を決定する
  • 認証やキャッシュの機能は、ヘッダをメソッドやステータスコードと組み合わせて実現されている

HTTPヘッダの歴史

メールと共通しているヘッダがある
  • Content-Type、Dateなど
  • HTTPヘッダの仕様は電子メールのメッセージ仕様をもとに定義されたため
  • メールとHTTPで異なる点は、HTTPは双方向通信・メールは単一方向の通信であること
  • そのため、HTTPでは電子メールにはないヘッダも存在する

日時ヘッダ

  • 例:Date、Expires
  • GMT形式で表現
  • 例) Date:Tue, 06 Jul 2010 03:21:05 GMT

MIMEメディアタイプ

  • リソースの表現の種類を指定
Content-Type
  • 例) Content-Type:application.xhtml+xml; charset=utf-8
  • 「application/xhtml+xml」がメディアタイプ
    • タイプ:application(画像、音声、映像、テキスト以外)
    • サブタイプ:xhtml+xmlXMLであることを示す)
  • charsetパラメータは、XHTML文書をUTF-8エンコードしていることを示す

言語指定ヘッダ

  • Content-Languageの値は「言語タグ」と呼ばれる
  • 例)Content-Language; ja-JP

コンテントネゴシエーション

クライアントとサーバが交渉してメディアタイプや文字エンコード、言語タグを決めることもできる
  • Acceptヘッダ
  • Accept-Charsetヘッダ
  • Accept-Languageヘッダ

Content-Length

  • メッセージにボディがある場合、そのサイズを10進数のバイトで示す
  • 例)Content-Length:5538

チャンク転送

  • 動的に画像を生成するようなWebサービスの場合、ファイルサイズが決まる前からレスポンスを少しずつ転送できる
  • 例) Transfer-Encoding: chunked

認証

Basic認証
  • ユーザ名とパスワードによる認証方式
  • ユーザ名とパスワードを「:」で連結しBase64エンコード(※)した文字列をAuthorizationヘッダに設定
  • ※データを64種類の文字列で表現するエンコーディング方式
  • HTTPSで通信路上での暗号化を推奨
Digest認証
  • メッセージにハッシュ関数を適用した結果のハッシュ値を用いる
  • 認証情報なしでまずリクエストを送信し、返ってきたチャレンジを使って次回のリクエストを組み立てる
  • 認証に必要な情報が得られたら、ユーザ名とパスワードを使ってダイジェストを生成する
  • クライアント側の操作が煩雑なためあまり普及していない
WSSE認証
  • HTTP1.1では標準外。AtomPubなどのWebAPIの認証に使われる
  • パスワードそのものをNW上に流す必要がなく、Digest認証ほど手間がかからない
  • ただしサーバ側では生のパスワードを保存しておく必要がある
補足:OAuth
  • Webサービス間でデータをやり取りできるようにするための仕様(認可の移譲)

キャッシュ

  • サーバから取得したリソースをクライアントのローカルに蓄積し再利用
ヘッダに持つ情報
  • キャッシュ可能かどうか(Pragma)
  • 有効期限(Expires)
  • 詳細なキャッシュ方法(Cache-Control):上記2点のヘッダの機能を代用可能
ETag
  • キャッシュされたリソースにはエンティティタグ(ETagヘッダ)の情報を持つ
  • リソースの更新状態を比較するために使用する(更新すると値が変わる)

持続的接続

  • HTTP1.0ではクライアントが確立したTCPコネクションをレスポンス返却のたびに切断していた
  • HTTP1.1では接続し続ける仕様となった
  • レスポンスを待たずに同じサーバにリクエストを送信できる(パイプライン化)ため、より効率的にメッセージを処理できる
  • 切断する場合は、リクエストのConnectionヘッダにcloseという値を指定する