その時々

その時々で違うんです。特に決まっていないんです。

(ASP.NET)SessionとViewStateの違い

Session

ASP.NETのページを記述したaspxファイルの実行を終えて、レスポンスとして送信されるWebページが完成してしまえば、実行時の状態(変数の値)はすべて破棄されてしまうのが基本だが、Sessionプロパティに格納された値だけは別だ。ここに格納された値はレスポンスを生成し終えた後もサーバ上に保存され、次回ポストバックされたときに再び参照できるようになる。もちろん、Sessionプロパティに直接格納された値だけでなく、そのプロパティから参照されている値も破棄されずに保存される。

Sessionプロパティに格納された値は、セッションが終了するか、タイムアウトするか、明示的に削除されるまで、何度ラウンド・トリップしても破棄されることはない。

ViewState


クライアント・サイドに保存する方法には、ビューステートとクッキーがある。どちらも、サーバ・リソースを消費しないというメリットや、ラウンド・トリップにかかるコストやセキュリティ面でのデメリットは共通である。しかし、クッキーには最大でも4KBytes〜8KBytes程度の少量のデータしか保存できない上、文字列しか保存できず、さらにクライアント環境によっては受信拒否されてしまう可能性もある。クライアント・サイドに保存するのであれば、永続的にクッキーに保存する場合を除けば、ビューステートを選択した方が適している場合が多いだろう。


SessionとViewStateの違い
・Sessionはサーバで保存され、ViewStateはクライアント側で保存(HTMLに埋め込まれる)される。
・Sessionのほうがセキュリティは高い
・Sessionにはどんなオブジェクトも保存できるが、ViewStateには規程がある

ViewStateのセキュリティ


ビューステートに保存された値は、以下のようなフォームの隠しフィールドとして出力されると述べた。

 これを見るだけでは、どんな情報が記録されているか分からないが、実は暗号化されているわけではなく、base64エンコードされているにすぎないので、デコードすれば、以下のような文字列が現れる。値とそのデータ型が羅列されていることが想像できるだろう。このように、ビューステートに格納された値は、ごく簡単な処理で見られてしまうので、パスワードやクレジットカード番号のように、見られては困る情報を格納してはならない。

t<-1060400520;t;l;>>;l;>;l;>;l<
t;l<1;>>;>;;>;>>;>>;>S…
 それでは、この文字列を書き換えて、再びbase64エンコードすれば、簡単にビューステートの値を詐称してポストバックできてしまうのかといえば、そんなことはない。ビューステートの末尾には、ビューステート値のハッシュコード(デフォルトではSHA1によるもの)が追加され、耐タンパー性が高められているからだ。ポストバックされたビューステート値とハッシュコードが一致しなければ、ビューステート値はすべて破棄される。もっとも、ハッシュコードも含めて改ざんされてしまえば意味がないので、ビューステートには改ざんされても致命的な影響のないデータを保存するにとどめ、大切なデータは Sessionプロパティに格納して、サーバから外に出さないようにすべきだ。


参考URL: http://www.atmarkit.co.jp/fdotnet/aspnet/aspnet15/aspnet15_01.html