Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Web/HTTP/Headers/Set-Cookie を更新 #24862

Merged
merged 3 commits into from
Dec 4, 2024
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 77 additions & 46 deletions files/ja/web/http/headers/set-cookie/index.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
---
title: Set-Cookie
slug: Web/HTTP/Headers/Set-Cookie
l10n:
sourceCommit: 783ffd9c1cf35421242e028a1b8743cf2b1918dd
---

{{HTTPSidebar}}
Expand All @@ -10,8 +12,10 @@ slug: Web/HTTP/Headers/Set-Cookie

> [!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)しなければなりません。
>
> [フェッチ API](/ja/docs/Web/API/Fetch_API/Using_Fetch) または [XMLHttpRequest API](/ja/docs/Web/API/XMLHttpRequest_API) のリクエストが [CORS を使用する](/ja/docs/Web/HTTP/CORS#what_requests_use_cors) 場合、ブラウザーはリクエストに資格情報がない限り、サーバーのレスポンスにある `Set-Cookie` ヘッダーを無視します。資格情報の設定方法について知るには、 [フェッチ API の使用 - 資格情報を含める](/ja/docs/Web/API/Fetch_API/Using_Fetch#including_credentials)および [XMLHttpRequest の記事](/ja/docs/Web/API/XMLHttpRequest_API)を参照してください。

詳細については、<a href="/ja/docs/Web/HTTP/Cookies">HTTP クッキーのガイド</a>を参照してください。
詳しくは、 [HTTP クッキーのガイド](/ja/docs/Web/HTTP/Cookies)を参照してください。

<table class="properties">
<tbody>
Expand All @@ -32,14 +36,15 @@ slug: Web/HTTP/Headers/Set-Cookie

## 構文

```
```http
Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<number>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Partitioned
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: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Expand All @@ -56,21 +61,33 @@ Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnl
- : クッキーの名前とその値を定義します。
クッキーの定義は、名前と値の組で始まります。

`<cookie-name>` は任意の US-ASCII 文字の集合を含むことができますが、制御文字、空白、タブは例外です。
`( ) < > @ , ; : \ " / [ ] ? = { }` のような区切り文字も含むことができません。
`<cookie-name>` は任意の US-ASCII 文字の集合を含むことができますが、制御文字({{Glossary("ASCII")}} 文字のうち 0 から 31 までと 127)や区切り文字(空白、タブ、 `( ) < > @ , ; : \ " / [ ] ? = { }` など)も含むことができません。

`<cookie-value>` は任意で二重引用符で囲むことができ、制御文字、{{glossary("Whitespace", "ホワイトスペース")}}、二重引用符、カンマ、セミコロン、バックスラッシュを除くすべての US-ASCII 文字が利用できます。
`<cookie-value>` は任意で二重引用符で囲むことができ、制御文字(ASCII 文字のうち 0 から 31 までと 127)、{{glossary("Whitespace", "ホワイトスペース")}}、二重引用符、カンマ、セミコロン、バックスラッシュを除くすべての US-ASCII 文字が利用できます。

**エンコーディング**: 多くの実装ではクッキーの値に URL エンコーディングを施します
**エンコーディング**: 多くの実装ではクッキーの値に{{Glossary("Percent-encoding", "パーセントエンコーディング")}}を施します
しかし、 RFC の仕様書で要求されているわけではありません。
URL エンコーディングを使用すると、 `<cookie-value>` に許可される文字の要件を満たすのに役立ちます。
パーセントエンコーディングを使用すると、 `<cookie-value>` に許可される文字の要件を満たすのに役立ちます。

> [!NOTE]
> 一部の `<cookie-name>` は特殊な意味を持ちます。
>
> **`__Secure-` の接頭辞**: `__Secure-` (接頭辞にダッシュを含む) で始まるクッキー名は、 `secure` フラグを設定することが必要で、安全なページ (HTTPS) でなければなりません。
>
> **`__Host-` の接頭辞**: `__Host-` で始まるクッキー名は、 `secure` フラグを設定し、安全なページ (HTTPS) から読み込む必要があり、ドメインを指定することができず (従って、サブドメインにも送られません)、パスが `/` である必要があります。
> **`__Host-` の接頭辞**: 名前が `__Host-` で始まるクッキーは、それらを設定したホストサブドメインまたはドメインにのみ送信され、他のホストには送信されません。
> `secure` フラグを設定し、安全なページ (HTTPS) から読み込む必要があり、ドメインを指定することができず、パスが `/` である必要があります。

- `Domain=<domain-value>` {{optional_inline}}

- : クッキーが送信されるホストを定義します。

現在のドメインのみ、またはより上位のドメインを値として設定できます。ただし、パブリック接尾辞の場合はこの限りではありません。ドメインを設定すると、そのドメインだけでなく、そのドメインのすべてのサブドメインでもクッキーが利用できるようになります。

省略された場合、この属性はサブドメインを記載せずに、既定で現在の文書 URL のホストに設定されます。

以前の仕様とは異なり、ドメイン名の先頭のドット (`.example.com`) は無視されます。

複数のホスト/ドメイン値は許可されていませんが、ドメインを指定した場合は、サブドメインが常に含まれます。

- `Expires=<date>` {{optional_inline}}

Expand All @@ -85,17 +102,21 @@ Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnl

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

- `Max-Age=<number>` {{optional_inline}}
- : クッキーの期限までの秒数を示します。ゼロまたは負の数値の場合は、クッキーは直ちに期限切れになります。 `Expires` および `Max-Age` の両方が設定されていたら、 `Max-Age` が優先されます。
- `Domain=<domain-value>` {{optional_inline}}
- `HttpOnly` {{optional_inline}}

- : クッキーを送信する先のホストを定義します。
- : JavaScript がクッキーにアクセスできないようにします。例えば、 {{domxref("Document.cookie")}} プロパティを利用できなくします。
なお、 `HttpOnly` で作成されたクッキーは、JavaScript、例えば {{domxref("XMLHttpRequest.send()")}} や {{domxref("Window/fetch", "fetch()")}} を呼び出すことで開始されたリクエストでも送信されます。
これにより、クロスサイトスクリプティング ({{Glossary("Cross-site_scripting", "XSS")}}) に対する攻撃が軽減されます。

指定されなかった場合は、この属性は既定で現在の文書の URL におけるホスト名の部分になり、サブドメインを含みません。
- `Max-Age=<number>` {{optional_inline}}

初期の仕様書とは逆に、ドメイン名の前のドット (`.example.com`) は無視されます。
- : クッキーの期限までの秒数を示します。ゼロまたは負の数値の場合は、クッキーは直ちに期限切れになります。 `Expires` および `Max-Age` の両方が設定されていたら、 `Max-Age` が優先されます。

- `Partitioned` {{optional_inline}}

複数のホストやドメインの値を指定することは*できません*が、ドメイン*が*指定された場合、すべてのサブドメインが常に含まれます。
- : 分割ストレージをを使用してクッキーが格納されるべきであることを示します。
この設定を行う場合は、 [`Secure` ディレクティブ](#secure)も設定する必要があることに注意してください。
詳細は、[分割された独立した状態を持つクッキー (CHIPS)](/ja/docs/Web/Privacy/Privacy_sandbox/Partitioned_cookies)を参照してください。

- `Path=<path-value>` {{optional_inline}}

Expand All @@ -106,19 +127,6 @@ Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnl
- `/docs`, `/docs/`, `/docs/Web/`, `/docs/Web/HTTP` のリクエストパスはすべて一致します)。
- `/`, `/docsets`, `/fr/docs` のリクエストパスは一致しません。

- `Secure` {{optional_inline}}

- : クッキーが、リクエストが SSL と HTTPS プロトコルを使用して行われた場合にのみサーバーに送信されることを示します。ただし HTTP クッキーは、例えば情報が暗号化されないなど、安全ではない仕組みを継承しているので、機密な情報や敏感な情報を転送したり格納したりしないようにしてください。

> [!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("Cross-site_scripting", "XSS")}}) 攻撃を軽減します。
- `SameSite=<samesite-value>` {{optional_inline}}

