245

私はクッキーについてのいくつかの基本的なことを見逃しているに違いありません。localhostで、サーバー側にCookieを設定しドメインをlocalhost(または.localhost)として明示的に指定した場合。一部のブラウザではCookieが受け入れられないようです。

Firefox 3.5: FirebugでHTTPリクエストを確認しました。私が見ているのは:

Set-Cookie:
    name=value;
    domain=localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

または(ドメインを.localhostに設定した場合):

Set-Cookie:
    name=value;
    domain=.localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

いずれの場合も、Cookieは保存されません。

IE8:追加のツールを使用しませんでしたが、後続のリクエストでCookieが返送されないため、Cookieも保存されていないようです。

Opera 9.64: localhostと.localhostの両方が機能しますが、[設定]でCookieのリストを確認すると、ドメインはlocalhostの下にリストされていても(リストのグループ化で)localhost.localに設定されます。

Safari 4: localhostと.localhostはどちらも機能しますが、設定では常に.localhostとしてリストされます。一方、明示的なドメインのないCookieは、ローカルホスト(ドットなし)として表示されます。

ローカルホストの問題は何ですか?このような多くの不整合があるため、ローカルホストに関連するいくつかの特別なルールが必要です。また、ドメインの前にドットを付ける必要がある理由は私には完全にはわかりません。RFC 2109は、次のように明示的に述べています。

Domain属性の値にドットが埋め込まれていないか、ドットで始まっていません。

なんで?この文書は、セキュリティで何かをしなければならないことを示しています。私は仕様全体を読んでいないことを認めなければなりません(後で読むかもしれません)が、それは少し奇妙に聞こえます。これに基づいて、ローカルホストにCookieを設定することは不可能です。

4

23 に答える 23

286

設計上、ドメイン名には少なくとも2つのドットが必要です。そうしないと、ブラウザはそれらを無効と見なします。( http://curl.haxx.se/rfc/cookie_spec.htmlのリファレンスを参照してください)

で作業するときlocalhostは、Cookieドメインを完全に省略する必要があります。に、または""の代わりに設定しないでください。十分ではない。NULLFALSE"localhost"

PHPについては、 http://php.net/manual/en/function.setcookie.php#73107のコメントを参照してください。

JavaサーブレットAPIを使用している場合は、cookie.setDomain("...")メソッドをまったく呼び出さないでください。

于 2009-07-27T13:24:55.390 に答える
43

私は@RalphBuchfelderに広く同意しますが、ローカルマシン(example.com、fr.example.com、de.example.comなど)でシステムを複製しようとしたときの実験による、これの増幅です。 OS X / Apache / Chrome | Firefox)。

/ etc / hostsを編集して、いくつかの架空のサブドメインを127.0.0.1にポイントしました。

127.0.0.1 localexample.com
127.0.0.1 fr.localexample.com
127.0.0.1 de.localexample.com

fr.localexample.comで作業していて、ドメインパラメータを省略した場合、Cookieはfr.localexample.comに正しく保存されますが、他のサブドメインには表示されません。

「.localexample.com」のドメインを使用すると、Cookieはfr.localexample.comに正しく保存され、他のサブドメインに表示されます。

「localexample.com」のドメインを使用している場合、または「localexample」または「localhost」のみのドメインを試している場合、Cookieが保存されませんでした。

「fr.localexample.com」または「.fr.localexample.com」のドメインを使用すると、Cookieはfr.localexample.comに正しく保存され、他のサブドメインでは(正しく)表示されません。

したがって、ドメインに少なくとも2つのドットが必要であるという要件は正しいように見えますが、なぜそうあるべきかはわかりません。

誰かがこれを試してみたい場合は、ここにいくつかの便利なコードがあります:

<html>
<head>
<title>
Testing cookies
</title>
</head>
<body>
<?php
header('HTTP/1.0 200');
$domain = 'fr.localexample.com';    // Change this to the domain you want to test.
if (!empty($_GET['v'])) {
    $val = $_GET['v'];
    print "Setting cookie to $val<br/>";
    setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain);
}
print "<pre>";
print "Cookie:<br/>";
var_dump($_COOKIE);
print "Server:<br/>";
var_dump($_SERVER);
print "</pre>";
?>
</body>
</html>
于 2013-05-20T14:58:35.053 に答える
39

localhost:使用できます:domain: ".app.localhost"そしてそれは動作します。'domain'パラメータには、Cookieを設定するためにドメイン名に1つ以上のドットが必要です。次に、次のようなローカルホストサブドメイン間でセッションを機能させることができますapi.app.localhost:3000

