우리는 알아 냈습니다.
어떻게 든 "ASP.NET_SessionId"쿠키의 "SameSite"속성은 기본적으로 "Lax"로 설정되며 이는 결제 게이트웨이의 자바 스크립트 코드로 작성된 요청에 세션 쿠키가 추가되지 않도록합니다.
이 값을 무시하고 "없음"으로 설정하기 위해 web.config 파일에 다음 규칙을 추가했습니다.
<configuration>
<system.webServer>
<rewrite>
<outboundRules>
<rule name="Add SameSite" preCondition="No SameSite">
<match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
<action type="Rewrite" value="{R:0}; SameSite=None" />
<conditions>
</conditions>
</rule>
<preConditions>
<preCondition name="No SameSite">
<add input="{RESPONSE_Set_Cookie}" pattern="." />
<add input="{RESPONSE_Set_Cookie}" pattern="; SameSite=None" negate="true" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
업데이트 1 : 위의 구성을 추가하면 최신 브라우저의 문제가 해결되었지만 이전 버전의 Micosoft Edge 및 Internet Explorer에 여전히 문제가 있음을 깨달았습니다.
따라서 우리는 cookieSameSite = "None"속성을 web.config 파일의 sessionState 노드에 추가해야했습니다.
<sessionState cookieSameSite="None" />
이전 .net 프레임 워크 버전은이를 지원하지 않으므로 사이트에 오류 페이지가 표시되므로이 구성 변경에주의하십시오.
그런데 우리는 여전히 iOS 12의 브라우저에 문제가 있습니다. 그러나 이것이 확인 된 버그 와 관련 이 있다고 생각합니다.
업데이트 2 : IOS 문제에 대한 가능한 수정 사항은 zemien의 답변 참조
업데이트 3 : 우리의 연구 결과를 zemien의 답변에 대한 제안과 결합하여 다음과 같은 다시 쓰기 규칙을 만들었습니다. 프로덕션 환경에서이 구성을 사용하고 있습니다. 그러나 호환되는 브라우저에 대해서는 "SameSite : None"속성으로 모든 쿠키를 표시하고 호환되지 않는 브라우저에 대해서는 SameSite 속성이있는 경우 제외합니다. 복잡해 보일 수 있지만 주석 줄을 통해 설명하려고했습니다.
이것은 프로덕션 환경에서 사용하는 최종 구성입니다.
<configuration>
<system.webServer>
<rewrite>
<outboundRules>
<preConditions>
<!-- Browsers incompatible with SameSite=None -->
<preCondition name="IncompatibleWithSameSiteNone" logicalGrouping="MatchAny">
<add input="{HTTP_USER_AGENT}" pattern="(CPU iPhone OS 12)|(iPad; CPU OS 12)" />
<add input="{HTTP_USER_AGENT}" pattern="(Chrome/5)|(Chrome/6)" />
<add input="{HTTP_USER_AGENT}" pattern="( OS X 10_14).*(Version/).*((Safari)|(KHTML, like Gecko)$)" />
</preCondition>
<!-- Rest of the browsers are assumed to be compatible with SameSite=None -->
<preCondition name="CompatibleWithSameSiteNone" logicalGrouping="MatchAll">
<add input="{HTTP_USER_AGENT}" pattern="(CPU iPhone OS 12)|(iPad; CPU OS 12)" negate="true" />
<add input="{HTTP_USER_AGENT}" pattern="(Chrome/5)|(Chrome/6)" negate="true" />
<add input="{HTTP_USER_AGENT}" pattern="( OS X 10_14).*(Version/).*((Safari)|(KHTML, like Gecko)$)" negate="true" />
</preCondition>
</preConditions>
<!-- Rule 1: Remove SameSite part from cookie for incompatible browsers if exists -->
<rule name="Remove_SameSiteCookie_IfExists_ForLegacyBrowsers" preCondition="IncompatibleWithSameSiteNone">
<match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=.*)" />
<action type="Rewrite" value="{R:1}" />
</rule>
<!-- Rule 2: Override SameSite's value to None if exists, for compatible browsers -->
<rule name="Override_SameSiteCookie_IfExists_ForModernBrowsers" preCondition="CompatibleWithSameSiteNone">
<match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=.*)" />
<action type="Rewrite" value="{R:1}; SameSite=None" />
</rule>
<!-- Rule 3: Add SameSite attribute with the value None if it does not exists, for compatible browsers -->
<rule name="Add_SameSiteCookie_IfNotExists_ForModernBrowsers" preCondition="CompatibleWithSameSiteNone">
<match serverVariable="RESPONSE_Set-Cookie" pattern=".*"/>
<!-- Condition explanation: Cookie data contains some string value but does not contain SameSite attribute -->
<conditions logicalGrouping="MatchAll">
<add input="{R:0}" pattern="^(?!\s*$).+"/>
<add input="{R:0}" pattern="SameSite=.*" negate="true"/>
</conditions>
<action type="Rewrite" value="{R:0}; SameSite=None" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>