読書研修ーWebを支える技術　第９章HTTPヘッダ

## 日時を持つへッダ	
例：`Date: Tue, 06 Jul 2010 03:21:05 GMT`
| 利用するメッセージ | へッダ | 意味 |
|:-:|:-:|:-:|
| リクエストとレスポンス  | Date  |  メッセージを生成した日時 |
| リクエスト	| If-Modified-Since  | 条件付きGETでリソースの更新日時を指定するときに利用する  |
| リクエスト  |  If-Unmodified-Since |  条件付きPUTや条件付きDELETEでリソースの更新日時を指定するときに利用する |
|  レスポンス |  Expires |  レスポンスをキャッシュできる期限 |
| レスポンス  |  Last-Modified | リソースを最後に更新した日時  |
|  レスポンス |  Retry-After | 再度リクエストを送信できるようになる日時の目安  |
			 								
## MIMEメディアタイプ

#### Content-Typeーーメディアタイプ指定する
XHTMLメディアタイプ：`Content-Type:application/xhtml+xml;charset=utf-8`
application/xhtml+xmlがメディアタイプです。「/」の左側を「タイプ」(Type)と呼び、右側を「サプタイプ」(Subtype)と呼ぶ。
表
| タイプ | 意味 |例|
|:-:|:-:|:-:|
| text  |  人が読んで直接理解できるテキスト | text/plain  |
| image | 画像データ | image/jpeg  |
| audio  | 音声データ  | audio/mpeg  |
|  video | 映像データ  | video/mp4  |
| application  | そのほかのデータ  | application/pdf	  |
|  multipart | 複数のデ-タからなる複合データ  |  multipart/related |
|  message	 | 電子メールメッセージ	  | message/rfc822  |
|  model | 複数次元で構成するモデルデータ  |  model/vrml |
|  example | 例示用  |  example/foo-bar |
#### charsetパラメーターー文字エンコーディング指定する
メディアタイプはcharsetパラメータを持てます。先の XHTMLの例では charset=utf-8として、このXHTML文書をUTF-8でエンコードしていることを示しています。charsetパラメータは省略可能なのですが、タイプがtextの場合は必ずcharsetパラメータをつけるようにする。
## 言語タグ
Content-Languageへッダの値は「言語タグ」(Language Tag)と呼ばれる文字列です。
`Content-Language:ja-JP`
言語タグのГ-」の左側にはISO639定義する言語コードが入り,日本語ならば「jа」、英語ならば「en」です。
「-」の右側にはISO3166が定義する地域コードが入ります。たとえば日本:「JPJ、アメリカ:「US」、イギリス:「GB」です。
## コンテントネゴシエーション
メディアタイプや文字エンコーディング、言語タグは、サーバが一方的に決定するだけではなく、クライアントと交渉(ネゴシエーション)して決めることもできます。この手法を「コンテントネゴシエーション」(Content Negotiation)と呼ぶ。

#### Accept -- 処理できるメディアタイプを伝える
`Accept:text/html,application/xhtml+xmlapplication/xml;q=0.9,*/*;q=0.8`
q=というパラメ-タの値を「qvalue」と呼び、そのメディアタイプの優先順位を示します。qvalueは小数点以下三桁以内の0~1までの数値で、数值が大きいほうを優先します。

#### Accept-Charset - 処理できる文字エンコーディングを伝える
`Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7`

#### Accept-Language-- 処理できる言語を伝える
`Accept-Language: ja,en-us;q=0.7,en;q=0.3`


## Content−Length　とチャンク転送
#### Content−Lengthーーボディの長さ指定する
`Content-Length:5538`
静的なフアイルなど 、Content-Lengthへッダを利用して、そのサイズを10進数のバイトで示す


#### チャンク転送ーーボディを分割して転送する
動的に画像を生成するようなWebサービスの場合、フアイルサイズが決まるまでレスポンスを返せないのでは応答性能が低下してしまいます。
`Transfer-Encoding: chunked`
Transfer-Encodingへッダにchunkedを指定する注10と、最終的なサイズがわからないボディを少しずつ転送できるようになります。

## 認証
#### Basic認証
Basic認証はユーザ名とパスワードによる認証方式です。ユーザ名とパスワードはAuthorizationへッダに入れてリクエストごとに送信

#### Digest認証
Digest認証のダイジエストとはメッセージダイジエストの略で、あるメッセージに対してハッシュ関数を適用した結果のハッシュ値のことです。
HTTPSは、HTTPと SSU/TLSを組み合わせた通信の終称です。通信路を暗号化してクライアントとサ-バの間でやりとりするデ-タを保護し、盗聴を防く目的で主に利用する

