クッキーとは何ですか?ブラウザの状態、セキュリティ、およびスコープ
Scrapeless Universal Scraping APIは許可された公開ウェブコンテンツを取得し、Cookieが実際の応答で観察される必要がある場合にJavaScriptをレンダリングできます。
TL;DR
- クッキーには1つの正確なプロトコル役割があります。 クッキーは、サーバーがユーザーエージェントに保存させ、スコープに一致する後のリクエストで返すように求める小さな名前-値ペアです。
- クッキーは正しいレイヤーで読み取る必要があります。 トランスポート、表現、ブラウザポリシー、およびアプリケーションの認可は別の懸念事項として残ります。
- 中間者はアプリケーションが観察する内容を変更できます。 ゲートウェイ、キャッシュ、ブラウザのデフォルト、およびクライアントライブラリは、ソースバイトと解析データの間に処理を追加できます。
- 検証にはコンテンツの証拠が必要です。 単独のステータスまたはフィールドは、期待される公開表現が到着したことを証明しません。
- セキュリティはスコープと検証に依存します。 プロトコル構文は、リソースへのアクセスや呼び出し元が提供した値を信頼する許可を決して与えません。
クッキーとは何ですか?
クッキーは、サーバーがユーザーエージェントに保存させ、スコープに一致する後のリクエストで返すように求める小さな名前-値ペアです。サーバーはSet-Cookie応答フィールドでクッキーを作成または更新し、ユーザーエージェントはCookieリクエストフィールドに適用可能な値を送信します。クッキーはウェブインタラクションに状態を追加しますが、HTTP自体を状態を持つプロトコルには変えません。
有効な定義には、メカニズムとその境界の両方が含まれます。クッキーは交換の特定の部分に影響を与えますが、隣接する責任はHTTP、ブラウザ、選択されたトランスポート、アプリケーション、またはサーバーのデータモデルに残ります。これらのレイヤーを分離しておくことで、エラーレポートの再現性が確保され、構成変更がアクセス制御の決定と誤解されるのを防ぎます。
API開発者にとって、最初の質問は、誰が値または動作を作成するのかです。次の質問は、誰がそれを解釈するのかです。最後の質問は、解釈が機能したことを証明する観察可能な結果は何かです。これら3つの答えが、用語をテスト可能なインターフェース契約に変えます。
クッキーの保存と返却のサイクル
応答には1つ以上のSet-Cookieフィールドが含まれることがあります。各指示は、ドメイン、パス、ライフタイム、トランスポートセキュリティ、スクリプトアクセス、クロスサイト動作、およびオプションのパーティショニングを制御する属性に加えて、名前と値を提供します。ユーザーエージェントは、何かを保存する前に指示を評価します。
後のリクエストでは、ユーザーエージェントはリクエストコンテキストに一致するドメイン、パス、セキュリティ、期限切れ、および同一サイトルールに基づいて保存されたクッキーを選択します。それは選択された名前-値ペアをCookieフィールドに直列化します。サーバーはその後、不透明な値をセッション記録や設定などのアプリケーション状態にマッピングします。
クッキーの値は自動的に暗号化されたり信頼できるものではありません。クライアントは多くのクッキーの値を変更でき、ネットワーク保護もアプリケーションデータが有効であることを証明するものではありません。サーバーはアーキテクチャに従ってセンシティブな状態を署名、暗号化、または検索し、すべてのリクエストに対して認可を検証します。
削除は、同じ名前と一致するスコープを持つ期限切れのライフタイムを使用した別のSet-Cookie操作です。間違ったパスやドメインの下で名前をクリアすると、別のクッキーがアクティブのままになる場合があります。これが、実際にはクッキーのアイデンティティの一部としてスコープが重要な理由です。
クッキー属性とその役割
以下の用語は、しばしば1つのラベルに統合されるコンポーネントを区別します。これらをネットワークトレースの装飾としてではなく、参加者間のインターフェースとして読んでください。
ドメイン
どのホストと適格なサブドメインがクッキーを受け取ることができるかを制御します。省略すると、より制限的なホスト専用のクッキーが作成されます。
パス
保存されたパスルールに一致するリクエストパスへの送信を制限します。これはルーティングスコープであり、認可の境界ではありません。
ExpiresとMax-Age
永続的なライフタイムを設定します。両方が存在する場合はMax-Ageが優先されます。
セキュア
ユーザーエージェントのルールに従い、安全なトランスポートコンテキストへの送信を制限します。
HttpOnly
ドキュメントJavaScriptが値を読み取るのを防ぎつつ、ブラウザが一致するリクエストでそれを送信できるようにします。
SameSite
クッキーがいくつかのクロスサイトリクエストコンテキストで送信されるかどうかを制御し、NoneのためのSecure要件と連携します。
なぜクッキーがウェブデータ収集で重要なのか
クッキーはどのバイトが到着するか、どのようにそれらのバイトが解釈されるか、またはブラウザのコードが結果を観察できるかを変更できます。収集ワークフローは、ツールを変更する前にその影響を特定する必要があります。要求されたURL、最終URL、応答ステータス、表現タイプ、関連するプロトコルフィールド、および1つの期待されるコンテンツマーカーを記録します。その簡潔な記録は、正しいページをアクセスメッセージ、同意画面、リダイレクトターゲット、空のアプリケーションシェル、または互換性のないエンコーディングから区別します。
直接HTTPは、要求されたデータが開いているサーバーレンダリングされた応答に存在する場合、最も単純な取得パスです。承認されたコンテンツがJavaScriptの実行、ブラウザ管理の状態、ナビゲーション、またはブラウザのセキュリティポリシーに依存する場合、ブラウザは関連性を持ちます。2つのパスは同じに見えるように強制されるべきではありません:ブラウザはプラットフォームのルールに従ってクッキー、圧縮、リダイレクト、CORS、およびストレージを管理しますが、直接クライアントは異なるデフォルトのセットを露出させます。
セッションの連続性は、1つの応答が次のリクエストのための状態を確立するたびに重要です。1つの限られたクライアントコンテキスト内で認可されたシーケンスを保持し、必要なロケールとネットワークオリジンを保存し、無関係な仕事からの状態を混ぜないようにします。プロキシはネットワークオリジンを変更し、ヘッダーを再現したり、表現をデコードしたり、スクリプトを実行したり、制限されたコンテンツへのアクセスを提供したりしません。
解析は表現の検証が完了した後にのみ開始されます。最終ホスト、利用可能な場合の正準アイデンティティ、メディアタイプ、デコード状態、およびフィールドを抽出する前に必要なビジネスマーカーを確認してください。この順序は、エラードキュメントを技術的に成功したように見える空のレコードに変換することを防ぎます。
中間者には明示的な注意が必要です。コンテンツ配信ネットワークはエンコードされたバリアントを選択でき、ゲートウェイはOPTIONSに応答し、キャッシュは交渉された応答を再利用でき、アプリケーションサーバーはクッキーや認証フィールドを設定できます。アプリケーションコードと最終ページ出力のみを比較すると、判断を下した可能性のあるレイヤーを飛ばしてしまいます。
Scrapeless Universal Scraping APIは、チームが許可された公開コンテンツ(JavaScriptレンダリングされたページを含む)の管理された取得を必要とする場合に関連します。取得契約では、ターゲット、許可されたフィールド、期待される表現、受け入れマーカー、停止条件を定義する必要があります。製品の機能は、ソースの条件、プライバシーの確認、またはアプリケーションレベルの検証を置き換えるものではありません。
クッキーが一般的に表すもの
クッキーは、具体的な製品の動作、互換性要件、または診断決定を変更する際にアーキテクチャに位置を得ます。これらのユースケースは、最初に仕事を説明し、次にプロトコル機能を説明します。
セッションルックアップ
不透明な識別子は、サーバー側で認証されたセッション状態を指し示すことができます。
Preferences
サイトは、適切な範囲内でロケール、レイアウト、または同意の選択肢を記憶できます。
ショッピング状態
カート識別子は、匿名またはサインインしたリクエストをサーバー側のレコードに接続できます。
セキュリティ状態
別の値は、サーバーの検証と組み合わせることでリクエスト改ざん防御をサポートできます。
実験割り当て
制約のある識別子は、ユーザーを一つの承認されたテストバリアントに留めておくことができます。
収集中の連続性
認可されたブラウザワークフローは、関連する公開ページ間で同意またはナビゲーションの状態を保持できます。
他のブラウザストレージと比較したクッキー
クッキーはHTTPの一つのレイヤーに属し、隣接するレイヤーと混同してはいけません。健全な実装は、どのコンポーネントが値を選択するか、どのコンポーネントがそれを変更できるか、最終的な表現が正しいことを証明する証拠を特定します。
| 次元 | クッキー | 関連する概念または代替 |
|---|---|---|
| クッキー | 一致するHTTPリクエストで自動的に送信される | セッション、preferences、CSRF関連の状態 |
| localStorage | オリジンのページスクリプトで読み書きされる | クライアント側の永続的なpreferences |
| sessionStorage | オリジンとブラウザタブセッションにスコープされる | 一時的なページワークフローステート |
| IndexedDB | 構造化されたブラウザデータベース | より大きなオフラインアプリケーションデータ |
| サーバーデータベース | ブラウザの外に保存される | 権威あるアカウントとセッションレコード |
比較はレイヤー境界を保持する場合にのみ有用です。2つのメカニズムが一つのリクエストに共存することができ、1つを置き換えても自動的にもう1つは置き換わりません。選択された動作を入力、可観測出力、失敗状態、所有権の観点から文書化します。
クッキーのセキュリティ結果に影響を与える誤り
- 読み取り可能な値に機密データを入れること。 クッキーのバイトは、属性や設計に応じてログ、拡張機能、スクリプト、またはクライアントの変更を通じて暴露される可能性があります。
- 広範囲のドメインとパスのスコープを使用すること。 広範囲のスコープは、必要以上に多くのリクエストコンテキストに値を送信します。
- SameSiteを完全なCSRF保護として扱うこと。 SameSiteは一つの制御です。アプリケーションは、ワークフローに適したメソッド、オリジン、トークン防御が必要です。
- HttpOnlyをセッション識別子から忘れないでください。 スクリプト可読の認証クッキーは、スクリプトインジェクションの欠陥の影響を増加させる。
- Pathがアクセスを防ぐと仮定する。 Pathは送信ルールに影響を与えますが、承認メカニズムとしてコンテンツを隔離することはありません。
- 完全なCookieフィールドを記録する。 運用ログは、値が修正されない限り、第二の認証ストアになる可能性があります。
ほとんどの失敗は、ライブラリやブラウザが自動的に行ったことに関する仮定を取り除くと、診断が容易になります。最小限のトレースをキャプチャし、シークレットを修正し、一度に1つの制御変数を変更します。目標は、返された表現の安定した説明であり、無関係なヘッダの調整のコレクションではありません。
クッキーのデバッグシーケンス
このシーケンスは、ローンチ前のデザインレビューとして、また挙動が変更された後のプロダクション診断として機能します。それはプロトコル証拠をアプリケーション結果に結びつけるのを保ちます。
- 状態を作成するべきリクエストの正確なSet-Cookieレスポンスを検査する。
- スクリーンショットや共有ログから値を修正しながら、名前と属性を記録する。
- 後のリクエストのホスト、パス、スキーム、同サイトコンテキスト、および有効期限を確認する。
- ブラウザのクッキーストレージビューを使用して、指示が受け入れられたかどうかを確認する。
- 後のCookieリクエストフィールドを検査し、期待される名前が意図した場所にのみ存在することを確認する。
- サーバが値を現在の状態にマッピングし、古いまたは未承認のレコードを受け入れないことを確認する。
- 同じスコープ属性で削除し、別のパスの下に重複するクッキーが残っていないことを確認する。
小さな受け入れサンプルと、同じ修正ルールで拒否されたサンプルを保存することでレビューを終了する。将来の変更は、記憶やスクリーンショットだけでなく、既知のページアイデンティティ、期待されるフィールド、デコードされたコンテンツに対して比較できるようになります。
クッキーに関するセキュリティと可視性
クッキーは、ブラウザ、ゲートウェイ、キャッシュ、およびオリジンサーバーを横断するリクエストパスに参加します。各ホップは、理解できる値のみを受け入れ、維持すべきフィールドを保持し、資格情報や個人データをログにコピーすることを避けるべきです。プロトコル構文は承認ではありません。
運用記録は、リクエストされたURL、最終URL、ステータス、表現タイプ、関連フィールド名、および制約されたコンテンツマーカーをキャプチャする必要があります。完全なボディと資格情報の値は日常的な診断にはほとんど必要なく、不要な保持リスクを生む可能性があります。
ブラウザの動作と直接HTTP動作は異なるテスト表面です。CORS、クッキーストレージ、自動解凍、およびリダイレクト処理は、ブラウザまたはライブラリによって、アプリケーションコードが結果を確認する前に実行される場合があります。キャプチャを比較する際は、クライアントとそのデフォルトを記録してください。
クッキーを定義する標準
HTTPクッキー仕様 はクッキーとSet-Cookieの動作を定義しています。この主要なリソースは、この記事で使用される語彙と境界を修正しますが、実装の動作は選択したクライアントと展開で観察する必要があります。
MDNのクッキーガイド はブラウザのストレージ、寿命、およびセキュリティ属性を説明しています。この主要なリソースは、この記事で使用される語彙と境界を修正しますが、実装の動作は選択したクライアントと展開で観察する必要があります。
Set-Cookieフィールドリファレンス は現在の属性の動作を文書化しています。この主要なリソースは、この記事で使用される語彙と境界を修正しますが、実装の動作は選択したクライアントと展開で観察する必要があります。
OWASPセッション管理ガイダンス はクッキーの設定をセッションセキュリティに接続します。この主要なリソースは、この記事で使用される語彙と境界を修正しますが、実装の動作は選択したクライアントと展開で観察する必要があります。
クッキーの境界
クッキーは明示的なスコープと寿命を持つブラウザ管理の状態です。セキュアなアプリケーションは値を狭く保ち、サーバー側でそれを検証し、ストレージ属性を承認として扱うことを避けます。
そのルールを受け入れテストに入れてください。どの参加者が信号を送り、どの参加者がそれを解釈し、どの仲介者がパスを変更でき、どのコンテンツマーカーが成功を証明するかを示します。これにより、クッキーは失敗後に付加されたラベルではなく、可視化可能なシステムの一部になります。
公開ウェブレスポンスを検証する準備はできていますか?
Scrapeless Universal Scraping APIを使用して、承認された公開コンテンツを取得し、このガイドで説明されている表現契約を確認します。
今日サインアップして、 $5の無料クレジットを入手 — クレジットカードは不要です.
あなたの$5クレジットを請求する →FAQ
クッキーはサーバーによって保存されますか、それともブラウザによって保存されますか?
クッキーは、サーバーがSet-Cookieを送信した後、または許可されたスクリプトが作成した後、ユーザーエージェントによって保存されます。サーバーは通常、クッキー値によって参照される権威のあるセッションまたはアカウント記録を保存します。
JavaScriptによってクッキーを読み取ることはできますか?
クッキーは、HttpOnlyによって保護されておらず、そのスコープがアクセスを許可する場合にのみ、document.cookieを通じて読み取ることができます。HttpOnlyクッキーは、マッチするリクエストで自動的に送信されます。
クッキーをファーストパーティまたはサードパーティとするのは何ですか?
ファーストパーティまたはサードパーティのラベルは、クッキーのサイトとトップレベルサイトコンテキストとの関係に依存します。現代のブラウザポリシーは、基本的なストレージ属性を超えたクロスサイトクッキーの動作を制限する場合があります。
Secureはクッキー値を暗号化しますか?
いいえ。Secureは、セキュアなコンテキストへの送信を制限します。TLSは接続を保護します。クッキーの値自体は、自動的に静的な状態で暗号化されたり、信頼できるものとして扱われたりすることはありません。
クッキーはどのように削除されますか?
クッキーは、同じ名前と一致するスコープでMax-Ageをゼロまたは過去の日付に設定した新しいSet-Cookie命令を送信することによって削除されます。重複するパスまたはドメインは別々に処理する必要があります。