From 8dee1efa9f46368d2c550a09a1feb1691bcd17bd Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Fri, 17 Sep 2021 22:49:43 +0900 Subject: Web/HTTP/Headers/Set-Cookie を更新 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/ja/web/http/headers/set-cookie/index.md | 291 ++++++++++++++------------ 1 file changed, 155 insertions(+), 136 deletions(-) (limited to 'files/ja') diff --git a/files/ja/web/http/headers/set-cookie/index.md b/files/ja/web/http/headers/set-cookie/index.md index 9978bdf67e..265c713a05 100644 --- a/files/ja/web/http/headers/set-cookie/index.md +++ b/files/ja/web/http/headers/set-cookie/index.md @@ -4,148 +4,187 @@ slug: Web/HTTP/Headers/Set-Cookie tags: - Cookies - HTTP - - Reference - - ヘッダー + - リファレンス - レスポンス - - レスポンスヘッダー + - ヘッダー + - samesite +browser-compat: http.headers.Set-Cookie translation_of: Web/HTTP/Headers/Set-Cookie --- -
{{HTTPSidebar}}
+{{HTTPSidebar}} -

Set-Cookie は HTTP のレスポンスヘッダーで、サーバーからユーザーエージェントへクッキーを送信するために使用され、ユーザーエージェントはそれを後でサーバーに送り返すことができます。

+**`Set-Cookie`** は HTTP のレスポンスヘッダーで、サーバーからユーザーエージェントへクッキーを送信するために使用され、ユーザーエージェントはそれを後でサーバーに送り返すことができます。 -

詳細については、HTTP クッキーのガイドを参照してください。