于 2014-02-27T13:45:32.387 に答える
20

次のように、Cookieが「localhost」の明示的なドメインで設定されている場合...

Set-Cookie:name = value; domain = localhost ; 有効期限=2009年7月16日木曜日21:25:05GMT; パス=/

...その後、ブラウザはそれを無視します。これは、少なくとも2つのピリオドが含まれておらず、特別に処理される7つのトップレベルドメインの1つではないためです。

...ドメインには、「。com」、「。edu」、「va.us」の形式のドメインを防ぐために、少なくとも2つまたは3つのピリオドが含まれている必要があります。以下にリストされている7つの特別なトップレベルドメインのいずれかで障害が発生したドメインは、2つの期間のみを必要とします。その他のドメインには、少なくとも3つ必要です。7つの特別なトップレベルドメインは、「COM」、「EDU」、「NET」、「ORG」、「GOV」、「MIL」、および「INT」です。

上記の期間の数は、おそらく先行期間が必要であることを前提としていることに注意してください。ただし、この期間は最近のブラウザでは無視されており、おそらく次のようになります...

少なくとも1つまたは2つの期間

domain属性のデフォルト値は、Cookie応答を生成したサーバーのホスト名であることに注意してください。

したがって、ローカルホストに設定されていないCookieの回避策は、ドメイン属性を指定せず、ブラウザにデフォルト値を使用させることです。これには、ドメイン属性の明示的な値と同じ制約がないようです。

于 2015-08-25T17:21:53.110 に答える
11

別のドメインからCookieを設定する場合(つまり、XHRクロスオリジンリクエストを作成してCookieを設定する場合)、ここでwithCredentials説明するように、Cookieのフェッチに使用するXMLHttpRequestで属性をtrueに設定する必要があります。

于 2019-01-23T11:40:43.113 に答える
4

結果はブラウザによって異なります。

Chrome-127.0.0.1は機能しましたが、localhost.localhostと""は機能しませんでした。Firefox- .localhostは機能しましたが、localhost、127.0.0.1、および""は機能しませんでした。

Opera、IE、またはSafariでテストしていません

于 2012-08-23T13:17:15.983 に答える
4

この問題のトラブルシューティングに多くの時間を費やしました。

PHPを使用していて、このページの何もうまくいきませんでした。最終的に、コードで、PHPのsession_set_cookie_params()の「secure」パラメーターが常にTRUEに設定されていることに気付きました。

httpsでローカルホストにアクセスしていなかったため、ブラウザがCookieを受け入れることはありませんでした。そこで、コードのその部分を変更して、$ _SERVER['HTTP_HOST']が'localhost'であるかどうかに基づいて'secure'パラメーターを条件付きで設定しました。今はうまくいっています。

これが誰かに役立つことを願っています。

于 2016-12-15T09:16:06.503 に答える
3

ドメインとして127.0.0.1を使用して、ローカルでテストする方がはるかに幸運でした。理由はわかりませんが、localhostや.localhostなどと結果が混在していました。

于 2012-04-01T18:28:51.517 に答える
3

あなたは利用することができます、localhost.orgあるいはむしろ.localhost.orgそれは常に解決します127.0.0.1

于 2019-03-27T19:40:43.603 に答える
3

私のために働いた唯一のことはPath=/、クッキーを設定することでした。

さらに、パス属性のデフォルト値は、2つ(FirefoxとChrome)のみをテストしましたが、ブラウザーごとに異なるようです。

ChromeはCookieをそのまま設定しようとします。path属性がヘッダーで省略されている場合、その属性はSet-Cookie保存されず、無視されます。

pathただし、Firefoxは明示的な属性がなくてもCookieを保存します。要求されたパスで設定するだけです。私のリクエストURLはで/api/v1/users、パスは/api/v1自動的に設定されました。

とにかく、両方のブラウザは、明示的なドメインがなくても、つまり、pathに設定されている場合は機能しました。したがって、各ブラウザがCookieを処理する方法にはいくつかの違いがあります。/Domain=localhost

于 2019-11-24T02:36:51.160 に答える
3

私がこのように解決したクロスサイトCookieの問題:

バックエンド

サーバ側

  • 提供:http:// localhost:8080
  • 応答を作成するときは、Cookieを設定します

属性:

SameSite=None; Secure; Path=/

クライアント側

フロントエンド(私の場合はAngular)

  • 提供:http:// localhost:4200 /
  • サーバー(バックエンド)にリクエストを送信するとき

