Cookie、Sessionの基本と3rd Party Cookieについて
ユーザーのログイン状態を保持する方法
まず初めにウェブアプリケーションでユーザーのログイン状態を保持する方法は以下のような仕組みを利用するものがあります。
CookieにSessionIDを保持する
サーバーが生成したSessionIDをCookieとしてブラウザに保存し、次回以降のリクエストでこのIDを送信してログイン状態を確認します。
トークンベース認証を利用する
JWTなどのトークンを使用して認証を行い、トークンをクライアント側で保存します。APIリクエスト時にこのトークンを送信します。
ローカルストレージを利用する
Webブラウザのローカルストレージにユーザー情報やトークンを保存し、必要に応じて取り出して使用します。
Cookieについて
ブラウザ(クライアント)に保存する小さなデータです。CookieはSessionとセットでよく解説されていることが多いですが、基本的な使用としてはCookieにはSessionIDが保持されており、サーバーとクライアント間で送受信されます。(リクエストとレスポンスのヘッダに載せます。)送受信の過程でSessionに格納されたデータの読み取りや更新を行なっていきます。
あるドメインから見て、自身のドメインと紐付いたCookieのことをファーストパーティクッキー
と言います。
たとえば、WEBサイトのドメインが「aaa.com」の場合、「aaa.com」から発行されるクッキーがファーストパーティクッキーとなります。
参照:https://successjp.salesforce.com/article/NAI-000777#temp:C:EcD1e6bcb6e571e48e8b8a47d11c
サーバーとクライアントで送受信されるCookieは設定にもよりますが、基本的にこのファーストパーティクッキー
を指すことが多いです。
Sessionについて
Sessionとはアプリケーションに対する一連の操作[1]の中で利用されるユーザーの情報を保存する仕組みです。この一連の操作に対して保持されたセッションはSessionIDで一意に区別されます。
Sessionはクライアント側に保持することもできますがセキュリティの観点やデータサイズの関係からサーバーサイドで管理・保存することが望ましいでしょう。
3rd Party Cookieについて
3rd party cookie(サードパーティクッキー
)とは、訪問しているあるウェブサイトとは異なるドメインによって発行されるクッキーです。通常、ウェブサイトにアクセスすると、そのサイト(ファーストパーティ)が自分のドメインでクッキーを作成しますが、3rd party cookieは、埋め込まれた広告や分析ツールなどの外部コンテンツ(サードパーティ)によって生成されます。
しかしサードパーティクッキー
はプライバシーの問題で注目されており、多くのブラウザがこれをブロックする方向に動いています。
Cookieの送受信について
クッキーはクライアントとサーバーの間で送受信されると書きました。
しかしこのサードパーティクッキーはファーストパーティのサーバーへ通常、送信されることはありません。
そして、サードパーティのウェブサイトからファーストパーティのサーバーへリクエスト(たとえばリダイレクト)が飛ばされてもブラウザで保持しているファーストパーティのCookieもサードパーティのCookieも送信されません。(CSRF対策
)
ファーストパーティークッキーは、リクエストが元のドメイン内で行われた場合にのみ送信され、他のサイトからのリクエストには含まれないのです。
しかし上記は通常のケースです。設定次第では他サイトからファーストパーティのサーバーへリクエストが飛ばされた場合でもクライアントに保持されているファーストパーティクッキーを送信することができます。
他サイトからファーストパーティクッキーを送る方法
-
SameSite=None
の設定-
SameSite=None
に設定されたクッキーは、クロスサイトリクエストでも送信されます。つまり、他のサイトから元のサーバーへのリクエストがあった場合、そのリクエストにファーストパーティークッキーが含まれます。
-
-
Secure
属性の必要-
SameSite=None
を設定する場合、クッキーにSecure
属性 が付与されていなければなりません。これは、クッキーが HTTPS 経由でのみ送信されることを意味します。Secure
が設定されていない場合、SameSite=None
のクッキーは無効となり、送信されません。
-
-
ブラウザのサポート
- 現代のブラウザでは、
SameSite=None
が正しく設定されていれば、クロスサイトリクエストでもクッキーが送信されます。ただし、一部の古いブラウザではSameSite=None
のサポートが不十分なことがありますが、ほとんどの場合問題なく動作します。
- 現代のブラウザでは、
おまけ
途中でCSRFについて少し触れましたがRailsではテンプレートエンジンを利用してフォームを作成するとデフォルトでCSRFトークンが生成されます。
なのでRailsの仕組みに乗って開発を進めればある程度のセキュリティ対策にはなりそうです。
参考
-
一連の操作とはユーザーのログインからログアウトまでを指す解説を見かけますがログアウトしなくても有効期限が切れることもあるので、一連の操作というよりSessionを生成してから破棄するまでと言った方が正確かもしれません。 ↩︎
Discussion