HTTPクッキーの属性と安全な設定方法
HTTPクッキーはWebアプリケーションのセッション管理・認証・ユーザー設定の保存に不可欠です。Set-Cookieヘッダーの各属性を正しく設定することがXSS・CSRF攻撃からの防御に直結します。クッキーの仕組みと属性の意味を理解しましょう。
Set-Cookieヘッダーの構文
Set-Cookie: name=value; Expires=日時; Max-Age=秒数; Path=/; Domain=.example.com; Secure; HttpOnly; SameSite=Strict の形式です。ExpiresとMax-Ageの両方が指定された場合はMax-Ageが優先されます。どちらもなければセッションクッキー(ブラウザ閉じたら削除)になります。
HttpOnly・Secureフラグの重要性
HttpOnlyを設定するとJavaScriptからdocument.cookieでアクセスできなくなり、XSS攻撃でのクッキー窃取を防ぎます。Secureを設定するとHTTPS接続でのみ送信され、中間者攻撃を防ぎます。認証クッキーには必ずこの両方を設定してください。開発環境ではHTTPを使うことが多いため、Secureはプロダクション環境でのみ有効にする設定があります。
SameSite属性でCSRFを防ぐ
SameSite=Strict: 同一サイトからのリクエストのみクッキーを送信。外部サイトからのリンクでもクッキーが送られないため、ログイン状態が保持されない場合があります。SameSite=Lax: デフォルト値。GETの最上位ナビゲーション(リンクのクリック等)では送信、POST等では送信しません。SameSite=None: クロスサイトでも送信(必ずSecureが必要)。
クッキーのスコープ設計
Domainにexample.comを指定するとsub.example.comのサブドメインにもクッキーが送られます(先頭の.は任意)。PathはURL階層でクッキーの送信範囲を制限します。クッキーサイズは合計4KB制限があります。クッキーを大量に設定するとリクエストヘッダーが肥大化するため、セッションIDのみ格納しデータはサーバー側に持つ設計が推奨されます。