- : クロスサイトリクエストでクッキーを送信するかどうかを制御し、クロスサイトリクエストフォージェリ攻撃 ({{Glossary("CSRF")}}) に対するある程度の防御を提供します。
Expand All @@ -136,54 +144,68 @@ Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnl
これは `SameSite` 属性が指定されていない場合の既定の動作です。

- `None`

- : ブラウザーがクロスサイトと同一サイトの両方のリクエストでクッキーを送信することを意味します。
この値を設定する際には、 `Secure` 属性も設定する必要があります。 `SameSite=None; Secure` のようにします。
この値を設定する際には、 `Secure` 属性も設定する必要があります。 `SameSite=None; Secure` のようにします。 `Secure` 属性がないと、次のエラーが記録されます。

> **メモ:** [SameSite クッキー](/ja/docs/Web/HTTP/Headers/Set-Cookie/SameSite)に関する標準は、最近次のように改訂されました。
>
> 1. `SameSite` が指定されなかった場合のクッキー送信の動作は `SameSite=Lax` になりました。以前は既定ではすべてのリクエストに対して送信されていました。
> 2. `SameSite=None` が指定されたクッキーには `Secure` 属性も指定されるようになりました(すなわち、安全なコンテキストが必要になりました)。
> 3. 同じドメインのクッキーが異なるスキーム(`http:` または `https:`)で送信された場合、同じサイトからのクッキーとは見なされなくなりました。
```plain
Cookie "myCookie" rejected because it has the "SameSite=None" attribute but is missing the "secure" attribute.

This Set-Cookie was blocked because it had the "SameSite=None" attribute but did not have the "Secure" attribute, which is required in order to use "SameSite=None".
```