XHR.withCredentials=trueを設定します。

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:8080/', true);
xhr.withCredentials = true;
xhr.send(null);

私の解釈:

  • バックエンドドメインとフロントエンドドメインが異なる場合、受信した応答からCookieがフロントエンドドメインのCookieストレージに保存されるかどうかの決定は、ブラウザによって行われます。ブラウザは、XHRリクエストにCookieがwithCredentials=trueあり、正しいサーバーCookie属性(HTTP Set-Cookieヘッダー)が受信された場合にのみCookieの送信を許可します

  • バックエンドドメインとフロントエンドドメインが異なる場合、リクエスト内にCookieを送信するかどうかの決定は、ブラウザによって行われます。ブラウザは、XHRリクエストが持っている場合にのみこれを許可しますwithCredentials=true

  • 言い換えると、省略された場合withCredentials=true-Cookieはリクエスト内で送信されず、NORは受信され、レスポンスから保存されます

  • 受信したCookieは、常にブラウザのCookieストレージにフロントエンドドメイン名で保存されます。サーバードメインが異なり、Cookieが正常に保存された場合、その効果は、そもそもフロントエンドドメインによって送信された場合と同じです。

  • SameSite=NoneCookie属性が省略されている場合、今日のブラウザ(Firefox / Chrome)はLax、クロスサイトCookieには厳しすぎるデフォルトモードを使用します

  • Securedcookie属性が省略されている場合-無視されます-設定SameSite=Noneする必要がありますSecured

  • ローカルホストのSecuredCookieプロパティブラウザはHTTPS/SSLを必要としないため、httpは機能しますhttps://localhost ... -EDIT 2022-03-02でフロントエンドまたはバックエンドを提供する必要はありません-Safari(v15.1)の場合、これは当てはまりません-> Safari http:// localhost + cookie with Secure-cookieは無視され、ブラウザに保存されません(解決策:Safari + http:// localhostの場合、SecureとSameSiteが提供されている場合は削除します)。

診断のヒント:

  • Cookieが送信されているかどうかを確認するには、ブラウザ開発ツールを開き、[ネットワーク]タブを確認します。バックエンドへのリクエストを見つけてヘッダーを確認します-リクエストヘッダーでCookieヘッダーを検索し、レスポンスヘッダーでSet-Cookieを検索します
  • Cookieが保存されているかどうかを確認するには-ブラウザ開発ツールを開き、ストレージマネージャ(Firefox)を参照し、Cookieを確認してフロントエンドドメイン名を検索し、Cookieが存在するかどうかを確認し、存在する場合はいつ作成されたかを確認します...
  • 最初にバックエンドでCORSを設定することを忘れないでください

参照:https ://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie

于 2021-12-09T15:51:43.510 に答える
2

提案された修正はどれも私には機能しませんでした-null、falseに設定する、2つのドットを追加するなど-は機能しませんでした。

結局、ローカルホストの場合はCookieからドメインを削除しただけで、Chrome38で機能するようになりまし

以前のコード(機能しませんでした):

document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';

新しいコード(現在機能しています):

 if(document.domain === 'localhost') {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';path=/;' ;
    } else {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';
    }
于 2014-11-05T03:42:09.470 に答える
2

https://<local-domain>を使用すると問題があるようですhttp://<local-domain>。サイトが設定した後、サイトはhttp://リクエストを含むCookieを送信しませんhttps://。リロードを強制してキャッシュをクリアしても効果はありません。Cookieの手動クリアのみが機能します。https://また、ページでそれらをクリアすると、http://ページが再び機能し始めます。

「厳密に安全なCookie」に関連しているようです。ここで良い説明。2017年4月19日にChrome58でリリースされました。

Chromeは、アドレスバーアイコンをクリックしたときにページのプロトコルに応じて正しいCookieを表示するため、実際には安全なCookieと安全でないCookieの両方を記録しているようです。

ただしDeveloper tools > Application > Cookies、同じドメインに同じ名前の安全なCookieがある場合、安全でないCookieは表示されません。また、要求とともに安全でないCookieを送信することもありません。httpこれはChromeのバグのようです。または、この動作が予想される場合は、ページ上にあるときに安全なCookieを表示し、Cookieが上書きされていることを示す方法があるはずです。

回避策は、httpサイト用かhttpsサイト用かによって異なる名前のCookieを使用し、アプリに固有の名前を付けることです。プレフィックスは、Cookieが厳密に安全であることを示します。__Secure-また、安全なものと安全でないものが衝突しないため、これも良い習慣です。プレフィックスには他にも利点があります。

