明示的なドメインを持つローカルホスト上のCookie


191

私はクッキーについていくつかの基本的なことを見逃しているに違いない。私は、サーバー側でクッキーを設定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は後続のリクエストで返送されないためです。

オペラ9.64:ローカルホストと.localhost両方の仕事が、私は環境設定でクッキーのリストをチェックしたときに、それがローカルホストの下にリストされていていても、ドメインは(グループ化リスト内)localhost.localに設定されています。

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

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

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

どうして?この文書は、セキュリティに関して何かしなければならないことを示しています。私は仕様全体を読んでいないことを認めなければなりません(後で読む可能性があります)が、少し奇妙に聞こえます。これに基づいて、localhostにcookieを設定することは不可能です。


13
6歳のスレッドとこれはまだ問題です。Chrome v40を使用しています。こちらをご覧ください
ガウイ2015

5
Chrome 43 ...まだバグです。
エヴァンキャロル

4
Chrome 54はここで、未解決
Vahid Amiri

6
Chrome 73 ..まだ同じ問題に直面しています。:(
Code_Crash

2
誰でもこれを解決できますか?まだ同じs ***に直面しています.. このSOの回答を参照してください
Bonjour123

回答:


235

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

で作業するlocalhost場合、Cookieドメインは完全に省略する必要があります。ただ、それを設定する""か、NULLまたはFALSE代わりにすることは"localhost"十分ではありません。

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

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


93
なぜ誰もがこれを+1しているのかわからないので、Cookieのドメインをnullまたはfalseまたは空の文字列に設定しましたが、localhostにある場合はまだ保存されません。
ジャスティン

5
ドメイン内の2つのドットについてRFC6265のどこにも見当たりません: tools.ietf.org/html/rfc6265#section-5.2.3 .Netは、ローカルドメイン内のすべてのホストに対して「.local」に設定するように言っています。これは、Opera / Safari msdn.microsoft.com/en-us/library/ckch3yd2.aspx
MandoMando

9
@ジャスティン:うーん、Domain=クッキーを設定するときは、おそらくパラメータを完全に省略する必要があります。ドメインをnullまたは空に設定しただけの場合、フレームワークはDomain=省略せずに、その値を持つパラメーターを送信する可能性がありますか?Firebugなどで確認してください。
2012年

2
@ラルフ、100万回ありがとう。このことで、私は数時間夢中になりました。うまくいけば、ドメインをnullに設定すると(私は.Netサーバースタックにいます)、魅力的なように機能します。
Xose Lluis 2013

4
これはやや不適切な言葉遣いです。「null、false、または空の文字列に設定」は、「cookieの「ドメイン」部分をまったく設定しない」と読む必要があります。たとえば、完全にlocalhostのクッキー作品のドメイン部分を残すために、簡単なテストを使用して((domain && domain !== "localhost") ? ";domain="+domain : "")
L0j1k

33

@Ralph Buchfelderに広く同意しますが、ローカルマシン(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で作業していて、domainパラメータを省略した場合、cookieはfr.localexample.comに対して正しく保存されますが、他のサブドメインでは表示されません。

私は「.localexample.com」のドメインを使用している場合、クッキーは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>

30

localhost:次を使用できます:domain: ".app.localhost"動作します。「ドメイン」パラメータは、1ドット以上を必要とするクッキーを設定するためのドメイン名に。次に、次のようなlocalhostサブドメイン全体でセッションを機能させることができますapi.app.localhost:3000


1
また、Express 3.xを使用してnode.jsサーバーでテストおよび動作express.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})
AmpT

3
ローカルドメインを使用している場合は、これを回答として選択してください。サブドメインの前にドットを付けると問題が解決します。
Foxhoundn

1
それで、これはどこ.app.から来るのでしょうか?一部のSPECの一部ですか?また、すべての非準拠ドメイン(2つのドットがないドメイン)に適用できますか?また、これは古いブラウザで動作しますか?:^)
user2173353 2016

ああ...わかりました...ブラウザをだますのはトリックです。OK。
user2173353

14

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

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

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

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

