302 리디렉션 중 브라우저 쿠키 보내기


88

302 리디렉션 중에 쿠키를 다시 보내는 데 문제가 있습니까? 예를 들어 URL 반환 쿠키를 만들고 동일한 응답으로 사용자를 리디렉션하면 (최신) 브라우저가 쿠키를 무시합니까?


조금 읽으면 세션 변수가 서버 측이고 클라이언트 예측 가능성에 의존하지 않기 때문에 쿠키보다 낫다고 생각합니다.
ADTC 2011

답변:


41

대부분의 브라우저는 302 리디렉션에서 쿠키를 허용합니다. 나는 그것을 확신했지만 약간의 검색을했다. 모든 최신 브라우저는 아닙니다 . Silverlight Client HTTP Stack의 인터넷 아카이브 링크가 제거됨 / 죽음 / Microsoft 연결 Q / A 에서 302 리디렉션 응답에서 Set-Cookie 무시 (2010)

이제 IE6 대신 Windows Mobile 브라우저가 있다고 생각합니다.


1
지정한 포럼 페이지는 URL로 액세스 할 수 없습니다. IE6 및 Windows Mobile 브라우저가 그렇지 않다는 의미입니까?
hiroshi 2013

1
링크가 이동했습니다. 나는 완전히 동일한 내용으로 새로운 링크를 설정했습니다. 나는 모바일 부가 기능에 대한 버그의 자신의 세트 IE의 특정 버전을 의미
regilero의

53

이 블로그 게시물에 따르면 : http://blog.dubbelboer.com/2012/11/25/302-cookie.html 모든 주요 브라우저, IE (6, 7, 8, 9, 10), FF (17), Safari (6.0.2), Opera (12.11)는 Windows와 Mac 모두에서 리디렉션에 쿠키를 설정합니다. 이는 301 및 302 리디렉션 모두에 해당됩니다.

@Benni가 언급했듯이 :

https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies

쿠키의 SameSite 속성은 쿠키를 자사 또는 동일 사이트 컨텍스트로 제한해야하는지 여부를 지정합니다. SameSite의 여러 값이 허용됩니다.

  • 와 함께 쿠키 "SameSite=Strict"는 동일한 사이트 요청으로 만 전송됩니다.
  • 쿠키 "SameSite=Lax"는 동일한 사이트 요청 또는 "안전한"HTTP 메소드를 사용하는 교차 사이트 최상위 탐색과 함께 전송됩니다.
  • 쿠키 "SameSite=None"는 동일한 사이트 및 교차 사이트 요청과 함께 전송됩니다.

우리가 정확하게 말할 수없는 불행하게도이 목록은 크롬을 포함하지 않는 모든 ... 주요 브라우저를
MestreLion

3
@MestreLion : 내 Chrome 브라우저에서 작동합니다. 그래서 .. 이제 드디어 2019
Michael

1
동일한 사이트 정책에 따라 다릅니다. 엄격을 사용하면 여전히 작동하지 않습니다.
Benni

42

하나의 알림 (개발자의 생명을 구하기 위해) :

IE와 Edge는 쿠키의 도메인이 localhost 일 때 리디렉션 응답에서 Set-Cookie를 무시 합니다.

해결책:

localhost 대신 127.0.0.1 을 사용하십시오 .


12
IE와 Edge는이 문제를 "수정"했을 수 있으므로 127.0.0.1에도 쿠키를 설정하지 않습니다. 도! 그리고 그들은 개발자들이 IE를 모두 좋아하지 않는 이유를 궁금해합니다 ... 귀하의 답변은 여전히 ​​약 4 시간 동안 머리를 긁적입니다. 감사!
GlenPeterson

19

다음 은이 문제에 대한 Chromium 버그입니다 (상태 302 인 HTTP 응답에 대해 Set-cookie 무시 됨).


