PHP

[PHP] Chrome 크롬 80, 크롬84 쿠키 정책, setcookie SameSite=None 설정, 크롬 80 버전 이후

chsr 2022. 1. 10. 14:25
728x90
반응형

■ PHP Chrome 크롬 80, 크롬84 쿠키 정책, SameSite=None 설정, 결제 세션 끊김 현상, 크롬 결제 안됨, 윈도우 서버 asp


■ SameSite 설정

사이트 내 쿠키 전송 범위를 설정하는 값으로 setcookie 설정에 대한 옵션값은 3가지 존재

  • Strict
    현 도메인 및 대상 도메인이 동일해야만 쿠키가 포함되어 전송됨
    (현 도메인과 다른 경우 쿠키 제공 안됨)
  • Lax
    Strict와 동일하게 도메인이 다른 경우 쿠키 제공 안됨
    그러나 <a href="">, <link rel = "prerender" href = "">, <form method=GET> 경우 예외로 쿠키 제공 됨
  • None
    주소가 검증되지 않음, 어느 도메인이든 쿠키 제공 (크롬 80의 경우 None 설정 시 Secure 필수, HTTPS)

크롬(Chrome) 80 버전부터 쿠키 정책 변경 사항 및 관련 이슈

- 구글 크롬 버전 80 이후부터 쿠키의 SameSite 속성 기본 디폴트값이 None > Lax 로 변경
- 기존 외부 사이트와 도메인 주소가 상이하여도 제한 없이 공유 가능하였지만,
크롬 80 이후 도메인 주소가 다를 경우 쿠키 사용이 제한됨
Https 로 운영되는 사이트(SSL)에 한해 SameSite = None; 정책을 사용할 수 있음


■ SameSite 설정 방법

- PHP 7.3 이하 버전의 경우 (SSL 환경에서만 적용 가능)

setcookie($name, $value, 0, "/; SameSite=None; Secure;");

- PHP 7.3 이상 버전

setcookie('same-site-cookie', 'foo', ['samesite' => 'Lax']);
setcookie('cross-site-cookie', 'bar', ['samesite' => 'None', 'secure' => true]); // 도메인이 다를 경우

■ 세션 끊김, 쿠키 samesite 대체 방법

session_start() 대신 하기 함수로 대체

function session_start_samesite($options = array()){
  $res = @session_start($options);
  $headers = headers_list();
  foreach ($headers as $header) {
    if (!preg_match('~^Set-Cookie: PHPSESSID=~', $header)) continue;
    $header = preg_replace('~; secure(; HttpOnly)?$~', '', $header) . '; secure; SameSite=None';
    header($header, false);
  }
  return $res;
}

session_start_samesite();
728x90
반응형