/etc/hostshttpsアクセスとhttpアクセスに異なるドメインを使用することもできますが、誤って1回アクセスするhttps://localhostと、同じ名前のCookieがhttp://localhostサイトで機能しなくなります。したがって、これは適切な回避策ではありません。

Chromeのバグレポートを提出しました。

于 2018-05-14T14:19:30.163 に答える
2

多くの実験とさまざまな投稿を読んだ後、これはうまくいきました。複数のCookieを設定し、それらを読み戻し、時間を負に設定して削除することができます。

func addCookie(w http.ResponseWriter, name string, value string) {
    expire := time.Now().AddDate(0, 0, 1)
    cookie := http.Cookie{
       Name:    name,
       Value:   value,
       Expires: expire,
       Domain:  ".localhost",
       Path:    "/",
    }
    http.SetCookie(w, &cookie)
}
于 2019-11-07T19:44:56.620 に答える
1

2011年以降にオープンしているChromiumには、ドメインを「localhost」として明示的に設定している場合は、falseまたはとして設定する必要があるという問題がありますundefined

于 2015-07-14T20:58:55.133 に答える
1

同じ問題が発生し、ドメインを指定せずにCookie名自体に2つのドットを入れることで修正しました。

set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly
于 2018-01-24T15:22:36.887 に答える
1

上記のすべてのオプションを試しました。私のために働いたのは:

  1. サーバーへのリクエストでwithCredentialsがtrueに設定されていることを確認してください。別のドメインからのXMLHttpRequestは、リクエストを行う前にwithCredentialsがtrueに設定されていない限り、独自のドメインのCookie値を設定できません。
  2. 設定しないでくださいDomain
  3. セットするPath=/

結果のSet-Cookieヘッダー:

Set-Cookie: session_token=74528588-7c48-4546-a3ae-4326e22449e5; Expires=Sun, 16 Aug 2020 04:40:42 GMT; Path=/
于 2020-08-16T21:41:10.203 に答える
1

CookieはSameSite属性を指定する必要があり、None値はデフォルトでしたが、最近のブラウザバージョンではLax、クロスサイトリクエストフォージェリ(CSRF)攻撃の一部のクラスに対して適度に堅牢な防御を行うためにデフォルト値が作成されました。

に加えSameSite=Laxて、も必要ですDomain=localhost。これにより、Cookieが関連付けられlocalhostて保持されます。次のようになります。

document.cookie = `${name}=${value}${expires}; Path=/; Domain=localhost; SameSite=Lax`;

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

于 2020-09-19T04:59:21.083 に答える
0

もう1つの重要な詳細として、 expires =は次の日時形式を使用する必要があります:Wdy、DD-Mon-YYYY HH:MM:SS GMTRFC6265-セクション4.1.1)。

Set-Cookie:
  name=value;
  domain=localhost;
  expires=Thu, 16-07-2019 21:25:05 GMT;
  path=/
于 2011-06-15T05:15:26.553 に答える
0

document.cookie = valuename + "=" + value +";"+有効期限+";domain =; path = /";

this "domain =; path = /"; Cookieはサブドメインで機能するため、ダイナミックドメインを使用します。ローカルホストでテストしたい場合は動作します

于 2014-10-07T09:35:15.483 に答える
0

ここでの答えはどれも私にはうまくいきませんでした。私は自分のPHPをページの一番最初のものとして置くことでそれを修正しました。

他のヘッダーと同様に、スクリプトからの出力の前にCookieを送信する必要があります(これはプロトコルの制限です)。これには、タグや空白を含む出力の前に、この関数を呼び出す必要があります。

http://php.net/manual/en/function.setcookie.phpから

于 2015-01-09T23:29:59.500 に答える
0

少し遊んでいました。

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/

現在、FirefoxとChromeで動作します。しかし、curlで動作させる方法が見つかりませんでした。私はHost-Headerと--resolveを試しましたが、運が悪かったので、助けていただければ幸いです。

ただし、に設定すると、カールで動作します

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/

代わりは。(Firefoxでは動作しません。)

于 2017-01-30T21:41:48.647 に答える
0

バックエンドとフロントエンドがローカルホストで実行されているが、ポートが異なるという同様の問題がありました。これを修正するために、を省略Domainし、リクエストオプションSet-Cookieで使用しました。withCredentials: true

ここを参照してください

于 2021-10-11T07:31:23.180 に答える