1
이것이 사실이라면 정말 나쁜 소식입니다 :-(
MestreLion

나는 그들이 그것을 고쳤다 고 생각합니다. 버그 보고서는 여전히 "WontFix"로 표시되지만 내 Chrome 브라우저에서는 작동합니다.
Michael

크롬은 크롬 아니라고 @Michael 참고 : lifewire.com/chromium-and-chrome-differences-4172101 - 그 크롬을 위해 반드시 사실이 아니다는 크롬에서 작동 할 수있는 동안 것을 의미
토마스

4

이것은 접근 방식에 대해 정말 눈살을 찌푸 리지만 30x 쿠키 설정 브라우저 동작에 정말로 의존하지 않으려면 쿠키를 설정할 meta http-equiv="refresh"때 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를 전송하므로 브라우저는 쿠키를 저장 한 다음 "리디렉션"을 수행합니다. 이 <a>링크는 브라우저가 메타 새로 고침을 수행하지 않는 경우에 대비 한 것입니다.


3

Firefox와 Safari 모두 에서이 문제가 발생했지만 Chrome은 아닙니다. 내 테스트에서 이것은 리디렉션 중에 도메인이 변경 될 때만 발생합니다. 이것은 OAuth2 흐름에서 일반적입니다.

  1. OAuth2 ID 공급자 (GitHub, Twitter, Google)가 브라우저를 다시 앱으로 리디렉션합니다.
  2. 앱의 콜백 URL이 승인을 확인하고 로그인 쿠키를 설정 한 다음 다시 도착 URL로 리디렉션합니다.
  3. 쿠키 설정없이 도착 URL이로드됩니다.

아직 파악하지 못한 이유로 요청 2의 일부 쿠키는 무시되고 다른 쿠키는 무시됩니다. 그러나 요청 2가 Refresh헤더 와 함께 HTTP 200을 반환하는 경우 ( "메타 새로 고침"리디렉션) 쿠키는 요청 3에 의해 올바르게 설정됩니다.


1
이 wrt oauth 콜백 문제의 원인은 samesite=strict. 콜백 요청의 경우 브라우저는 여전히 발신자가 Google (또는 사용하는 oauth 공급자)이라고 생각합니다. 따라서 302 응답에서 samesite = strict 쿠키를 설정하면 브라우저는 "아하! 이것은 Google에서 귀하의 사이트로 보내는 교차 사이트 요청입니다"라고 생각하므로 리디렉션 된 URL을 요청할 때 쿠키를 보내지 않습니다. 수정은 메타 새로 고침을 사용하는 것이므로 요청이 자신의 사이트에서 나옵니다. 나는 헛소리를 할 수 있지만 그것이 나의 현재 생각입니다.
Ilan

2

별도의 API (다른 호스트 이름)가 인증을 처리하고 기본 사이트로 다시 리디렉션하는 .Net에서 OpenIdConnect / IdentityServer를 사용하는 동안이 문제가 발생했습니다.

먼저 (localhost에서 개발하는 경우) 보안되지 않도록 CookieSecure옵션을 설정 SameAsRequest하거나 Never처리 http://localhost/해야합니다. Michael Freidgeim 의 답변을 참조하십시오 .

둘째, CookieSameSite속성을 로 설정해야합니다 Lax. 그렇지 않으면 쿠키가 전혀 저장되지 않습니다. Strict여기서 작동하지 않습니다!


-1

제 경우에는 CookieOptions.Secure = true로 설정 했지만 http : // localhost 에서 테스트 했으며 브라우저는 설정에 따라 쿠키를 숨겼습니다.

이러한 문제를 피하기 위해 프로토콜 Request.IsHttps와 일치하도록 쿠키 보안 옵션을 만들 수 있습니다.

new CookieOptions()
                {
                    Path = "/",
                    HttpOnly = true,
                    Secure = Request.IsHttps,
                    Expires = expires
                }

2
이 경우 보안 플래그를 설정하지 마십시오 . 플래그의 요점은 HTTPS를 통해 연결할 때만 쿠키를 사용하도록 브라우저에 지시하는 것입니다. 조건부로 플래그를 설정하면 의미가 다소 변경되고 HTTPS-> HTTP에서 전환되는 쿠키가 손실되지만 HTTP-> HTTPS에서 이동할 때는 그렇지 않습니다. 이 모든 것은 브라우저가 Set-Cookie302 리디렉션 에서 헤더로 수행하는 작업과 직교합니다 .
Martijn Pieters

1
그 때 -3 표로 답하면 문제가 해결됩니다. Secure = true로 설정했지만 localhost에서 http를 사용하여 테스트한다는 사실을 잊었습니다. 멍청한 실수. secure=request.is_secure플라스크에서 사용하십시오 .
Eloff
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.