第5章 暴露対策
プロキシキャッシュ対策

プロキシキャッシュへのコンテンツ残留

ブラウザとWebサーバの間には、いくつかのキャッシュメカニズムが働いていることが多い。

  1. プロキシサーバのキャッシュ──企業等LANを運用している多くの組織体ではLANからインターネットアクセスを行う際プロキシサーバを経由して行うことが多い
  2. キャッシュサーバ─インターネットプロバイダの中には、会員のWebアクセスを円滑にする目的でキャッシュサーバを運用しているところがある

これらのキャッシュメカニズムは、ブラウザからのリクエストによって得られたコンテンツをキャッシュに保持しておき、同じURLのリクエストが生じたとき、本来のWebサーバにコンテンツを取りに行かず、キャッシュの内容をブラウザに渡すものである。
このようにキャッシュは、円滑なインターネットの利用に寄与してくれる。

しかし、コンテンツによっては、ただひとりのユーザのみが呼び出せるものでなければならない場合がある。
もしも誰かのプライベートなコンテンツがキャッシュに記録されていて、それを他人が呼び出すことができれば情報漏えい問題になる。

キャッシュによる情報漏えい問題
図5-5: キャッシュによる情報漏えい問題

プロキシキャッシュ対策

HTTP/1.1 にはこの問題に対処するための Cache-Control ヘッダが用意されている。次のような Cache-Control ヘッダをHTTPレスポンスに記述することによって、Webアプリケーションからブラウザに送るコンテンツが、途中の経路上でむやみにキャッシュに記録されたり再利用されたりしないように、プロキシサーバやキャッシュサーバに指示するというものである。

  1. Cache-Control: private
    Webサーバから返されるコンテンツがただ一人のユーザのためのものであることを示す。このコンテンツは、複数のユーザが共有されるキャッシュに記録されるべきではないことを表している。ただし、これは、一人のユーザのみが利用するキャッシュ(ブラウザのキャッシュ等)への記録を禁じるものではない。Cache-Control: private のみが指定されている場合、何らかのキャッシュへの記録が行われるおそれがある。
  2. Cache-Control: no-store
    このヘッダは、Webサーバから返されてくるコンテンツをキャッシュに記録するな、という指示である。
  3. Cache-Control: no-cache
    一見「キャッシュを使うな」のように見えるこのヘッダが実際に意味するところは少々ニュアンスが異なる。このヘッダの意味は、いちどキャッシュに記録されたコンテンツは、現在でも有効か否かを本来のWebサーバに問い合わせて確認がとれない限り再利用してはならない、という意味である。
  4. Cache-Control: must-revalidate
    このヘッダは、キャッシュに記録されているコンテンツが現在も有効であるか否かをWebサーバに必ず問い合わせよ、という指示である。

これらのヘッダを適宜取捨選択して使用することになるが、これらをすべて指定して次のようにしても構わない。

  Cache-Control: private, no-store, no-cache, must-revalidate

HTTP/1.0 の考慮

Webサーバとブラウザの通信経路上に存在するプロキシサーバやキャッシュサーバをすべてWebサーバ側で把握することは困難である。場合によっては、古い設備が存在し、HTTP/1.1 の Cache-Control ヘッダを解さないプロキシが存在するかもしれない。

このような心配のある場合は次のヘッダをHTTPレスポンスに含めると、相手のプロキシが対応してくれる場合もある。

  Pragma: no-cache

ただし、この方法が常に有効であるという保証はない。