無線通信×セキュリティ

Security/Radio/IoT/Mobile/Network

セッションハイジャック?!セッション管理方法

セッションとはなんぞや?

HTTP通信において、ユーザ管理的なことはどうやっているだろうかと、前々から疑問ではあったのですが、何も知らずにここまできてしまったために、一苦労しました。ということで、一から勉強しました。

HTTPではユーザ管理というより、セッションという概念で管理を行うようです。あるサイトにログインしたら、サイトからセッションIDを付与してもらい、そのIDを使ってアクセスすることで、特定のユーザーを認識する仕組みをとっているようです。

セッション管理には以下2つの仕組みが使われているようです。

  • URLリライティング
  • Cookie

URLリライティング 

 ここはちょいとまだ勉強不足なので後日追記します。

基本的にはURLにセッションIDを載せて管理する方法です。

http://xxxx.jp/index.php?session_id=123456

ってな感じで。ただ、この場合、このsession_idが予測可能なものだったりすると、簡単に攻撃者に推測されてセッションを乗っ取られる可能性があります。それをセッションハイジャックと呼びます。 

Cookieについて

 URLにセッションIDを載せちゃうのは宜しくない、ということでCookieを使いましょうと。cookieというのは、HTTPにおいてWebブラウザとWebサーバ間で状態を管理するプロトコル、またはそこで用いられるWebブラウザ上に保存された情報のこと。by HTTP cookie - Wikipedia

Cookieを用いたセッション管理の流れ

以下のような流れでcookieの設定、使用がなされます。

  1.  ユーザーがブラウザを通してWebサイトにアクセスする。(HTTP GET)
  2. Webサーバーがサイトの情報を返送する。(200OK + set-cookie:session_id=12345)
    ここでブラウザにCookieの情報が設定されます。
  3. 再度Webサイトにアクセスする。(HTTP GET+cookie:session_id=12345)
    2で設定されたCookieの情報を用いてアクセスすることで、Webサーバー側がどのユーザがアクセスしてきたか判断できます。

この仕組みを使うことで、ユーザーの識別を行うことができ、cookie情報が生きている間は、再度ログインをすることなしに、アクセスすることが可能になります。

Cookieのオプション

しかしながら、このままでは先ほどのURLリライティングと同じように、Cookieないに記載されたsession_idが推測可能な値だったりした場合、このsession_idを偽装してセッションを乗っ取ることが可能になります。(セッションハイジャック)

それでは宜しくないので、Cookieには対策が施されています。

1つは有効期限の設定です。set-cookieで値を渡す時に、有効期限を設定できるオプションがあります。それがexpiresです。以下のように値を入れることで設定が可能です。

 set-cookie:session_id=12345;expires=Mon, 14 Aug 2017 15:28:30 GMT;

こうすることで、session_idの値の有効期限を定めることで、危険にさらされる時間が有限となり、リスクを低減することができます。

2つ目はHTTPS通信時にしかcookieのやり取りはしないよ設定です。これも同様にset-cookieで値を渡す時にセキュア設定というオプションを付与することで可能になります。

 set-cookie:session_id=12345;secure;

 このように指定した場合、cookieを使用するのはHTTPS通信を使用している時のみとなります。HTTPS通信では通信の内容は暗号化されますので、cookieの情報も見れなくなります。そのため、より安全なセッション管理を行うことが可能となります。

 

これでようやくWebアプリケーションの仕組みがなんとなく理解できた気がする。。。