セッション管理とは
4

セッションってそもそも何でしたっけ? 
TCPのコネクションとの違いも教えて下さい
TCPのコネクションは3wayハンドシェークが行われる一連の通信。一方のセッションという言葉は、あいまいな言葉である。かなり乱暴ではあるが、買い物サイトにログインした情報と考えてほしい。
 一つのセッションに複数のTCPコネクションが作成されることになるだろう。
2

なぜセッション管理が必要なんですか?
Webサイトでショッピングをする際に、ログインすることが多い。ログインした情報を持っておけば、買い物がスムーズに行える。たとえば、購入履歴のページでは、ログインIDをもとに表示できる。発送の段階ではログインIDをもとに住所を表示できる。
このように、Webページをまたがって一連の処理をするときに、セッション管理が求められる。
参考であるが、IPAの文献には以下の記載がある。
電子商取引サイトのようにWebサーバーにユーザがログインしてからログアウトするまで、ログイン情報を保持したままページを移管するには、このままでは問題がある。そこで、クライアントとサーバー間でその情報を保持し、アクセス制御を一つの集合体として管理する仕組みが必要となる。この仕組みをセッション管理と呼んでいる。
http://www.ipa.go.jp/security/awareness/administrator/secure-web/chap6/6_session-1.html

セッションIDの管理方法
大きく以下の3つがある。
クッキー(Cookie)
たとえば、Gmailにログインすると、クライアントのブラウザに、以下のようなCookieが作成される。
NAME GX
VALUE xxxx(長いので省略)
DOMAIN mail.google.com
PATH /mail
EXPIRES 2013/07/01 6:05:36

URLリライティング
クエリストリングで、SID(セッションID)をURLに埋め込むのだ。
URLに sid=xxx などと直接書くのだ。
http://~xxx.com/aa.aspx?sid=xxx
当然ながら、セッションIDが見えているわけだから、セッションハイジャックなどの攻撃にあいやすくなる。
情報セキュリティスペシャリスト試験を目指す女性SE 

でも、他の管理方法だって、HTTPSで暗号化されていないのであれば、キャプチャすれば見えてしまうと思います。セキュリティレベルは同じでは?



URLに含まれているかどうかは、一つのポイントだと思う。
IPAのセキュアプログラミグ講座にも「URLリライティングの方式では、URLの一部にセッションIDが含まれているため、キャッシュ、ログ、Referer:ヘッダ等を通じて第三者にその値が漏えいするおそれがある」(https://www.ipa.go.jp/security/awareness/vendor/programmingv2/web.html)とあります。

hiddenフィールド
hidden(隠された)という言葉の通り、HTMLのソースの中に、表からは見えないように埋め込む。
formタグの場合、以下のように埋め込んで、次のページに渡すことができる。
<input type="hidden" name="sid" value="123">
とはいえ、ソースを開けば見えてしまうし、改ざんも可能。セキュリティ面で優れるとはいいにくい。
それに、プログラミングにて、常にhiddenのフィールドを書く必要があり、かなり手間だ。

今のところ、①のCookieによるsession管理が主流だ。
以下は、上記の3つを図にしてみた。
素材3_3_セッションの管理方法


IPAの「『セキュア・プログラミング講座 (Webアプリケーション編)』 ブートアップセミナー」(http://www.ipa.go.jp/files/000030878.pdf)では、セッションIDを運ぶ手段が、以下の図のように1枚で整理されています。3つの内容は同じです。
Cookie

分類の仕方は考え方によるところがあるので、これは一例と思ってください。
上記のIPAの文献では、考え方は同じだが、2つに分類している。
2) セッション管理
セッション管理を実現するには、一般には以下のような方法が利用される。
ア) Cookieを利用
Webサーバー側で発行されたセッションIDをクライアントのCookieに持たせることで、特定ユーザの識別を行う。
イ) hiddenフィールドを利用
入力フォームをWebサーバーに送信する際に利用するFORMタグのhiddenフィールドにセッションIDを持たせることで、セッション管理を実施する。Cookieを使用できない場合に、利用されることが多い。
③のhiddenフィールドも、GETメソッドを使えば②のようにURLに記載される。