DjangoでCookieテスト!set_test_cookie()徹底解説
以下に詳しく説明します。
set_test_cookie()
の目的
Webアプリケーションでは、セッション管理にCookieを使用することが一般的です。しかし、ユーザーのブラウザ設定によってはCookieが無効になっている場合があります。set_test_cookie()
は、ブラウザがCookieを受け入れるかどうかをテストするために、一時的なテスト用Cookieを設定します。
動作の仕組み
-
テストCookieの設定:
set_test_cookie()
メソッドを呼び出すと、Djangoは現在のセッションに特定のキー(TEST_COOKIE_NAME
)と値(TEST_COOKIE_VALUE
)を追加します。これにより、セッションが変更されたとみなされ、DjangoはセッションIDを含むCookieをユーザーのブラウザに送信します。 -
次回のリクエストでの確認: Cookieの仕組み上、
set_test_cookie()
を呼び出した直後のリクエストでは、ブラウザがそのCookieを受け入れたかどうかを直接確認することはできません。ブラウザがCookieを受け入れたかどうかは、次のページリクエストで確認する必要があります。 -
確認方法: 次のページリクエストで
request.session.test_cookie_worked()
メソッドを呼び出すことで、前のリクエストで設定したテストCookieがブラウザに受け入れられ、Djangoがそれを正常に読み取れたかどうかをTrue
またはFalse
で確認できます。 -
テストCookieの削除: テストが完了したら、
request.session.delete_test_cookie()
を呼び出してテストCookieを削除することが推奨されます。
典型的な使用シナリオは以下のようになります。
ビュー1 (例: set_cookie_view
)
from django.http import HttpResponse
def set_cookie_view(request):
request.session.set_test_cookie()
return HttpResponse("Cookieテスト用のCookieを設定しました。次のページで確認してください。")
ビュー2 (例: check_cookie_view
)
from django.http import HttpResponse
def check_cookie_view(request):
if request.session.test_cookie_worked():
request.session.delete_test_cookie() # テストCookieを削除
return HttpResponse("おめでとうございます!ブラウザはCookieをサポートしています。")
else:
return HttpResponse("申し訳ありません。ブラウザはCookieをサポートしていないか、無効にしています。")
URL設定 (例: urls.py
)
from django.urls import path
from . import views
urlpatterns = [
path('set_cookie/', views.set_cookie_view, name='set_cookie_view'),
path('check_cookie/', views.check_cookie_view, name='check_cookie_view'),
]
ユーザーがまず /set_cookie/
にアクセスし、次に /check_cookie/
にアクセスすることで、ブラウザのCookieサポート状況を確認できます。
request.session.test_cookie_worked() が常に False を返す
これは最もよくある問題です。
考えられる原因とトラブルシューティング
-
Cookieのサイズ制限
ブラウザやWebサーバーにはCookieのサイズ制限(一般的に4KB程度)があります。セッションデータが非常に大きい場合、テストCookieを含むセッションCookieが大きくなりすぎて、ブラウザが受け入れない可能性があります。 解決策: セッションに保存するデータを最小限に抑えるか、セッションのストレージ方法を見直す(例: データベースに大部分のデータを保存し、セッションにはIDのみを保存するなど)。 -
サーバーサイドのキャッシュの問題
Webサーバーやプロキシサーバーでキャッシュが強力に効いている場合、セッションCookieが正しく設定・読み取られないことがあります。 解決策: 開発中はキャッシュを無効にするか、キャッシュの設定を確認してください。 -
SESSION_ENGINE の問題
セッションエンジン(例:django.contrib.sessions.backends.db
,django.contrib.sessions.backends.file
,django.contrib.sessions.backends.cache
,django.contrib.sessions.backends.signed_cookies
)の設定に問題がある可能性があります。特に、データベースベースのセッションを使用している場合は、django_session
テーブルが作成されている必要があります。 解決策:settings.py
のSESSION_ENGINE
の設定を確認し、それに合わせて必要な設定(例: データベース接続、キャッシュ設定、ファイルの書き込み権限など)が正しく行われているかを確認してください。python manage.py migrate
を実行して、セッションテーブルが作成されていることを確認することも重要です。 -
SESSION_COOKIE_SECURE = True とHTTPS以外の環境
settings.py
でSESSION_COOKIE_SECURE = True
と設定されている場合、CookieはHTTPS接続でのみ送信されます。開発環境などでHTTPを使用している場合、Cookieは送信されず、テストに失敗します。 解決策: 開発環境ではSESSION_COOKIE_SECURE = False
に設定するか、HTTPSを使用してください。本番環境ではHTTPSを強く推奨し、SESSION_COOKIE_SECURE = True
に設定してください。 -
SECRET_KEY が設定されていないか、安全でない
DjangoのセッションはSECRET_KEY
を使用して署名されます。これが適切に設定されていない、または安全でない場合、セッションの読み取りや書き込みに問題が発生する可能性があります。 解決策:settings.py
に強力でユニークなSECRET_KEY
が設定されていることを確認してください。本番環境では特に重要です。 -
Cookieが無効になっているブラウザ
ユーザーのブラウザ設定でCookieが無効になっている場合、テストCookieは機能しません。 解決策: テストのために、ブラウザのCookie設定を確認し、有効になっていることを確認してください。 -
SessionMiddleware の欠如または配置ミス
Djangoのセッション機能を使用するためには、settings.py
のMIDDLEWARE
設定に'django.contrib.sessions.middleware.SessionMiddleware'
が含まれている必要があります。また、その配置順序も重要です。通常は他のミドルウェアよりも上位に配置されます。 解決策:settings.py
を確認し、'django.contrib.sessions.middleware.SessionMiddleware'
がMIDDLEWARE
リストに含まれていることを確認してください。 -
異なるリクエストでの確認忘れ
set_test_cookie()
を呼び出した直後のリクエストでは、test_cookie_worked()
は常にFalse
を返します。CookieはHTTPレスポンスヘッダに設定され、ブラウザがそれを受け取り、次のリクエストで送信して初めてサーバー側で読み取ることができます。 解決策:set_test_cookie()
を呼び出したビューとは別のビューで、ユーザーが次にアクセスするページでtest_cookie_worked()
を確認するようにしてください。
set_test_cookie() を呼び出してもセッションCookieがブラウザに表示されない
これは、set_test_cookie()
が直接 "testcookie" という名前のCookieを設定するわけではないという誤解からくるものです。
考えられる原因とトラブルシューティング
-
セッションデータが変更されていないと判断される
Djangoは、セッションデータが実際に変更された場合にのみセッションCookieを送信します。set_test_cookie()
はセッションを変更する操作なので、通常はCookieが送信されますが、何らかの理由で変更が認識されないケースがあるかもしれません。 解決策:request.session.set_test_cookie()
の後に、明示的にrequest.session.save()
を呼び出すことで、セッションの変更を強制的に保存させることができます。ただし、通常はset_test_cookie()
が内部でセッションをmodified
状態にするため、これは不要です。 -
set_test_cookie() の動作への誤解
set_test_cookie()
は、request.session
オブジェクトの内部に特定のフラグ(TEST_COOKIE_NAME
とTEST_COOKIE_VALUE
)を設定するだけであり、直接testcookie
という名前の新しいCookieを生成するわけではありません。このフラグ設定により、Djangoはセッションが変更されたと判断し、通常のセッションIDを含むCookie(通常はsessionid
)を更新してブラウザに送信します。 解決策: ブラウザの開発者ツールで確認すべきは、testcookie
という名前のCookieではなく、sessionid
(またはSESSION_COOKIE_NAME
で設定された名前) という名前のCookieです。このCookieが正しく設定されているかを確認してください。
テスト環境 (ユニットテストなど) でのセッション問題
Djangoのテストクライアントを使用している場合、実際のブラウザの動作とは異なる振る舞いをすることがあります。
考えられる原因とトラブルシューティング
- テストクライアントのCookie処理
Djangoのテストクライアントは、実際のブラウザのCookie処理を完全に模倣しているわけではありません。 解決策: テストコード内で、set_test_cookie()
を呼び出した後のリクエストでclient.cookies
を確認するなどして、Cookieが正しく設定されているかを手動で検証する必要がある場合があります。また、テストでは直接request.session['TEST_COOKIE_NAME'] = 'test_cookie_value'
のようにセッションを操作し、その後にtest_cookie_worked()
の動作を確認する方が確実な場合もあります。
- Djangoのドキュメント
公式ドキュメントは常に最新の情報源です。セッションに関するドキュメントを再確認してください。 - ブラウザの開発者ツール (F12)
ネットワークタブでHTTPリクエストとレスポンスのヘッダを確認し、Set-Cookie
ヘッダが正しく送信されているか、また次のリクエストでCookie
ヘッダが正しく送信されているかを確認してください。 - シンプルなコードで再現
問題を切り分けるために、最小限のDjangoプロジェクトを作成し、set_test_cookie()
の動作のみをテストするビューを作成してみるのが有効です。 - デバッグモードの活用
settings.py
でDEBUG = True
に設定すると、詳細なエラーメッセージが表示され、問題の特定に役立ちます。ただし、本番環境では必ずFalse
に戻してください。 - ログの確認
Djangoのセッションバックエンドは、エラーが発生した場合にログを出力することがあります。Djangoのログ設定を確認し、エラーメッセージがないかチェックしてください。
プロジェクトの準備
まず、基本的なDjangoプロジェクトとアプリケーションを作成します。
-
django-admin startproject mysite cd mysite
-
アプリケーションの作成
python manage.py startapp myapp
-
settings.py の設定
mysite/settings.py
を開き、INSTALLED_APPS
に'myapp'
を追加します。# mysite/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', # セッションが有効になっていることを確認 'django.contrib.messages', 'django.contrib.staticfiles', 'myapp', # 追加 ] # ミドルウェアも確認(SessionMiddlewareが含まれているか) MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # これが重要 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] # 他の設定はデフォルトでOK
-
マイグレーションの実行
python manage.py migrate
コード例
ビュー (myapp/views.py)
ユーザーが最初にアクセスするビューでテストCookieを設定し、次にアクセスするビューでその結果を確認します。
# myapp/views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse
def set_test_cookie_view(request):
"""
テスト用のCookieを設定するビュー。
このビューを訪れると、ブラウザに一時的なテストCookieが送られます。
"""
request.session.set_test_cookie()
# ユーザーに次のステップを促すメッセージを表示
return render(request, 'myapp/set_cookie.html')
def check_test_cookie_view(request):
"""
テストCookieがブラウザで機能したかを確認するビュー。
"""
if request.session.test_cookie_worked():
# テストが成功した場合
# テストCookieは不要になったので削除します
request.session.delete_test_cookie()
message = "ブラウザはCookieをサポートしています!セッションが正常に機能します。"
status = "success"
else:
# テストが失敗した場合
message = "ブラウザはCookieをサポートしていないか、無効にしています。セッション機能に問題がある可能性があります。"
status = "failure"
return render(request, 'myapp/check_cookie.html', {
'message': message,
'status': status
})
def homepage_view(request):
"""
ホームページ(テストの開始点)
"""
return render(request, 'myapp/homepage.html')
def cookie_required_feature_view(request):
"""
Cookieが必須となる機能の例。
ここでは、Cookieが有効でなければエラーページにリダイレクトします。
"""
if not request.session.test_cookie_worked():
# この機能を使う前にCookieテストが成功したかを簡易的にチェック
# 実際には、より堅牢なセッションチェックが必要です
return redirect('cookie_disabled')
# 実際の機能の処理
return HttpResponse("これはCookieが有効な場合にのみ表示される機能です。")
def cookie_disabled_view(request):
"""
Cookieが無効な場合に表示するページ
"""
return HttpResponse("申し訳ありませんが、この機能はCookieが有効な場合にのみ利用できます。ブラウザのCookie設定を確認してください。")
テンプレート (myapp/templates/myapp/)
ビューに対応するHTMLテンプレートを作成します。
-
check_cookie.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cookie テスト結果</title> <style> .success { color: green; font-weight: bold; } .failure { color: red; font-weight: bold; } </style> </head> <body> <h1>Cookie テスト結果</h1> <p class="{{ status }}">{{ message }}</p> <p><a href="{% url 'homepage' %}">もう一度テストする</a></p> {% if status == "success" %} <p><a href="{% url 'cookie_required_feature' %}">Cookie必須の機能へ進む</a></p> {% endif %} </body> </html>
-
set_cookie.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cookie 設定完了</title> </head> <body> <h1>テストCookieが設定されました</h1> <p>これでブラウザにテスト用のCookieが送信されました。</p> <p>以下のボタンをクリックして、Cookieが正しく機能しているか確認してください。</p> <a href="{% url 'check_cookie_test' %}"><button>Cookieの動作を確認</button></a> </body> </html>
-
homepage.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cookie テスト開始</title> </head> <body> <h1>Django Cookie テスト</h1> <p>ブラウザがCookieをサポートしているか確認します。</p> <p>まず、以下のボタンをクリックしてテストCookieを設定してください。</p> <a href="{% url 'set_cookie_test' %}"><button>Cookie テストを開始</button></a> </body> </html>
URL設定 (myapp/urls.py と mysite/urls.py)
アプリケーションのURLを設定します。
-
mysite/urls.py
(プロジェクトのルートURL設定)# mysite/urls.py from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('myapp.urls')), # myapp のURLを含める ]
-
myapp/urls.py
# myapp/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.homepage_view, name='homepage'), # ホームページ path('set-cookie-test/', views.set_test_cookie_view, name='set_cookie_test'), path('check-cookie-test/', views.check_test_cookie_view, name='check_cookie_test'), path('feature/', views.cookie_required_feature_view, name='cookie_required_feature'), path('cookie-disabled/', views.cookie_disabled_view, name='cookie_disabled'), ]
実行方法
- 開発サーバーを起動します。
python manage.py runserver
- ブラウザで
http://127.0.0.1:8000/
にアクセスします。 - 「Cookie テストを開始」ボタンをクリックします。
- 「Cookieの動作を確認」ボタンをクリックして結果を確認します。
コードの解説
-
cookie_required_feature_view(request)
:- これは、実際のアプリケーションでCookieの有効性を確認する必要がある場合にどのように使えるかを示す例です。例えば、ログインが必須のページや、ユーザー設定を保存する機能など、セッションに依存する機能に進む前にこのチェックを行うことができます。ただし、この例では簡易的なチェックであり、より堅牢な認証システムなどと組み合わせる必要があります。
-
check_test_cookie_view(request)
:request.session.test_cookie_worked()
: このメソッドを呼び出すことで、前のリクエストで設定したテストCookieがブラウザによって受け入れられ、かつDjangoがそれを正常に読み取れたかどうかを確認します。True
の場合:ブラウザはCookieをサポートしており、セッションが機能しています。False
の場合:ブラウザがCookieをサポートしていないか、無効にしている可能性があります。
request.session.delete_test_cookie()
: テストが完了したら、このメソッドを呼び出してテストCookieに関連するセッションデータをクリーンアップします。これは必須ではありませんが、セッションデータをきれいにする良い習慣です。
-
set_test_cookie_view(request)
:request.session.set_test_cookie()
: この行がテストCookieを設定する主要な部分です。実際にはブラウザに直接見える「テストCookie」という名前のCookieが送信されるわけではありません。このメソッドは、現在のセッションに特定のフラグを設定し、Djangoが次のレスポンスでセッションIDを含むCookieを送信する際に、このフラグも含まれるようにします。これにより、ブラウザがCookieを受け入れた場合、次のリクエストでこのフラグをサーバーが読み取れるようになります。
- HTTPS (本番環境)
settings.py
でSESSION_COOKIE_SECURE = True
と設定されている場合、CookieはHTTPS接続でのみ送信されます。本番環境ではHTTPSを使用し、この設定を有効にすることを強く推奨します。開発環境では、HTTPでテストするために一時的にFalse
に設定することがあります。 - SECRET_KEY の重要性
DjangoのセッションはSECRET_KEY
によって保護されています。本番環境では、このキーが安全でユニークであることを絶対に確認してください。 - Cookieのプライバシー設定
ユーザーがブラウザで「サードパーティCookieをブロック」などの厳格なプライバシー設定をしている場合、セッションCookieが正しく機能しないことがあります。これはDjangoの機能の問題ではなく、ブラウザのセキュリティ設定によるものです。 - 2段階のプロセス
set_test_cookie()
はCookieを送信するだけで、その結果は次のリクエストでしか確認できません。これが最も重要な点です。
JavaScript を使用したクライアントサイドでの Cookie サポート検出
これは、サーバーサイドの Django の機能に依存せず、ブラウザ側で直接 Cookie の有効性をチェックする最も一般的な方法です。
利点
- サーバーの負荷が軽減されます。
- ユーザー体験が向上します。サーバーに2回リクエストを送信する必要がないため、より迅速に結果をユーザーにフィードバックできます。
欠点
- サーバーサイドのセッションの整合性を直接確認するものではありません(ただし、ほとんどのユースケースでは問題になりません)。
- JavaScript が無効になっているブラウザでは機能しません。
実装例
-
# myapp/views.py from django.shortcuts import render from django.http import HttpResponse def check_cookie_js_view(request): """ JavaScript で Cookie の有効性をチェックするページを表示するビュー。 """ return render(request, 'myapp/check_cookie_js.html') def no_cookie_fallback_view(request): """ JavaScript で Cookie が無効と判断された場合に表示されるページ。 """ return HttpResponse("申し訳ありません。Cookie が無効なようです。")
-
テンプレート (myapp/templates/myapp/check_cookie_js.html)
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>JavaScript Cookie Test</title> <script> function checkCookieSupport() { // テスト用の Cookie を設定 document.cookie = "test_cookie_js=1; path=/"; // Cookie を読み取り、設定した Cookie が存在するか確認 if (document.cookie.indexOf("test_cookie_js=1") !== -1) { // Cookie を削除 (クリーンアップ) document.cookie = "test_cookie_js=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; // Cookie が有効な場合の処理 (例: 別のページへリダイレクト) window.location.href = "{% url 'cookie_enabled_js' %}"; // 成功時のURL } else { // Cookie が無効な場合の処理 (例: エラーページへリダイレクト) window.location.href = "{% url 'no_cookie_fallback' %}"; // 失敗時のURL } } // ページロード時に Cookie テストを実行 window.onload = checkCookieSupport; </script> </head> <body> <h1>Cookie サポートの確認中...</h1> <p>ブラウザの Cookie 設定を確認しています。しばらくお待ちください。</p> <noscript> <p style="color: red;">JavaScript が無効になっています。この機能には JavaScript が必要です。</p> <p><a href="{% url 'no_cookie_fallback' %}">Cookie が無効な場合のページへ</a></p> </noscript> </body> </html>
-
URL設定 (myapp/urls.py に追加)
# myapp/urls.py (既存の urlpatterns に追加) urlpatterns = [ # ... 既存のURL ... path('check-cookie-js/', views.check_cookie_js_view, name='check_cookie_js'), path('cookie-enabled-js/', lambda request: HttpResponse("Cookie は有効です!"), name='cookie_enabled_js'), # 成功時のダミーページ path('no-cookie-fallback/', views.no_cookie_fallback_view, name='no_cookie_fallback'), ]
クエリパラメータや隠しフィールドを使用したフォールバック
セッション Cookie が必須でない一部のユースケースでは、Cookie が無効なユーザーのために、URL のクエリパラメータやフォームの隠しフィールドを通じて状態を渡すフォールバックメカニズムを実装することも考えられます。ただし、これはセッション管理の代替としては限定的です。
利点
- Cookie に依存しないため、どのようなブラウザ設定でも機能します。
欠点
- パスワードなどの機密情報を URL に含めるべきではありません。
- 状態管理が複雑になり、大規模なアプリケーションには不向きです。
- セキュリティ上のリスク(URL の改ざんなど)が増加します。
- URL が長くなりがちで、ブックマークや共有が困難になります。
実装例 (概念)
# ビューの例
from django.shortcuts import render, redirect
def cookie_fallback_example(request):
user_id = request.GET.get('user_id') # Cookie が使えない場合、URLからユーザーIDを取得
if not user_id:
# 初回アクセス時など、IDがない場合は Cookie の有効性をチェック
# または、新しい ID を生成して URL に含めてリダイレクト
if not request.session.test_cookie_worked(): # DjangoのテストCookieも併用可能
new_user_id = "guest_" + str(uuid.uuid4()) # ユニークなIDを生成
return redirect(f'/some_page/?user_id={new_user_id}')
else:
# Cookie が有効なら通常通りセッションを使用
request.session['user_id'] = "some_session_id"
return render(request, 'myapp/normal_page.html')
# user_id がある場合、それを使って処理を続ける
return HttpResponse(f"Hello, user {user_id}. Cookie は使われていません。")
# フォームの隠しフィールドの例
# <form action="/submit/" method="post">
# <input type="hidden" name="user_data" value="some_encrypted_data">
# ...
# </form>
これは、set_test_cookie()
の直接的な代替ではありませんが、Cookie を使わずにユーザーの状態を管理する方法として、主に RESTful API や SPA (Single Page Application) で利用されます。例えば、トークンベースの認証 (JWT - JSON Web Tokens) などがあります。
利点
- CORS (Cross-Origin Resource Sharing) の問題が少ない場合がある。
- モバイルアプリケーションなどの非ブラウザクライアントでも利用しやすい。
- ステートレスな設計が可能で、スケーラビリティが高い。
欠点
- CSRF (Cross-Site Request Forgery) 攻撃に対する保護が別途必要になる場合がある (Cookie の
HttpOnly
,SameSite
属性のような組み込みの保護がないため)。 - トークンの有効期限管理や失効戦略が複雑になる。
- セッション Cookie のように自動的にブラウザが管理してくれるわけではないため、クライアントサイドでのトークンの保存と送信のロジックが必要。
実装例 (概念 - Django REST Framework と JWT を想定)
# DRF と JWT ライブラリ (例: djangorestframework-simplejwt) を使用
# ログイン時にトークンを返す
# 以降のリクエストでは、クライアントが Authorization: Bearer <token> ヘッダーを送信
# settings.py
# INSTALLED_APPS に 'rest_framework_simplejwt' を追加
# REST_FRAMEWORK = {
# 'DEFAULT_AUTHENTICATION_CLASSES': (
# 'rest_framework_simplejwt.authentication.JWTAuthentication',
# ),
# }
# views.py (API エンドポイント)
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
class ProtectedDataView(APIView):
permission_classes = [IsAuthenticated] # 認証されたユーザーのみアクセス可能
def get(self, request):
return Response({"message": f"Hello, {request.user.username}! This is protected data."})
# クライアントサイド (JavaScript の例)
/*
fetch('/api/protected-data/', {
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN' // ログイン時に取得したトークン
}
})
.then(response => response.json())
.then(data => console.log(data));
*/
set_test_cookie()
は、Django の組み込みセッション機能に依存するアプリケーションにおいて、ブラウザがセッション Cookie をサポートしているかをシンプルにテストするのに適しています。
代替手段は、以下のような場合に検討されます。
- HTTP ヘッダー (トークンベース認証)
RESTful API や SPA など、Cookie ベースのセッションとは異なる認証・状態管理モデルを採用する場合。これはセッション管理とは独立した認証の概念に近いです。 - クエリパラメータ/隠しフィールド
非常にシンプルな状態管理で、Cookie を避けたい限定的なシナリオ。セキュリティや複雑さが増すため、あまり推奨されません。 - JavaScript を使用したクライアントサイドでの検出
ユーザー体験を重視し、サーバーへのリクエスト数を減らしたい場合。Cookie に依存しないフォールバックが必要な場合。