🍪

Cookie、Sessionの基本と3rd Party Cookieについて

2024/10/20に公開

ユーザーのログイン状態を保持する方法

まず初めにウェブアプリケーションでユーザーのログイン状態を保持する方法は以下のような仕組みを利用するものがあります。

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の仕組みに乗って開発を進めればある程度のセキュリティ対策にはなりそうです。

参考

https://qiita.com/nakanishi03/items/dee8ae104635b2d1aff0
https://zenn.dev/rie_amasato/articles/580a1611684169
https://qiita.com/doyaaaaaken/items/02357c2ebca994160804
https://qiita.com/dai-maru/items/0faff1713527c80c7365

脚注
  1. 一連の操作とはユーザーのログインからログアウトまでを指す解説を見かけますがログアウトしなくても有効期限が切れることもあるので、一連の操作というよりSessionを生成してから破棄するまでと言った方が正確かもしれません。 ↩︎

Discussion