본문 바로가기
IT지식/개발

SameSite Cookie란? 변경된 크롬 80 쿠키 정책

by 7$ 2020. 9. 3.

크롬 80에서 쿠키 정책이 엄격하게 변경되었습니다. 크롬 브라우저의 기본 쿠키 특성 설정이 SameSite=None 에서 Samesite=Lax가 도입되었습니다. 이에 따라 타 도메인을 통할 경우 브라우저에서 쿠키값을 서버로 전달하지 않을 수 있습니다.  Samesite 정책은 CSRF (Cross-Site Request Forgery) 공격 클래스에 대한 강력한 방어책입니다. 지금까지는 CSRF와 같은 취약성을 방지하는 것이 개발자의 책임이었습니다. 그러나 2019 년 6 월 Chrome 76이 출시됨에 따라 개발자는 사용자의 클라이언트 측 환경 설정을 조정하여 CSRF 취약점을 방지 할 수 있습니다.

 

그렇다면 Samesite 설정에 대해 알아봅시다.

 

SameSite란 외부 사이트에 쿠키 전송할 범위를 설정하는 것 입니다. 

 

Set-Cookie: CookieName=CookieValue; SameSite=Strict;

Set-Cookie: CookieName=CookieValue; SameSite=Lax;

Set-Cookie: CookieName=CookieValue; SameSite=None; Secure

 

설정에 대한 옵션값은 3가지를 가지고 있습니다.

1. Strict 

이름에서 알 수 있듯이 SameSite 규칙이 엄격하게 적용되는 옵션입니다. 해당 옵션으로 설정되면 도메인이 다를 경우 쿠키를 서버로 전송하지 않습니다.

 

2. Lax

GET 요청과 같은 특정한 경우에만 쿠키를 전송합니다.

 

쿠키를 전송하는 경우

- 링크

<a href=""></a>

- Perender

<link rel = "prerender"href = ".."/>

- FORM GET

<form method = "GET"action = "...">

 

쿠키를 전송하지 않는 경우

- FORM POST

<form method = "POST"action = "...">

iframe

<iframe src = "..."> </ iframe>	

- Ajax

$ .get ( "...")	

- Image

<img src = "...">	

 

3. None

웹 사이트(도메인)가 다른 경우에도 쿠키를 전송합니다. Chrome 80의 새로운 기능으로 SameSite를 None으로 설정할 경우 쿠키에 암호화된 HTTPS 연결이 필요함을 나타내는 Secure 특성을 태깅해야 합니다.

 

– 쿠키 생성시 설정 변경 : SameSite=None; Secure
– URL은 HTTPS로 처리되어야 합니다.

 

 

크롬 브라우저에서 SameSite by default cookies 설정 변경하기

chrome://flags/#same-site-by-default-cookies

 

 

위 링크를 크롬 주소창에 붙여넣기하면 flags 설정 화면이 뜹니다.

 

일반적인 쿠키는 다음과 같습니다.

Set-Cookie: PHPSESSID=--------------------------------; httpOnly; secure;

Enabled 로 설정하면 다음과 같이 Lax 설정으로 쿠키가 셋팅됩니다.

Set-Cookie: PHPSESSID=-------------------------------; httpOnly; secure; SameSite=Lax;

 

 

 

PHP

 

7.3 부터 setcookie()의 option 파라메터로 셋팅 
    setcookie('same-site-cookie', 'foo', ['samesite' => 'Lax']);
    setcookie('cross-site-cookie', 'bar', ['samesite' => 'None', 'secure' => true]);

 

그 이하 버전인 경우 header()로 셋팅
    header('Set-Cookie: same-site-cookie=foo; SameSite=Lax');
    header('Set-Cookie: cross-site-cookie=bar; SameSite=None; Secure');
    setcookie('samesite-test', '1', 0, '/; samesite=strict');

 

 

 

실습

 

SameSite Lax로 실습

A 도메인에서 setcookie > FORM으로 B 도메인으로 이동 > FORM GET로 A 도메인으로 이동 > 쿠키 살아있음.

A 도메인에서 setcookie > FORM으로 B 도메인으로 이동 > FORM POST로 A 도메인으로 이동 > 쿠키 사라짐.

 

A 도메인

//A도메인
<?php
setcookie('mycookie','chocochip_cookie',['samesite' => 'Lax']);

var_dump($_COOKIE);

?>


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<form name='7' action="https://sevendollars.tistory.com/" method="post">
    <input type="submit">
</form>
</body>
</html>

B 도메인

//B 도메인
<?php
$start = date('Y-m-d 00:00:00', strtotime('-' . '1' . ' day'));
$end = date('Y-m-d 23:59:59', strtotime('-' . '1' . ' day'));

var_dump($start);
var_dump($end);
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<form name='8' action="http://www.B.com/samesite.php" method="get">
    <input type="submit">
</form>
</body>
</html>

 

2. A 도메인 첫 진입 시 쿠키가 구워진다. 

 

 

3. setcookie 부분을 주석 처리 후 A 도메인 두번째 진입 시 구워진 쿠키가 있다.

//A 도메인
<?php
//setcookie('mycookie','chocochip_cookie',['samesite' => 'Lax']);

var_dump($_COOKIE);

?>


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<form name='7' action="https://sevendollars.tistory.com/" method="post">
    <input type="submit">
</form>
</body>
</html>

 

A 도메인

 

3. A 도메인에서 제출 버튼 선택하여 B 도메인으로 이동

 

B 도메인

 

4. B 도메인에서 제출 버튼 선택하여 FORM GET 으로 A 도메인으로 이동

 

A 도메인

 

B 도메인에서 GET으로 A 도메인으로 이동하면, A 도메인에서 쿠키가 살아있다.

 

5. B 도메인에서 FORM POST 로 변경하여 A 도메인으로 이동.

//B 도메인
<?php
$start = date('Y-m-d 00:00:00', strtotime('-' . '1' . ' day'));
$end = date('Y-m-d 23:59:59', strtotime('-' . '1' . ' day'));

var_dump($start);
var_dump($end);
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<form name='8' action="http://www.B.com/samesite.php" method="post">
    <input type="submit">
</form>
</body>
</html>

 

A 도메인

 

B 도메인에서 FORM POST로 A 도메인으로 이동하면 쿠키가 사라져있다.