302 리디렉션 중에 쿠키를 다시 보내는 데 문제가 있습니까? 예를 들어 URL 반환 쿠키를 만들고 동일한 응답으로 사용자를 리디렉션하면 (최신) 브라우저가 쿠키를 무시합니까?
답변:
대부분의 브라우저는 302 리디렉션에서 쿠키를 허용합니다. 나는 그것을 확신했지만 약간의 검색을했다. 모든 최신 브라우저는 아닙니다 . Silverlight Client HTTP Stack의 인터넷 아카이브 링크가 제거됨 / 죽음 / Microsoft 연결 Q / A 에서 302 리디렉션 응답에서 Set-Cookie 무시 (2010)
이제 IE6 대신 Windows Mobile 브라우저가 있다고 생각합니다.
이 블로그 게시물에 따르면 : 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"
는 동일한 사이트 및 교차 사이트 요청과 함께 전송됩니다.
하나의 알림 (개발자의 생명을 구하기 위해) :
IE와 Edge는 쿠키의 도메인이 localhost 일 때 리디렉션 응답에서 Set-Cookie를 무시 합니다.
해결책:
localhost 대신 127.0.0.1 을 사용하십시오 .
다음 은이 문제에 대한 Chromium 버그입니다 (상태 302 인 HTTP 응답에 대해 Set-cookie 무시 됨).
이것은 접근 방식에 대해 정말 눈살을 찌푸 리지만 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>
링크는 브라우저가 메타 새로 고침을 수행하지 않는 경우에 대비 한 것입니다.
Firefox와 Safari 모두 에서이 문제가 발생했지만 Chrome은 아닙니다. 내 테스트에서 이것은 리디렉션 중에 도메인이 변경 될 때만 발생합니다. 이것은 OAuth2 흐름에서 일반적입니다.
아직 파악하지 못한 이유로 요청 2의 일부 쿠키는 무시되고 다른 쿠키는 무시됩니다. 그러나 요청 2가 Refresh
헤더 와 함께 HTTP 200을 반환하는 경우 ( "메타 새로 고침"리디렉션) 쿠키는 요청 3에 의해 올바르게 설정됩니다.
samesite=strict
. 콜백 요청의 경우 브라우저는 여전히 발신자가 Google (또는 사용하는 oauth 공급자)이라고 생각합니다. 따라서 302 응답에서 samesite = strict 쿠키를 설정하면 브라우저는 "아하! 이것은 Google에서 귀하의 사이트로 보내는 교차 사이트 요청입니다"라고 생각하므로 리디렉션 된 URL을 요청할 때 쿠키를 보내지 않습니다. 수정은 메타 새로 고침을 사용하는 것이므로 요청이 자신의 사이트에서 나옵니다. 나는 헛소리를 할 수 있지만 그것이 나의 현재 생각입니다.
별도의 API (다른 호스트 이름)가 인증을 처리하고 기본 사이트로 다시 리디렉션하는 .Net에서 OpenIdConnect / IdentityServer를 사용하는 동안이 문제가 발생했습니다.
먼저 (localhost에서 개발하는 경우) 보안되지 않도록 CookieSecure
옵션을 설정 SameAsRequest
하거나 Never
처리 http://localhost/
해야합니다. Michael Freidgeim 의 답변을 참조하십시오 .
둘째, CookieSameSite
속성을 로 설정해야합니다 Lax
. 그렇지 않으면 쿠키가 전혀 저장되지 않습니다. Strict
여기서 작동하지 않습니다!
제 경우에는 CookieOptions.Secure = true로 설정 했지만 http : // localhost 에서 테스트 했으며 브라우저는 설정에 따라 쿠키를 숨겼습니다.
이러한 문제를 피하기 위해 프로토콜 Request.IsHttps와 일치하도록 쿠키 보안 옵션을 만들 수 있습니다.
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
302 리디렉션 에서 헤더로 수행하는 작업과 직교합니다 .
secure=request.is_secure
플라스크에서 사용하십시오 .