From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- files/ja/web/http/headers/set-cookie/index.html | 201 +++++++++++++++++++++ .../http/headers/set-cookie/samesite/index.html | 119 ++++++++++++ 2 files changed, 320 insertions(+) create mode 100644 files/ja/web/http/headers/set-cookie/index.html create mode 100644 files/ja/web/http/headers/set-cookie/samesite/index.html (limited to 'files/ja/web/http/headers/set-cookie') diff --git a/files/ja/web/http/headers/set-cookie/index.html b/files/ja/web/http/headers/set-cookie/index.html new file mode 100644 index 0000000000..e15c438304 --- /dev/null +++ b/files/ja/web/http/headers/set-cookie/index.html @@ -0,0 +1,201 @@ +--- +title: Set-Cookie +slug: Web/HTTP/Headers/Set-Cookie +tags: + - Cookies + - HTTP + - Reference + - ヘッダー + - レスポンス + - レスポンスヘッダー +translation_of: Web/HTTP/Headers/Set-Cookie +--- +
{{HTTPSidebar}}
+ +

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

+ +

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

+ + + + + + + + + + + + +
ヘッダー種別{{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: <cookie-name>=<cookie-value>; SameSite=Strict
+Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
+Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None
+
+// 以下の例のように、複数のディレクティブも利用することができます。
+Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
+
+ +

ディレクティブ

+ +
+
<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")}} を参照してください。

+ +

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

+ +
+

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

+
+ +

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

+
+
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")}}) に対していくらか防御することができます。

+ +

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

+
+
+ +

+ + + +

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

+ +
Set-Cookie: sessionId=38afes7a8
+ + + +

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

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

不正なドメイン

+ +

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

+ +

次のクッキーは 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 ディレクティブを持つことができません。

+ +
+

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

+
+ +
// どちらも安全な (HTTPS の) オリジンから受け入れられます
+Set-Cookie: __Secure-ID=123; Secure; Domain=example.com
+Set-Cookie: __Host-ID=123; Secure; Path=/
+
+// Secure ディレクティブが無いため、拒否されます
+Set-Cookie: __Secure-id=1
+
+// Path=/ ディレクティブが無いため、拒否されます
+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
+ +

ブラウザーの互換性

+ + + +

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

+ +

互換性のメモ

+ + + +

関連情報

+ + diff --git a/files/ja/web/http/headers/set-cookie/samesite/index.html b/files/ja/web/http/headers/set-cookie/samesite/index.html new file mode 100644 index 0000000000..1a5dcf3310 --- /dev/null +++ b/files/ja/web/http/headers/set-cookie/samesite/index.html @@ -0,0 +1,119 @@ +--- +title: SameSite cookies +slug: Web/HTTP/Headers/Set-Cookie/SameSite +tags: + - Cookies + - HTTP + - Reference + - samesite +translation_of: Web/HTTP/Headers/Set-Cookie/SameSite +--- +
{{HTTPSidebar}}
+ +

{{HTTPHeader("Set-Cookie")}} HTTP レスポンスヘッダーの SameSite 属性を使用すると、Cookie をファーストパーティまたは同じサイトのコンテキストに制限するかどうかを宣言できます。

+ +

+ +

SameSite 属性は3つの値をとります。

+ +

Lax

+ +

Cookie はトップレベルナビゲーションで送信することが許可されており、サードパーティの Web サイトによって開始された GET リクエストとともに送信されます。これは、モダンブラウザのデフォルト値です。

+ +

Strict

+ +

Cookie はファーストパーティのコンテキストでのみ送信され、サードパーティの Web サイトによって開始されたリクエストと一緒に送信されることはありません。

+ +

None

+ +

Cookie はすべてのコンテキストで送信されます。つまり、クロスオリジンの送信が許可されます。

+ +

None はデフォルト値でしたが、最近のブラウザバージョンでは、Lax をデフォルト値にして、クロスサイトリクエストフォージェリ ({{Glossary("CSRF")}}) 攻撃のクラスに対して適度に堅牢な防御を提供しました。

+ +

None では、最新バージョンのブラウザで Secure 属性が必要です。詳細については、以下を参照してください。

+ +

一般的な警告の修正

+ +

SameSite=None requires Secure

+ +

次の警告がコンソールに表示される場合があります。

+ +
+

Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected.
+ Cookie “myCookie” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute.

+
+ +

SameSite=None を要求するが Secure とマークされていない Cookie は拒否されるため、警告が表示されます。

+ +
Set-Cookie: flavor=choco; SameSite=None
+ +

これを修正するには、SameSite=None Cookie に Secure 属性を追加する必要があります。

+ +
Set-Cookie: flavor=choco; SameSite=None; Secure
+ +

Secure Cookie は、HTTPS プロトコルを介した暗号化されたリクエストでのみサーバーに送信されます。安全でないサイト (http:) は Secure ディレクティブで Cookie を設定できないことに注意してください。

+ +

Cookies without SameSite default to SameSite=Lax

+ +

モダンブラウザの最近のバージョンでは、デフォルトで SameSite がより安全に Cookie に提供されているため、次のメッセージがコンソールに表示される場合があります。

+ +
+

Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected.
+ Cookie “myCookie” has “sameSite” policy set to “lax” because it is missing a “sameSite” attribute, and “sameSite=lax” is the default value for this attribute.

+
+ +

Cookie の SameSite ポリシーが明示的に指定されていないため、警告が表示されます。

+ +
Set-Cookie: flavor=choco
+ +

モダンブラウザを使用して SameSite=Lax を自動的に適用することもできますが、明示的に指定して、Cookie に適用される SameSite ポリシーの意図を明確に伝える必要があります。すべてのブラウザのデフォルトがまだ Lax であるわけではないため、これによりブラウザ全体のエクスペリエンスも向上します。

+ +
Set-Cookie: flavor=choco; SameSite=Lax
+ +

例:

+ +
RewriteEngine on
+RewriteBase "/"
+RewriteCond "%{HTTP_HOST}"       "^example\.org$" [NC]
+RewriteRule "^(.*)"              "https://www.example.org/index.html" [R=301,L,QSA]
+RewriteRule "^(.*)\.ht$"         "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule:01:https://www.example.org:30/:SameSite=None:Secure]
+RewriteRule "^(.*)\.htm$"        "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule:02:https://www.example.org:30/:SameSite=None:Secure]
+RewriteRule "^(.*)\.html$"       "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule:03:https://www.example.org:30/:SameSite=None:Secure]
+[...]
+RewriteRule "^admin/(.*)\.html$" "admin/index.php?nav=$1 [NC,L,QSA,CO=RewriteRule:09:https://www.example.org:30/:SameSite=Strict:Secure]
+
+ +

仕様

+ + + + + + + + + + + + + + + + + + +
仕様書タイトル
{{RFC("6265", "Set-Cookie", "4.1")}}HTTP 状態管理メカニズム
draft-ietf-httpbis-rfc6265bis-05Cookie プレフィックス、同一サイト Cookie、および厳格なセキュア Cookie
+ +

ブラウザの互換性

+ + + +

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

+ +

あわせて参照

+ + -- cgit v1.2.3-54-g00ecf