+> **Warning:** ブラウザーは、フロントエンドの JavaScript コードが `Set Cookie` ヘッダーにアクセスするのをブロックします。これは、 Fetch 仕様が `Set-Cookie` を[禁止レスポンスヘッダー名](https://fetch.spec.whatwg.org/#forbidden-response-header-name)として定義しているためで、フロントエンドコードに公開されるすべてのレスポンスから[フィルタリング](https://fetch.spec.whatwg.org/#ref-for-forbidden-response-header-name%E2%91%A0)しなければなりません。 + +詳細については、HTTP クッキーのガイドを参照してください。 - - - - - - - - - - + + + + + + + + + + + + + +
ヘッダー種別{{Glossary("Response header", "レスポンスヘッダー")}}
{{Glossary("Forbidden header name", "禁止ヘッダー名")}}いいえ
ヘッダー種別{{Glossary("Response header", "レスポンスヘッダー")}}
{{Glossary("Forbidden header name", "禁止ヘッダー名")}}いいえ
+ 禁止レスポンスヘッダー名 + はい
-

構文

+## 構文 -
Set-Cookie: <cookie-name>=<cookie-value>
-Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
-Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
-Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
-Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
-Set-Cookie: <cookie-name>=<cookie-value>; Secure
-Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
+```
+Set-Cookie: =
+Set-Cookie: =; Expires=
+Set-Cookie: =; Max-Age=
+Set-Cookie: =; Domain=
+Set-Cookie: =; Path=
+Set-Cookie: =; Secure
+Set-Cookie: =; HttpOnly
 
-Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
-Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
-Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None
+Set-Cookie: =; SameSite=Strict
+Set-Cookie: =; SameSite=Lax
+Set-Cookie: =; SameSite=None; Secure
 
 // 以下の例のように、複数のディレクティブも利用することができます。
-Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
-
+Set-Cookie: =; Domain=; Secure; HttpOnly +``` + +## 属性 + +- `=` + + - : クッキーは名前と値の組で始まります。 + + `` は任意の US-ASCII 文字の集合で、制御文字、空白、タブを除いたものです。 `( ) < > @ , ; : \ " / [ ] ? = { }` のような区切り文字も含めることができません。 + + `` は任意で二重引用符で囲むことができ、制御文字、{{glossary("Whitespace", "ホワイトスペース")}}、二重引用符、カンマ、セミコロン、バックスラッシュを除くすべての US-ASCII 文字が利用できます。 + + **エンコーディング**: 多くの実装ではクッキーの値に URL エンコーディングを施しますが、 RFC の仕様書では要求されていません。これは \ 値に許可された文字についての要件を満足させるのに役立ちます。 + + > **Note:** 一部の `` は特殊な意味を持ちます。 + > + > **`__Secure-` の接頭辞**: `__Secure-` (接頭辞にダッシュを含む) で始まるクッキー名は、 `secure` フラグを設定することが必要で、安全なページ (HTTPS) でなければなりません。 + > + > **`__Host-` の接頭辞**: `__Host-` で始まるクッキー名は、 `secure` フラグを設定し、安全なページ (HTTPS) から読み込む必要があり、ドメインを指定することができず (従ってサブドメインにも送られません)、パスが `/` である必要があります。 + +- `Expires=` {{optional_inline}} + + - : クッキーの有効期限で、 HTTP の日時タイムスタンプです。詳細な書式は {{HTTPHeader("Date")}} を参照してください。 + + 指定されなかった場合は、クッキーは**セッションクッキー**の寿命になります。セッションはクライアントが終了したときに終了するので、セッションクッキーはその時点で削除されます。 + + > **Warning:** 多くのウェブブラウザーはセッション復元と呼ばれる機能を持っており、これによってすべてのタブを保存し、次回ブラウザーを起動したときに復元することができます。ブラウザーを実際には閉じていないかのように、セッションクッキーも復元されます。 + + 有効期限が設定されていた場合、期限はサーバーではなく、クッキーが設定されているクライアントからの相対時刻で設定されます。 -

ディレクティブ

+- `Max-Age=` {{optional_inline}} + - : クッキーの期限までの秒数です。ゼロまたは負の数値の場合は、クッキーは直ちに期限切れになります。 `Expires` および `Max-Age` の両方が設定されていたら、 `Max-Age` が優先されます。 +- `Domain=` {{optional_inline}} -
-
<cookie-name>=<cookie-value>
-
クッキーは名前と値の組で始まります。 -
    -
  • <cookie-name> は任意の US-ASCII 文字の集合で、制御文字、空白、タブを除いたものです。 ( ) < > @ , ; : \ " / [ ] ? = { } のような区切り文字も含めることができません。
  • -
  • <cookie-value> は任意で二重引用符で囲むことができ、制御文字、{{glossary("Whitespace", "ホワイトスペース")}}、二重引用符、カンマ、セミコロン、バックスラッシュを除くすべての US-ASCII 文字が利用できます。 エンコーディング: 多くの実装ではクッキーの値に URL エンコーディングを施しますが、 RFC の仕様書では要求されていません。これは <cookie-value> に許可された文字についての要件を満足させるのに役立ちます。
  • -
  • __Secure- の接頭辞{{non-standard_inline}}: __Secure- (接頭辞にダッシュを含む) で始まるクッキー名は、 secure フラグを設定することが必要で、安全なページ (HTTPS) でなければなりません。
  • -
  • __Host- の接頭辞{{non-standard_inline}}: __Host- で始まるクッキー名は、 secure フラグを設定し、安全なページ (HTTPS) から読み込む必要があり、ドメインを指定することができず (従ってサブドメインにも送られません)、パスが / である必要があります。
  • -
-
-
Expires=<date> {{optional_inline}}
-
-

クッキーの有効期限で、 HTTP の日時タイムスタンプです。詳細な書式は {{HTTPHeader("Date")}} を参照してください。

+ - : クッキーを送信する先のホストです。 -

指定されなかった場合は、クッキーはセッションクッキーの寿命になります。セッションはクライアントが終了したときに終了するので、セッションクッキーはその時点で削除されます。

+ 指定されなかった場合は、既定で現在の文書の URL におけるホスト名の部分になり、サブドメインを含みません。 -
-

警告: 多くのウェブブラウザーはセッション復元と呼ばれる機能を持っており、これによってすべてのタブを保存し、次回ブラウザーを起動したときに復元することができます。ブラウザーを実際には閉じていないかのように、セッションクッキーも復元されます。

-
+ 初期の仕様書とは逆に、ドメイン名の前のドット (`.example.com`) は無視されます。 -

有効期限が設定されていた場合、期限はサーバーではなく、クッキーが設定されているクライアントからの相対時刻で設定されます。

-
-
Max-Age=<number> {{optional_inline}}
-
クッキーの期限までの秒数です。ゼロまたは負の数値の場合は、クッキーは直ちに期限切れになります。 Expires および Max-Age の両方が設定されていたら、 Max-Age が優先されます。
-
Domain=<domain-value> {{optional_inline}}
-
クッキーを送信する先のホストです。 -
    -
  • 指定されなかった場合は、既定で現在の文書の URL におけるホスト名の部分になり、サブドメインを含みません。
  • -
  • 初期の仕様書とは逆に、ドメイン名の前のドット (.example.com) は無視されます。
  • -
  • 複数のホストやドメインの値を指定することはできませんが、ドメイン指定された場合、すべてのサブドメインが常に含まれます。
  • -
-
-
Path=<path-value> {{optional_inline}}
-
リクエストの URL に含まれるべきパスです。含まれていないと、ブラウザーは Cookie ヘッダーを送信しません。
-
スラッシュ ("/") の文字はディレクトリ区切りとして解釈され、サブディレクトリも同様に一致します (例えば Path=/docs であれば、 /docs, /docs/Web/, /docs/Web/HTTP はすべて一致します)。
-
Secure {{optional_inline}}
-
セキュアクッキーは、リクエストが SSL と HTTPS プロトコルを使用して行われた場合にのみサーバーに送信されます。ただし HTTP クッキーは、例えば情報が暗号化されないなど、安全ではない仕組みを継承しているので、機密な情報や敏感な情報を転送したり格納したりしないようにしてください。 -

メモ: 安全ではないサイト (http:) は  Secure ディレクティブを付けてクッキーを設定することができなくなりました (Chrome 52 以降および Firefox 52 以降の新機能).

-
-
HttpOnly {{optional_inline}}
-
JavaScript が {{domxref("Document.cookie")}} プロパティなどを介してこのクッキーにアクセスすることを禁止します。HttpOnly で作成されたクッキーは、JavaScript で開始されたリクエスト、例えば、 {{domxref("XMLHttpRequest.send()")}} や {{domxref("fetch()")}} と共に送信されます。これにより、クロスサイトスクリプティング ({{Glossary("XSS")}}) の攻撃を軽減します。
-
SameSite=<samesite-value> {{optional_inline}}
-
-
    -
  • Strict: ブラウザは same-site のリクエスト(つまり、クッキーを設定したのと同じサイトから発信されたリクエスト)に対してのみクッキーを送信します。リクエストが現在のURLとは異なるURLから発生した場合、SameSite=Strict 属性を持つクッキーは送信されません。
  • -
  • Lax: 画像やフレームをロードするための呼び出しなどのクロスサイトサブリクエストではクッキーが抑止されますが、ユーザーがリンクをクリックするなどして外部サイトからURLに移動すると送信されます。
  • -
  • None: ブラウザはクロスサイトと same-site の両方のリクエストでクッキーを送信します。
  • -
+ 複数のホストやドメインの値を指定することは*できません*が、ドメイン*が*指定された場合、すべてのサブドメインが常に含まれます。 -

クッキーがオリジン間リクエストで送信されないことを主張することで、クロスサイトリクエストフォージェリ攻撃 ({{Glossary("CSRF")}}) に対していくらか防御することができます。

+- `Path=` {{optional_inline}} -

ブラウザーは クッキーに SameSite=Lax の既定値を持たせるよう移行しつつあります。オリジンをまたいでクッキーを送信する必要がある場合、 None ディレクティブを用いて SameSite の制約を外してください。 None ディレクティブは Secure 属性を必要とします。

-
-
+ - : リクエストの URL に含まれるべきパスです。含まれていないと、ブラウザーは `Cookie` ヘッダーを送信しません。 -

+ スラッシュ (`/`) の文字はディレクトリー区切りとして解釈され、サブディレクトリーも同様に一致します (例えば `Path=/docs` であれば、`/docs`、`/docs/Web/`、`/docs/Web/HTTP` はすべて一致します)。 - +- `Secure` {{optional_inline}} -

セッションクッキーはクライアントが終了したときに削除されます。 ExpiresMax-Age ディレクティブを指定しないとクッキーはセッションクッキーになります。

+ - : クッキーは、リクエストが SSL と HTTPS プロトコルを使用して行われた場合にのみサーバーに送信されます。ただし HTTP クッキーは、例えば情報が暗号化されないなど、安全ではない仕組みを継承しているので、機密な情報や敏感な情報を転送したり格納したりしないようにしてください。 -
Set-Cookie: sessionId=38afes7a8
+ > **Note:** Secure を設定すると、Cookie 内の機密情報 (セッションキー、ログイン情報など) へのアクセスがすべて防げると思わないでください。この属性を持つクッキーは、クライアントのハードディスクにアクセスしたり、 `HttpOnly` クッキー属性が設定されていない場合に JavaScript からアクセスしたりすることで、依然として読み取り/変更が可能です。 + > + > 安全でないサイト (`http:`) では、 `Secure` 属性のクッキーを設定できません (Chrome 52、Firefox 52 以降)。Firefox では、`Secure` 属性が localhost で設定されている場合、https: の要件は無視されます (Firefox 75以降)。 - +- `HttpOnly` {{optional_inline}} + - : JavaScript が {{domxref("Document.cookie")}} プロパティなどを介してこのクッキーにアクセスすることを禁止します。HttpOnly で作成されたクッキーは、JavaScript で開始されたリクエスト、例えば、 {{domxref("XMLHttpRequest.send()")}} や {{domxref("fetch()")}} と共に送信されます。これにより、クロスサイトスクリプティング ({{Glossary("XSS")}}) 攻撃を軽減します。 +- `SameSite=` {{optional_inline}} -

永続的クッキーは、クライアントが終了したときに期限切れにならず、特定の期限 (Expires) または特定の時間が過ぎた後 (Max-Age) に期限切れになります。

+ - : クッキーがオリジン間リクエストで送信されないことを主張することで、クロスサイトリクエストフォージェリ攻撃 ({{Glossary("CSRF")}}) に対していくらか防御することができます。 -
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT
-
+ > **Note:** [SameSite クッキー](/ja/docs/Web/HTTP/Headers/Set-Cookie/SameSite)に関する標準は、最近次のように改訂されました。 + > + > 1. `SameSite` が指定されなかった場合のクッキー送信の動作は `SameSite=Lax` になりました。以前は既定ではすべてのリクエストに対して送信されていました。 + > 2. `SameSite=None` が指定されたクッキーには `Secure` 属性も指定されるようになりました (すなわち、安全なコンテキストが必要になりました)。 + > + > 下記のオプションは新しい動作を含んでいます。特定のブラウザーの実装についての情報は、[ブラウザーの互換性](/ja/docs/Web/HTTP/Headers/Set-Cookie/SameSite#browser_compatibility)一覧表 ("`SameSite`: Defaults to `Lax`" と "`SameSite`: Secure context required" の行) を参照してください。 -
Set-Cookie: id=a3fWa; Max-Age=2592000
+ インラインオプションは、`Strict`、`Lax`、`None` です。 -

不正なドメイン

+ `Strict` はブラウザーが同一サイトへのリクエスト時にのみクッキーを送信することを意味します。すなわち、同じサイトへ向けたリクエストにクッキーを設定します。リクエストが現在とは異なる URL からであった場合、 `SameSite=Strict` 属性が付いているクッキーは送信されません。 -

オリジンのサーバーを含まないドメインに所属するクッキーは、ユーザーエージェントが拒否します

+ `Lax` は、画像やフレームの読み込みの呼び出しなどにおけるサイトをまたがるリクエストではクッキーが送信されませんが、ユーザーが外部のサイトから (リンクをたどる場合などで) このサイトに移動した場合は送信されます。 + これは `SameSite` 属性が指定されなかった場合の既定の動作です。 -

次のクッキーは originalcompany.com でホストされたサーバーから設定しようとすると拒否されます。

+ 最後に、 `None` は、オリジン間のリクエストでも同一オリジンのリクエストでもブラウザーがクッキーを送信することを意味します。 + `SameSite=None` の場合は、 `Secure` 属性が必ず設定されます。 -
Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk
+## 例 -

提供するドメインのサブドメインへのクッキーは拒否されます。

+### セッションクッキー -

以下のクッキーは、 example.com にホスティングされたサーバーからセットされた場合は拒否されます。

+**セッションクッキー**は、クライアントが終了したときに削除されます。 `Expires` や `Max-Age` ディレクティブを指定しないと、クッキーはセッションクッキーになります。 -
Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com
+``` +Set-Cookie: sessionId=38afes7a8 +``` - +### 永続的クッキー -

__Secure- または __Host- の接頭辞が付いたクッキー名は、安全な (HTTPS の) オリジンから secure ディレクティブを設定した場合のみ使用することができます。

+**永続的クッキー**は、クライアントが終了したときに期限切れにならず、特定の期限 (`Expires`) または特定の時間が過ぎた後 (`Max-Age`) に期限切れになります。 -

加えて、 __Host- の接頭辞が付いたクッキーは、 / (ホストの任意のパスという意味) を持つ必要があり、 Domain ディレクティブを持つことができません。

+``` +Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT +``` -
-

クッキーの接頭辞を実装していないクライアントでは、これらの保証を受けることができず、クッキーは常に受け入れられます。

-
+``` +Set-Cookie: id=a3fWa; Max-Age=2592000 +``` -
// どちらも安全な (HTTPS の) オリジンから受け入れられます
+### 不正なドメイン
+
+オリジンのサーバーを含まないドメインに所属するクッキーは、[ユーザーエージェントが拒否します](https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.2.3)。
+
+次のクッキーを `originalcompany.com` でホスティングされたサーバーから設定しようとすると拒否されます。
+
+```
+Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk
+```
+
+提供するドメインのサブドメインへのクッキーは拒否されます。
+
+以下のクッキーを `example.com` でホスティングされたサーバーから設定しようとすると拒否されます。
+
+```
+Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com
+```
+
+### クッキーの接頭辞
+
+`__Secure-` または `__Host-` の接頭辞が付いたクッキー名は、安全な (HTTPS の) オリジンから `secure` ディレクティブを設定した場合のみ使用することができます。
+
+加えて、 `__Host-` の接頭辞が付いたクッキーは、 `/` (ホストの任意のパスという意味) を持つ必要があり、 `Domain` ディレクティブを持つことができません。
+
+> **Warning:** クッキーの接頭辞を実装していないクライアントでは、これらの保証を受けることができず、クッキーは常に受け入れられます。
+
+```
+// どちらも安全な (HTTPS の) オリジンから受け入れられます
 Set-Cookie: __Secure-ID=123; Secure; Domain=example.com
 Set-Cookie: __Host-ID=123; Secure; Path=/
 
@@ -157,43 +196,23 @@ Set-Cookie: __Host-id=1; Secure
 
 // Domain を設定したため、拒否されます
 Set-Cookie: __Host-id=1; Secure; Path=/; Domain=example.com
-
- -

仕様書

- - - - - - - - - - - - - - - - - - -
仕様書題名
{{RFC("6265", "Set-Cookie", "4.1")}}HTTP State Management Mechanism
draft-ietf-httpbis-rfc6265bis-02Cookie Prefixes, Same-Site Cookies, and Strict Secure Cookies
+``` + +## 仕様書 + +{{Specifications}} -

ブラウザーの互換性

+## ブラウザーの互換性 -

{{Compat("http.headers.Set-Cookie")}}

+{{Compat}} -

互換性のメモ

+## 互換性のメモ -
    -
  • Chrome 52 および Firefox 52 以降、セキュリティで保護されていないサイト (http:) では、 "secure" ディレクティブ付きでクッキーを設定することはできなくなりました。
  • -
+- Chrome 52 および Firefox 52 以降、セキュリティで保護されていないサイト (`http:`) では、 `Secure` ディレクティブ付きでクッキーを設定することはできなくなりました。 -

関連情報

+## 関連情報 - +- [HTTP クッキー](/ja/docs/Web/HTTP/Cookies) +- {{HTTPHeader("Cookie")}} +- {{domxref("Document.cookie")}} +- [SameSite cookies](/ja/docs/Web/HTTP/Headers/Set-Cookie/SameSite) -- cgit v1.2.3-54-g00ecf