
Cookie はなぜ壊れやすいのか ― SameSite / Secure / HttpOnly / Partitioned を正しく読む
Cookie は、Webでログイン状態を保つための基本技術です。しかし、Secure、HttpOnly、SameSite、Partitioned、__Host- などの属性を「とりあえず全部付ければ安全」と覚えると、すぐに判断を間違えます。
Cookie の属性は、それぞれ守る相手が違います。通信路を守るもの、JavaScriptからの読み取りを防ぐもの、クロスサイト送信を制限するもの、第三者コンテキストで状態を分離するもの。本記事では、Set-Cookie の主要属性を、CSRF、XSS、第三者Cookie、CHIPS の文脈で読み直します。
SecureはHTTPS限定で送るための属性
Secure は、Cookieを安全な通信路でだけ送るための属性です。MDNの説明では、Secure が付いたCookieは通常 https: のリクエストでのみ送信されます。ログインセッションのCookieには基本的に必須と考えてよい属性です。
Set-Cookie: session=abc123; Secure
ただし、Secure はCookieの中身をアプリ内で安全にする魔法ではありません。ディスク上の保存、ブラウザ拡張、XSSで発生するリクエスト、サーバー側のセッション管理ミスまでは解決しません。また、JavaScriptからの読み取りを止める属性でもありません。そこは HttpOnly の役割です。
SameSiteはCSRFを減らすが、認可ではない
SameSite は、クロスサイトのリクエストにCookieを送るかどうかを制御します。CSRFは、攻撃者のサイトが被害者のブラウザに、ログイン済みサイトへのリクエストを送らせる攻撃です。OWASPも、ブラウザがセッションCookieを自動的に含めることがCSRFの前提になると説明しています。
| 値 | 大まかな挙動 | 用途の目安 |
|---|---|---|
Strict | 同一siteからのリクエストに限定 | 管理画面、重要操作 |
Lax | 同一site + 一部のトップレベル遷移 | 通常のログインセッション |
None | クロスサイトにも送る。Secure 必須 | 埋め込み、外部IdP、決済など |
注意点は、SameSite は認可ではないことです。攻撃リクエストの一部をブラウザ側で抑制できますが、サーバー側のCSRFトークン、Origin / Referer確認、Fetch Metadataヘッダー、再認証などを完全に置き換えるものではありません。
siteとoriginを混同しない
SameSite の「site」は、JavaScriptの同一オリジンポリシーでいう origin と同じではありません。origin は scheme、host、port の組み合わせです。一方、SameSiteで見る site は、現在の仕様やブラウザ説明では scheme と登録可能ドメインを中心に扱われます。
| 組み合わせ | origin | site |
|---|---|---|
https://app.example.com と https://api.example.com | 別origin | 同一siteになり得る |
https://example.com と http://example.com | 別origin | schemeを含めると別site |
この違いを混同すると、「CORSで別originだからSameSiteでも別扱いだろう」といった誤解が起きます。Cookieの送信条件、CORSでレスポンスを読める条件、JavaScriptがDOMへアクセスできる条件は、それぞれ別のルールです。
__Host-と__Secure-はスコープのミスを減らす
Cookie名のプレフィックスも重要です。MDNは、__Secure- と __Host- などのCookieプレフィックスを説明しています。これらは、対応ブラウザでCookieの属性条件を強制し、設定ミスを見つけやすくします。
| プレフィックス | 主な条件 | 狙い |
|---|---|---|
__Secure- | Secure が必要 | HTTPS経由のCookieであることを強制 |
__Host- | Secure、Path=/、Domainなし | サブドメインからの上書きや広すぎるDomainを避ける |
ログインセッションCookieでは、可能なら __Host- を検討する価値があります。Domain を指定しないhost-only cookieにし、Path=/ でホスト全体に限定すると、スコープが読みやすくなります。
ローカルストレージなら安全、ではない
Cookieの属性が難しいため、「トークンをCookieではなくlocalStorageに置けばよい」と言われることがあります。しかし、これは単純化しすぎです。localStorageの値はJavaScriptから読めるため、XSSが起きるとアクセストークンを直接盗まれる可能性があります。
一方、HttpOnly CookieはJavaScriptから直接読めません。ただし、リクエストには自動送信されるため、CSRFやXSSによる操作リクエストには別の防御が必要です。つまり、CookieとlocalStorageは「どちらが常に安全」ではなく、攻撃面が違います。
セッション管理では、短命トークン、ローテーション、CSRF対策、再認証、権限チェック、ログアウト時の無効化、サーバー側セッション失効などを組み合わせる必要があります。保存場所だけで安全性を決めるのは危険です。
まとめ ― 属性は役割で読む
Cookie属性は、名前だけ覚えるより「何から守るのか」で読むと整理できます。Secure は通信路、HttpOnly はJavaScriptからの読み取り、SameSite はクロスサイト送信、Partitioned は第三者コンテキストでの状態分離、__Host- はスコープ設定ミスの削減です。
逆に言えば、どの属性も万能ではありません。HttpOnly はCSRFを止めません。SameSite は認可を代替しません。Secure はXSSを防ぎません。Partitioned はすべての第三者Cookie問題を解決するわけではありません。
Cookieは壊れやすい技術ではありますが、壊れ方にはパターンがあります。属性を役割で読み、サーバー側の認可・CSRF対策・XSS対策と組み合わせれば、セッション管理の見通しはかなりよくなります。
参考文献・ソース
記事作成に関する注記
本記事は AI(大規模言語モデル)を編集補助として活用して作成しています。 公開前に編集者が内容を確認していますが、事実誤認・仕様の解釈ミス・最新情報との齟齬が含まれる可能性があります。 重要な判断を行う際は、本文中の一次ソースや公式ドキュメントを必ずご自身でご確認ください。 誤りにお気づきの場合は、お問い合わせフォームよりご連絡いただけると助かります。


