HTTPの基本の基本3
HTTPヘッダについて
HTTPヘッダの役割
ヘッダの重要性
- メタデータの表現
- リソースへのアクセス権を設定する認証
- クライアントとサーバの通信回数を減らすキャッシュの機能
メッセージのボディに対する付加的な情報、いわゆるメタデータを表現する役割を果たす。 クライアントやサーバはヘッダを見てメッセージに対する挙動を決定する。
ヘッダの中身
- 日時 値に日時を持つヘッダ。
Date: Tue, 06 Jul 2010 03:21:05 GMT
- MIMEメディアタイプ
メッセージでやりとりするリソースの表現の種類を指定する。- Content-Type(メディアタイプを指定する)
Content-Type: application/xhtml+xml; charset=utf-8
text, image, audio, video, application(その他のデータ)などを指定する。
- charsetパラメータ 文字エンコーディングを指定する。
Content-Type: application/xml; charset=utf-8
上記のようにメディアタイプとcharsetパラメータを指定する記述が推奨される。
- 言語タグ(Language Tag)
Content-Language; ja-JP
- コンテントネゴシエーション
- Accept(処理できるメディアタイプを指定)
- Accept-Charset(処理できる文字エンコーディングを指定)
- Accept-Language(処理できる言語を指定)
メディアタイプや文字のエンコーディング、言語タグをサーバーが一方的に決定するだけでなく。クライアントと交渉して決定することも可能。
Accept: application/xml, application/msword;q = 0.9 #メディアタイプを指定
Content-Lengthとチャンク転送
- Content-Length(ボディの長さを指定する)
- チャンク転送(ボディを分割して転送する)
Content-Length: 5538
動的に画像を生成するようなWebサービスの場合など、ファイルサイズが決定されるまでレスポンスが返せないので応答性能が低下する。 そのようなケースでは、Transfer-Encodingヘッダを用いると最終的なサイズがわからないボディを少しずつ転送できる。
Transfer-Encoding: chunked
ユーザのアクセス認証について
HTTP認証方式には、主にBasic認証とDigest認証がある。
- Basic認証:ユーザ名とパスワードによる認証方式。
ユーザ名とパスワードをAuthorizationヘッダでリクエストごとに送信する。ユーザ名とパスワードが平文でネットワーク上を流れるため、HTTPS通信などの検討が必要となる 。
- Digest認証:Basic認証よりもセキュアな認証方式。
Digestとはメッセージダイジェストの略で、あるメッセージに対してハッシュ関数を適用したハッシュ値のこと。
流れとしては、
メリット
- パスワードを盗まれる危険性がない
- サーバ上にハッシュ値のみを保管しておけば良いのでセキュリティリスクが低い
デメリット
- メッセージ自体が平文でネットワーク上に流れる(メッセージ自体を暗号化したければHTTPSを利用するべき)
- 毎回はじめに認証情報なしでリクエストを送信して、
401 Unauthorized
レスポンスを得なければいけない
キャッシュについて
HTTPの重要な機能の一つで、サーバから取得したリソースをローカルストレージに蓄積して再利用すること。
クライアントに蓄積したキャッシュは、そのキャッシュが有効な間、クライアントが再度リソースにアクセスしようとした時に 再利用する。
有効期限がいつまでなのかについては、以下の3種類のヘッダを用いてサーバが指定する。
- Pragma(キャッシュを抑制する)
- Expires(キャッシュの有効期限を示す)
- Cache-Control(詳細なキャッシュ方法を指定する)
Pragma: no-cache #リソースをキャッシュしてはならないことを示す Cache-Control: max-age: 86400 #86400秒、つまり24時間キャッシュが新鮮であることを示す
最後に
以上です!