302リダイレクト中にCookieを送り返すことに問題はありますか?たとえば、URLに戻るCookieを作成し、同じ応答でユーザーをリダイレクトした場合、(最新の)ブラウザーはCookieを無視しますか?
回答:
ほとんどのブラウザは、302リダイレクトでCookieを受け入れています。私はそれをかなり確信していましたが、少し調べました。すべての最新のブラウザではありません。 SilverlightクライアントHTTPスタックの削除済み/デッド/マイクロソフト接続Q / Aからのインターネットアーカイブリンクは、302リダイレクト応答のSet-Cookieを無視します(2010)
IE6に代わるものがあり、それはWindowsMobileブラウザーだと思います...
このブログ投稿によると:http://blog.dubbelboer.com/2012/11/25/302-cookie.htmlすべての主要なブラウザ、IE(6、7、8、9、10)、FF(17)、Safari (6.0.2)、WindowsとMacの両方のOpera(12.11)、リダイレクトにCookieを設定します。これは、301リダイレクトと302リダイレクトの両方に当てはまります。
1つの通知(開発者の命を救うため):
Cookieのドメインがlocalhostの場合、IEとEdgeはリダイレクト応答でSet-Cookieを無視します。
解決:
localhostの代わりに127.0.0.1を使用します。
ここでは、この問題のためのクロムのバグがある(のSet-CookieはHTTPステータス302との応答のために無視されます)。
これは非常に嫌なアプローチですが、30倍のCookie設定ブラウザの動作に本当に依存したくないmeta http-equiv="refresh"
場合は、Cookieを設定するときにHTMLの「リダイレクト」を使用できます。たとえば、PHPの場合:
<?php
...
setcookie("cookie", "value", ...);
url="page.php";
?>
<html>
<head><meta http-equiv="refresh" content=1;url="<?=$url?>"></head>
<body><a href="<?=$url?>">Continue...</a></body>
</html>
サーバーは適切な300xリダイレクトではなく200でSet-Cookieを送信するため、ブラウザはCookieを保存してから、「リダイレクト」を実行します。<a>
リンクは、メタリフレッシュを実行しない場合はブラウザでフォールバックです。
FirefoxとSafariの両方でこの問題が発生しましたが、Chromeでは発生しませんでした。私のテストによると、これはリダイレクト中にドメインが変更された場合にのみ発生します。これは、OAuth2フローでは一般的です。
私がまだ理解していない理由で、リクエスト2の一部のCookieは無視されますが、他のCookieは無視されません。ただし、リクエスト2がRefresh
ヘッダー付きのHTTP 200を返す場合(「メタリフレッシュ」リダイレクト)、Cookieはリクエスト3によって適切に設定されます。
samesite=strict
。だと思います。コールバックリクエストの場合、ブラウザは引き続き発信者がgoogle(または使用するoauthプロバイダー)であると見なします。したがって、302応答でsamesite = strict cookieを設定した場合、ブラウザはおそらく「ああ、これはGoogleからあなたのサイトへのクロスサイトリクエストです」と考え、リダイレクトされたURLをリクエストするときにCookieを送信しません。修正は、行ったようにメタリフレッシュを使用することです。そのため、リクエストは自分のサイトから送信されます。私はがらくたを話している可能性がありますが、それは私の現在の考えです。
.NetでOpenIdConnect / IdentityServerを使用しているときにこの問題が発生しました。この場合、別のAPI(異なるホスト名)が認証を処理し、メインサイトにリダイレクトします。
まず(ローカルホストでの開発の場合)、CookieSecure
オプションを設定するSameAsRequest
かNever
、http://localhost/
安全でないことに対処する必要があります。MichaelFreidgeimの回答を参照してください。
次に、CookieSameSite
属性をに設定する必要がありますLax
。そうしないと、Cookieがまったく保存されません。Strict
ここでは機能しません!
私の場合、CookieOptions.Secure = trueを設定しましたが、http:// localhostでテストし、ブラウザは設定に従ってCookieを非表示にします。
このような問題を回避するために、プロトコルRequest.IsHttpsなどに一致するcookieSecureオプションを作成できます。
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
ただし、これはすべて、ブラウザが302リダイレクトのヘッダーで行うことと直交しています。
secure=request.is_secure
フラスコで使用します。