크롬 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>
3. A 도메인에서 제출 버튼 선택하여 B 도메인으로 이동
4. B 도메인에서 제출 버튼 선택하여 FORM GET 으로 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>
B 도메인에서 FORM POST로 A 도메인으로 이동하면 쿠키가 사라져있다.
'IT지식 > 개발' 카테고리의 다른 글
[Apache2] 가상호스트 설정. 여러 도메인 운영하기. 도메인과 포트 (0) | 2021.12.15 |
---|---|
녹스로 hosts 설정하기 (0) | 2021.12.07 |
[구름레벨] 사은품 교환하기 PHP (0) | 2020.08.27 |
[구름레벨] 문제선정하기 PHP (0) | 2020.08.17 |
[구름레벨] 근묵자흑 PHP (0) | 2020.08.17 |