上記の期間の数は、先行期間が必要であると想定していることに注意してください。ただし、この期間は最新のブラウザで無視され、おそらく読む必要があります...

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

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

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


私はDVをしませんでしたが、他の人がした理由は、あなたの答えがあまり価値をもたらさないためだと思います。2つの期間の要件とドメイン属性を空白のままにすることは、どちらも他の回答で説明されています。また、トップレベルドメインについて追加したものは正しくないようです。私の経験では、それは要件ではありません。
TTT

@TTT先行するピリオドが無視されるため、TLDに応じて少なくとも1または2ピリオドである必要があると私が言う私の回答のビットに到達したかどうかわかりませんか?そこで、問題の背景を説明し、他ではカバーされていないと思われる点を追加しました-明示的なドメインとブラウザがデフォルトで設定するドメインでは、ルールが異なります。それは私にいくつかの価値を追加するようです。
Scott Munro 2016年

1
ドメインをnullのままにする(まったく設定しない)と、ChromeはlocalhostのCookieを保持しません。それはまだそれを無視します。これは「永続的な」Cookie(有効期限を設定するもの)にのみ適用されることに注意してください。これは、localhost(有効期限を設定しないもの)の「セッション」Cookieにハングアップするためです。
Triynko 2016年

3

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

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

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


3
Chrome V.22.0.1229.94でテストしたところm:Domain=パラメータを指定せずにlocalhostのCookieを設定すると機能します。Domain=も機能しますが、Domain=localhost機能しません。
sleske 2012年

3

私自身、この問題のトラブルシューティングにかなりの時間を費やしました。

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

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

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


2

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


はいそれでも。それでも、クロスドメインリクエストでは機能しません。ブラウザ-Safari、IE 11
Rohit Kumar

2

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


1

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


1

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

最終的に、ドメインがlocalhostである場合、Cookieからドメインを削除しただけで、Chrome 38で機能します。

以前のコード(動作しませんでした):

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=/;';
    }

1

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

set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly

1

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

「厳格な安全なCookie」に関連しているようです。ここで良い説明。それはされたクローム58にリリース 2017年4月19日に。

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

ただしDeveloper tools > Application > Cookies、同じドメインに同じ名前のセキュアCookieがある場合は、非セキュアCookieは表示されません。また、リクエストとともに非セキュアCookieを送信しません。これはChromeのバグのようです。または、この動作が予想される場合、httpページ上で安全なCookieを表示し、それらが上書きされていることを示す方法がいくつかあるはずです。

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

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

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


0

document.cookie = valuename + "=" + value + ";" + expires + "; domain =; path = /";

this "domain =; path = /"; Cookieがサブドメインで機能するため、動的ドメインを取得します。ローカルホストでテストしたい場合は機能します


0

ここでの答えはどれも私にとってうまくいきませんでした。PHPをページの最初に配置することで修正しました。

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

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


それは問題とは何の関係もありません、それはヘッダーの前に他の出力を送信するという間違いを犯していないだけです
Marnes


0

私は少し遊んでいました。

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

現在、FirefoxとChromeで動作します。しかし、私はそれをカールで動作させる方法を見つけませんでした。私はHost-Headerと--resolveを試してみましたが、運がありませんでした。

しかし、私がそれに設定した場合、それはカールで動作します

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

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


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=/

5
-1 Cookieの現在の仕様はRFC 6265のtools.ietf.org/html/rfc6265であり、4桁の年を使用できることが明示されています。したがって、ブラウザによって解釈が異なる2桁の年を使用することはお勧めできません。
sleske、2011年

正しい。RFC6265のセクション4.1.1を参照
Zen Cart

4
正解ですが、2011年6月にこのRFCは見つかりませんでした。したがって、この情報は正しくありませんが、私が書いたときはそうではありませんでした。
Tralamazza

4
わずかにとらえないでください。状況は変化し、全員が最新の状態を保つようにする必要があります。@sleskeから提供された最新情報で回答を更新し、彼の助けに感謝します。
マシューパードン14

0

多くの実験とさまざまな投稿を読んだ後、これはうまくいきました。複数の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)
}

0

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

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.