Problem

웹 기반의 공통 모듈이 구현된 환경에서 공통 모듈이 실제 서비스하는 도메인과 다른 경우 다른 도메인간의 호출, 이동을 하여 동작하고 있었다. 그리고 공통 모듈 호출 후 사용자 사이트로의 이동 시 쿠키 정보가 보존되지 않아 인증이 유지되지 않는 문제가 있었다. A -> B -> A 의 형태였고 B -> A 로의 이동 시 문제가 발생했었다.

Solution

원인은 브라우저 업데이트에 따른 쿠키 SameSite 속성의 기본 값의 변경이 문제였다. SameSite는 웹 애플리케이션에서 CSRF(교차 사이트 요청 위조, 다른 사이트에서 사용자의 의지와 상관없이 사이트를 수정하는 ) 공격을 방지하기 위해 HTTP 쿠키에서 설정할 수 있는 속성1인데 2020년 2월 4일 릴리즈된 Chrome 80부터 SameSite 속성 을 지정하지 않는 쿠키 는 SameSite=Lax로 변경되었다. 따라서 별도 설정되지 않은 쿠키의 경우 도메인간 post 전송은 쿠키 정보가 유지되지 않는다.

만약 교차 사이트 컨텍스트에서 전달되어야 한다면 SameSite=None을 명시적으로 요청할 수 있다. 참고로 SameSite=None인 쿠키도 보안으로 표시되고 HTTPS를 통해 전달되어야 한다2. 다음은 Samesite 의 설정 가능한 속성 목록 및 설명이다.

  • Lax: 동일한 사이트 내의 요청 및 다른 사이트의 GET 요청으로 전송됩니다. 도메인 간 GET 요청으로는 전송되지 않음.
  • Strict: 값은 쿠키가 동일한 사이트 내의 요청으로만 전송
  • None

추가 정보로 2021년 1월 19일 릴리즈된 Chrome 88까지는 정책 설정을 사용하여 기존 쿠키 동작으로 되돌릴 수 있었다. LegacySameSiteCookieBehaviorEnabledForDomainList를 사용하여 신뢰할 수 있는 도메인을 지정하거나 LegacySameSiteCookieBehaviorEnabled를 사용하여 전역 기본 값을 제어할 수 있었다. 하지만 현재 업데이트 된 최신 버전 91 버전은 (2021년 5월 25일 릴리즈) 별도 설정이 불가능 하다.

네이버 메인 쿠키 예시

특이사항

  • SameSiteNone으로 설정하기 위해서는 Secure (SSL) 옵션을 반드시 사용해야한다.
  • iOS의 Chrome은 기본 WebKit 엔진을 사용하며 현재 새 기본값을 적용하지 않습니다.
  • 현재 사용하는 브라우저가 Samesite 기본값을 적용하고 있는지는 여기에서 확인 가능하다.
  • Safari, Firefox 모두 동일한 정책을 적용할 가능성이 높음
  • SameSite examples에서 예제를 확인할 수 있다.

References