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
このやり取りのパケットのうち、HTTPヘッダ部はWebブラウザの開発者ツールでも確認できる。

〇クライアントがセッションIDをサーバーに送信する

クライアントはサーバーにリクエストするたびにCookieをサーバーに送信する。
サーバーはCookie中のセッションIDからこのクライアントに紐づくセッションオブジェクトを探す。
図 クライアントのリクエストのcookieで送信
このやり取りのHTTPヘッダ部もWebブラウザの開発者ツールで確認できる。

セッションハイジャック

他人のセッションを横取りする攻撃の名前。
他人のセッション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を送信することを防ぐための仕組み。

次回は

テストします。






このブログの人気の投稿

1月12日(金)1、2コマ目

1月29日(月)3、4コマ目

1月9日(火)1、2コマ目