クッキーを保護する構成
クッキーへのアクセスは、可能な限り制限してください。
問題
クッキーには、セッション ID やその他の機密情報が含まれていることが多くの場合あります。したがって、クッキーへの不正アクセスは、プライバシーに関する課題、クリックジャッキング攻撃、サイト間リクエストフォージェリー (CSRF) 攻撃など、さまざまな課題を発生させる可能性があります。
解決策
サイト上のクッキーに関する脆弱性のリスクを最小限に抑えるため、Set-Cookie レスポンスヘッダーを送信する際に、以下のクッキー属性を指定することで、クッキーへのアクセスを可能な限り制限してください。
Name-
クッキー名に
__Secure-または__Host-を接頭辞としてつけることで、セキュリティが確保されていないソースによるクッキーの上書きを防ぎます。- 特定のドメイン(サブドメインを除く)でのみ必要で、
Pathが/に設定されているクッキーには、すべて__Host-を使用してください。 - その他のクッキーには、すべて
__Secure-を使用してください。
- 特定のドメイン(サブドメインを除く)でのみ必要で、
Secure-
常に
Secure属性を設定し、そのクッキーが HTTPS 経由でのみ送信されることを示してください。 HttpOnly-
JavaScript からのアクセス(例えば
Document.cookie経由)が要求されないすべてのクッキーに対して、HttpOnly属性を設定してください。特に、セッション識別子が含まれているクッキーには、JavaScript からアクセスできないようにこれにより、クロスサイトスクリプティング (XSS) 攻撃によってセッション識別子が盗み出されるのを防ぐことができます。
ExpiresおよびMax-Age-
クッキーは、必要性がなくなった時点で速やかに有効期限が切れるようにすべきです。特にセッション ID については、すばやく有効期限が切れるようにすべきです。
-
Expires: 指定されたクッキーの絶対的な有効期限を設定します。 -
Max-Age: 指定されたクッキーの相対的な有効期限を設定します。メモ:
ExpiresはMax-Ageよりも以前から利用できますが、Max-Ageの方がエラーの可能性が低く、両方が設定されている場合はMax-Ageが優先されます。その理由は、Expiresの日時を設定する際、クッキーが設定されるクライアントを基準とした日時となるためです。サーバーの時刻が異なる場合は、エラーが発生する可能性があります。ExpiresもMax-Ageも設定されていない場合、クッキーはユーザーがブラウザーを閉じるまで保持され、その後破棄されます。
-
Domain-
Domain属性は、クッキーを他のドメインからもアクセス可能にする必要がある場合にのみ設定してください。その場合は、可能な限り狭いドメインに設定してください。 Path-
可能な限り厳格な
Pathを設定してください。 SameSite-
SameSite属性をStrictまたはLaxに設定することで、異なるサイトから発信されるリクエストにおけるクッキーの送信を制限します。この方法は、CSRF、クリックジャッキング、および一部のクロスサイトリーク攻撃に対する部分的な防御策です。
例
現在のホストでのみアクセス可能で、ユーザーがブラウザーを閉じると無効になるセッション識別子のクッキーを設定します。
Set-Cookie: MOZSESSIONID=980e5da39d4b472b9f504cac9; Path=/; Secure; HttpOnly
__Secure- 接頭辞を使用して、すべての example.org サイトに対して、30 日後に期限切れになるセッション識別子を設定します。このクッキーは、ほとんどのサイト間リクエストには含まれませんが、リンクをクリックするなどして他のサイトから自サイトへ移動する際には含まれます。
Set-Cookie: __Secure-MOZSESSIONID=7307d70a86bd4ab5a00499762; Max-Age=2592000; Domain=example.org; Path=/; Secure; HttpOnly; SameSite=Lax
ユーザーが利用規約を受け入れた際、現在のホストに対して、JavaScript からアクセス可能な長期有効なクッキーを設定します。このクッキーは、ほとんどのサイト間リクエストには記載されませんが、リンクをクリックするなどして他のサイトから自サイトへ移動する際には記載されます。
Set-Cookie: __Host-ACCEPTEDTOS=true; Expires=Fri, 31 Dec 9999 23:59:59 GMT; Path=/; Secure; SameSite=Lax
セッション識別子を含むクッキーを設定します。このクッキーは、他のサイトから自サイトへ移動する場合を含め、サイト間リクエストで送信されることはありません。
Set-Cookie: __Host-BMOSESSIONID=YnVnemlsbGE=; Max-Age=2592000; Path=/; Secure; HttpOnly; SameSite=Strict