> **メモ:**
> [`Secure`](#secure) のクッキーは、 HTTPS プロトコルで暗号化されたリクエストでのみサーバーに送られます。なお、安全でないサイト (`http:`) では、 `Secure` ディレクティブでクッキーを設定することができないため、 `SameSite=None` を使用することができません。
mfuji09 marked this conversation as resolved.
Show resolved Hide resolved

> [!WARNING]
> `SameSite=None; Secure` で、 [`Partitioned`](#partitioned) 属性のないクッキーは、将来のブラウザーバージョンではサイト間をまたがる場合にブロックされる可能性があります。この動作により、ユーザーデータはクロスサイトトラッキングから保護されます。[分割された独立した状態を持つクッキー (CHIPS)](/ja/docs/Web/Privacy/Privacy_sandbox/Partitioned_cookies)と[サードパーティークッキー](/ja/docs/Web/Privacy/Third-party_cookies)を参照してください。
mfuji09 marked this conversation as resolved.
Show resolved Hide resolved

- `Secure` {{optional_inline}}

- : クッキーが、リクエストが SSL と HTTPS プロトコルを使用して行われた場合にのみサーバーに送信されることを示します。ただし HTTP クッキーは、例えば情報が暗号化されないなど、安全ではない仕組みを継承しているので、機密な情報や敏感な情報を転送したり格納したりしないようにしてください。

> [!NOTE]
> Secure を設定すると、Cookie 内の機密情報 (セッションキー、ログイン情報など) へのアクセスがすべて防げると思わないでください。この属性を持つクッキーは、クライアントのハードディスクにアクセスしたり、 `HttpOnly` クッキー属性が設定されていない場合に JavaScript からアクセスしたりすることで、依然として読み取り/変更が可能です。
>
> 下記のオプションは新しい動作を含んでいます。特定のブラウザーの実装についての情報は、[ブラウザーの互換性](/ja/docs/Web/HTTP/Headers/Set-Cookie/SameSite#ブラウザーの互換性)一覧表 ("`SameSite`: Defaults to `Lax`" と "`SameSite`: Secure context required" の行)を参照してください
> 安全でないサイト (`http:`) では、 `Secure` 属性のクッキーを設定できません (Chrome 52、Firefox 52 以降)。Firefox では、`Secure` 属性が localhost で設定されている場合、https: の要件は無視されます (Firefox 75以降)

## 例

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

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

```
```http
Set-Cookie: sessionId=38afes7a8
```

### 永続的クッキー

**永続的なクッキー**は、特定の日付 (`Expires`) または特定の期間 (`Max-Age`) 後に削除され、クライアントが閉じられたときには削除されません。

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

```
```http
Set-Cookie: id=a3fWa; Max-Age=2592000
```

### 不正なドメイン

オリジンのサーバーを含まないドメインに所属するクッキーは、[ユーザーエージェントが拒否します](https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.2.3)。

次のクッキーを `originalcompany.com` でホスティングされたサーバーから設定しようとすると拒否されます。
次のクッキーを `original-company.com` でホスティングされたサーバーから設定しようとすると拒否されます。

```
Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk
```http
Set-Cookie: qwerty=219ffwef9w0f; Domain=some-company.co.uk
```

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

以下のクッキーを `example.com` でホスティングされたサーバーから設定しようとすると拒否されます。

```
```http
Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com
```

Expand All @@ -196,7 +218,7 @@ Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com
> [!WARNING]
> クッキーの接頭辞を実装していないクライアントでは、これらの保証を受けることができず、クッキーは常に受け入れられます。

```
```http
// どちらも安全な (HTTPS の) オリジンから受け入れられます
Set-Cookie: __Secure-ID=123; Secure; Domain=example.com
Set-Cookie: __Host-ID=123; Secure; Path=/
Expand All @@ -211,6 +233,15 @@ Set-Cookie: __Host-id=1; Secure
Set-Cookie: __Host-id=1; Secure; Path=/; Domain=example.com
```

### 分離されたクッキー

```http
Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;
```

> [!NOTE]
> 分離されたクッキーは、 `Secure` に設定する必要があります。さらに、分離されたクッキーを設定するには、ホスト名にバインドされ、登録可能なドメインにバインドされないように、 `__Host` 接頭辞を使用することをお勧めします。

## 仕様書

{{Specifications}}
Expand All @@ -228,4 +259,4 @@ Set-Cookie: __Host-id=1; Secure; Path=/; Domain=example.com
- [HTTP クッキー](/ja/docs/Web/HTTP/Cookies)
- {{HTTPHeader("Cookie")}}
- {{domxref("Document.cookie")}}
- [SameSite cookies](/ja/docs/Web/HTTP/Headers/Set-Cookie/SameSite)
- [Samesite cookies explained](https://web.dev/articles/samesite-cookies-explained) (web.dev blog)
Loading