1月19日(金)1、2コマ目
今日、やったこと
Webアプリケーションのセキュリティ
今日のホワイトボード
セッションオブジェクト
セッションオブジェクトはサーバー側でクライアント毎に用意する。
クライアントとセッションオブジェクトを紐づけるためにセッションIDが使われる。
![]() |
| 図 セッションオブジェクトとセッションID |
Cookie
CookieはWebブラウザがデータを保存する仕組み。Webアプリケーションでクライアント側にデータを保存する際に利用する。
〇Cookieをセットする
Cookieはサーバーのset-cookieでデータ保存。
![]() |
| 図 サーバーがCookieをセット |
〇Cookieを送信する
Webブラウザはサーバーにリクエストを送信する際にCookieも送信する。
![]() |
| 図 クライアントがCookieを送信 |
〇セッションIDをクライアントに保存する
セッションオブジェクトを識別するにはクライアント側でもセッションIDを保存する必要がある。ここでCookieが使われる。
クライアントがサーバーにリクエストするとレスポンスでset-cookieを使ってセッションIDをクライアントに保存させる。
![]() |
| 図 サーバーからのレスポンスでset-cookie |
〇クライアントがセッションIDをサーバーに送信する
クライアントはサーバーにリクエストするたびにCookieをサーバーに送信する。
サーバーはCookie中のセッションIDからこのクライアントに紐づくセッションオブジェクトを探す。
![]() |
| 図 クライアントのリクエストのcookieで送信 |
セッションハイジャック
他人のセッションを横取りする攻撃の名前。
他人のセッションIDを取得(盗聴やブラウザのツールなど)し、自分のブラウザのCookieにセットすればセッションを横取りできる。
![]() |
| 図 セッションハイジャック |
Cookieはサイトごとに用意される
同じブラウザで複数のサイトにアクセスすると、複数のCookieが保存される。
サイトAからセットされたCookieはサイトAにアクセスするときに送信する。別のサイト(サイトB、サイトC)にアクセスする際にはサイトAのCookieは送信しない。
![]() |
| 図 送信元のCookieしか送信しない |
どのCookieを送信するか?
〇Domain属性、Path属性
WebブラウザはどのCookieを送信するかは、リクエストURLとCookieのDomain属性、Path属性が一致すれば送信する。
Domain属性は後方一致(後ろから前へ比較)、Path属性は前方一致(前から後ろへ比較)で決定する。
![]() |
| 図 Domain属性、Path属性で送信する、しないが決まる |
〇secure属性、httpOnly属性
Cookieにsecure属性があれば、httpsでの通信時のみ送信。(httpsは通信を暗号化、httpは平文で通信)
httpOnly属性があれば、JavaScriptがCookieにアクセスすることを拒否する。
![]() |
| 図 secure属性、httpOnly属性 |
サードパーティーCookie
リクエストしたサイトから送られたCookieはファーストパーティーCookie。
Webページ中の公告のようにリクエストしたページとは関係ないサイトから送信されたCookieがサードパーティーCookie。
![]() |
| 図 サードパーティーCookie |
今どきのWebブラウザはサードパーティーCookieを廃止する方向。
同一オリジンポリシー
Webブラウザが、ダウンロード元(Webブラウザのアドレス欄に表示されるURL)と異なるサイト(クロスオリジン)へのアクセスをコントロールする仕組み。
今どきのWebシステム
サービスを提供するサーバーがフロントエンドとバックエンドで異なるケースが多い。
フロントエンドサービス提供サーバーからダウンロードしたHTML、JavaScriptがバックエンドサービス提供サーバーにアクセスするのはクロスオリジンへのアクセス。
このアクセスは同一オリジンポリシーにて拒否される。
![]() |
| 図 今どきのWebシステムはクロスドメインのアクセスが発生する |
しかしながら、これでは困る。
CORSで解決
そこで、クロスオリジンなアクセスができるように同一オリジンポリシーに抜け穴を作る仕組みがCORS(Cross Origin Resource Sharing)。
![]() |
| 図 CORSでクロスオリジンなアクセスを許可する |
プリフライトリクエスト
同一オリジンポリシーではクロスオリジンへのリクエストは許可している。拒否するのはレスポンスの受け取り。
場合によってはリクエストも危険な場合がある。(データを更新するようなリクエスト)
そこで、リクエストの前にリクエストを送っても大丈夫かチェックするのがプリフライトリクエスト。
CSRF
クロスサイトリクエストフォージェリ―(Cross Site Request Forgery)。
意図しないリクエストを強制する攻撃手法の名前。
Amazonにログイン済み=>Cookieあり
悪意のあるサイトにアクセス=><form>でAmazonに誤発注するようになっている
悪意のあるサイトのボタンクリック=>Amazonに誤発注リクエスト、このときCookieも送信
Amazonは送信されたCookieからログイン済みユーザーとして認識し、発注を受け付ける。
CookieのSameSite属性
わりと最近追加された仕様。
CSRFのように意図せずCookieを送信することを防ぐための仕組み。
次回は
テストします。