<strong>SSL/TLSの3つの機能</strong>
* 暗号化：共通鍵暗号に基づく暗号化機能
* 認証：公開鍵証明書に基づく認証機能
* 改さん検知：ハッシュ用共通鍵に基づく改さん検知機能

HTTPSで通信する場合のURIはhttpsスキームを使い、HTTPSのデフオルトポ-ト番号は443番です。

<strong>チャレンジ</strong>
Basic認証に比べて WWW-Authenticateへッダの値か複雑になってWWW-Authenticateへッダの値を「チャレンジ」(Challenge)と呼ぶ
nonce:リクエストごとに変化する文字列。
qop：保証の品質　「auth」や「auth-inti」
<strong>ダイジェストの生成と送信</strong>
<strong>ダイジェストの生成</strong>
①ユーザ名、realm、パスワ-ドを「:」で連結し、MD5(Message Digest Algorithm5)注14ハッシュ値を求める
②メソッドとURIのパスを「:」で連結し、MD5 ハッシュ値を求める
③①の値、サーバから得たnonce、クライアントがnonceを送った回数(例:00000001)、クライアントが生成したnonce(cnonce)、qopの値、の値を「:]で連結し、MD5 ハッシュ値を求める
<strong>ダイジェストの送信</strong>
クライアントは、生成したダイジエスト値をresponseというフィ-ルドに入れて、リクエストを送信して、認証か通り削除が成功すると200 0Kが返る。
| 利点|欠点 |
|:-|:-|
| パスワードを盗まれる危険性はない。サーバ上にパスワードのハッシュ值な保管しておけばよいので、パスワードそのものをサーバに預けなくてもよい |  １．パスワードを暗号化するだけなので、メッセージ自体は平文でネットワーク上にある 。メッセージを暗号化したい場合は、クライアントからしてみると操作が煩雑だ。<br>２．ApacheなどのWebサーバではDigest認証がオプション扱いのため、ホスティングサービスではサポートしていない可能性もある|

#### WSSE認証
AtomPubなどのWebAPIの認証に使われてWSSEは「WS-SecurityExtension」の略です。
Basic認証とDigest認証の中間に位置する。
WSSE認証でも、クライアントはまず認証情報なしでリクエストを送信し、サ-バから401 Unauthorizedレスポンスを受け取る。
```
リクエスト
DELETE /test HTTP/1.1 
Host:example.jp
レスポンス
HTTP/1.1 401 Unauthorized
WWW-Authenticate: WSSE realm="Example.jp"，profile="UsernameToken"
```
profleの値は現時点ではUsernameTokenだけが用意され、クライアントは、パスワードと自分で用意したnonce と日時を連結した文字列に対してSHA-1ハッシュ値を求め、結果をBase64エンコードします。この値を「パスフードダイジエスト」と呼びます。
クライアントは、Authorizationへッダに「WSSE」と「profile="Username Token”」を指定し、X-WSSE 拡張へッダにパスフードダイジエストやnonce、日時情報を入れてリクエストを送信します。

## キャッシュ
### キャッシュ用ヘッダ
|  | Pragma |  Expires | Cache-Control |
|:-|:-|:-|:-|
|  意味 |  キャッシュを抑制する | キャッシュの有効期限を示す  | 詳細なキャッシュ方法を指定する  |
| 使い分け  |  キャッシュをさせない場合、Cache-Controlのno-cacheと同時に指定 | キャッシュの有効期限が明確に決まってる  |   キャッシュの有効期限を相対的に指定したい場合、Cache-Control のmax-ageで相対時間を指定|


### 条件付きGET
|  | If-Modified-Since | If-None-Match |
|:-:|:-:|:-:|
|  意味 |  リソースの更新日時を条件にする |  リソースのETagを条件にする |
|   |   |   |
|  使い分け | ETagヘッダがなくLast-Modifiedヘッダしかわからない場合 | クライアントから、サーバがETagヘッダを出している場合（サーバ側を実装する場合はキャッシュ可能なリソースにはできるだけETagヘッダを利用） |


## ほかのヘッダ
|  | Content-Disposition | Slug |
|:-:|:-|:-|
|  意味 |  ファイル名を指定|  ファイル名のヒントを指定|
|  何のため |  サーバがクライアントに対してそのリソースのファイル名を提示するために利用するレスポンスヘッダ。<br>filenameパラメータでファイル名を指定 | クライアントがAtomのエントリをPOSTする際に新しく生成するリソースのURIのヒント文字列をサーバに提示  |
|  例 |  Content-Disposition:attachment;filename="rest.txt"|  Slug: %E3%83%86%E3%82%B9|