최근 사내 홈페이지에 로그인이 불가하다거나 iframe을 이용한 결제 모듈이 말썽이라는 이야기가 있었다.
하지만 최근 홈페이지를 수정하거나 업데이트한 적이 없었기 때문에 의아했고 결제 모듈 고객센터에 연락까지 해보았지만 해결되지 않았다.
하지만 Chrome 브라우저가 아닌 이전 버전 Safari와 IE를 사용하니 결제가 원활하게 작동되는 것을 보고 Chrome 문제임을 알 수 있었다.
Google Chrome의 SameSite cookie 정책 변경으로 의해 생긴 일인데, CSRF(Cross-site request forgery) 문제를 막기 위한 것으로 보인다.
간단히 설명하자면 아래와 같다.
1. 쿠키를 저장한 도메인과 다른 도메인의 페이지에서는 쿠키에 접근할 수 없다. - www.test.com에서 쿠키를 저장했다면 auth.test.com 혹은 www.test.co.kr에서 쿠키에 접근할 수 없다. 2. 쿠키를 설정할 때 samesite라는 옵션을 추가하여 쿠키에 접근 가능한 범위를 정해주어야 한다. - 지금까지 접근 범위를 입력하지 않은 쿠키는 None처럼 작동했기 때문에 None 값을 추가해주면 이전처럼 사용할 수 있다
자세한 내용은 아래 글을 참고하길 바란다.
아래는 필자의 PHP 7.2 환경에서 해결한 내용의 코드이다.
아래와 같이 설정한다면 세션과 관련된 쿠키를 생성할 때 samesite 규칙이 Lax인 세션 쿠키가 생성된다.
if (!isset($_SESSION)) { session_set_cookie_params([ 'lifetime' => 3600 * 3, // 3시간 'path' => '/', 'domain' => $_SERVER['HTTP_HOST'], 'secure' => true, 'samesite' => 'Lax', ]); session_start(); }
session_start를 하기 전에 session_set_cookie_params를 사용하여 세션의 옵션을 설정한다.
samesite의 옵션으로 None 뿐만 아니라 Strict, Lax 등의 값으로도 지정할 수 있는데, 각각 쿠키에 접근할 수 있는 범위가 다르다.
ㅤ | 허용 범위 | 기본 값 |
Strict | 쿠키를 설정한 도메인에서만 접근 가능 | ㅤ |
Lax | 같은 서브 도메인의 경우 접근 가능 | Chrome 80 버전 이상 기본 값 |
None | 모든 웹사이트 도메인에서 접근 가능 | Chrome 80 버전 전 기본 값 |
- Strict의 경우 쿠키를 설정한 도메인에서만 접근이 가능해진다.
www.test.com에서 설정했다면 www.test.com에서만 쿠키에 접근 가능
- Lax의 경우 같은 도메인과 서브 도메인까지 쿠키에 접근할 수 있다.
www.test.com에서 설정했다면 blog.test.com이나 auth.test.com에서도 접근할 수 있다.
- None의 경우 모든 도메인에서 접근할 수 있다.
PHP, PHP Session외에도 앞으로 Cookie를 설정할 때에는 None이라도 좋으니 samesite를 추가하여 사용해야 한다.