드림핵 강의를 통해 Cookie의 보안설정을 알아봅시다.
Cookie Domain/Path
아래와 같이 Cookie가 설정되었을 때 어떻게 되는지 알아봅시다.
1
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Path=<cookie-path>;
Domain => 특정 도메인에서만 해당 쿠키를 사용할 수 있음 Path => 특정 경로에서만 쿠키를 사용할 수 있습니다.
예를 들어, Path=/glasses
으로 설정되어있을 때 /user
에서는 쿠키의 정보를 가져올 수 없습니다.
Subdomain 관리의 중요성
서브도메인 사용시 쿠키의 domain 설정을 하지 않은 경우 모든 서브도메인에서 동일한 쿠키가 사용됩니다.
Cookie Domain | dreamhack.io | test.dreamhack.io | debug.dreamhack.io |
---|---|---|---|
.dreamhack.io | O | O | O |
test.dreamhack.io | X | O | X |
debug.dreamhack.io | X | X | O |
예를 들어, mail.glasses.com
, auth.glasses.com
, book.glasses.com
등의 서브도메인에 있을때 하나의 서브 도메인에서 취약점을 통해 쿠키 탈취가 가능한경우 탈취한 쿠키를 이용하여 다른 서비스에 접근이 가능합니다.
HttpOnly
HttpOnly 설정시 Javascript의 document.cookie 등을 통해 쿠키에 접근할 수 없으며, HTTP 요청일때만 사용됩니다.
XSS 취약점을 통해 document.cookie에 접근할 수가 없다는 뜻입니다.
다만 HTTP 요청을 전송하여 원하는 정보를 획득하거나, 해당 쿠키 사용자의 권한으로 로직을 수행하는등의 공격은 가능합니다.
[예시 코드]
1
2
3
4
5
6
var xhr = new XMLHttpRequest();
xhr.open("GET", "/api/v1/user/detail/", true);
xhr.onload = function () {
console.log(xhr.responseText);
};
xhr.send(null);
Secure
Secure 속성은 HTTPS 프로토콜 상에서 암호화된 요청일 경우에만 쿠키를 전송합니다.
http:// -> 쿠키 전송 X https:// -> 쿠키 전송 O
Samesite Cookie
SameSite Cookie는 Cross-Site 요청에 대한 쿠키 전송 여부를 설정하여 사용자의 Privacy를 보호하고, CSRF 공격을 방어하는 쿠키의 속성입니다.
Cross-Site CSRF 형태
쿠키는 third-party cookies 전송이 가능합니다.
예를 들어 glasses.com
에서 dreamhack.io
에 요청시 쿠키도 함께 전송됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
<img src='https://dreamhack.io/path?key=value'>
<script src='https://dreamhack.io/path?key=value'></script>
<link href="https://dreamhack.io/path?key=value" rel="stylesheet">
<form id="csrf-form" action="https://dreamhack.io/path" method="POST">
<input type="text" name="key" value="value">
</form>
<script>
window.onload = function(){
var csrfform = document.getElementById("csrf-form");
csrfform.submit();
}
</script>
Samesite Cookie는 동일한 사이트에 대한 요청 시에만 쿠키를 사용하는 설정
samesite cookie 속성 | 설명 |
---|---|
None | Samesite Cookie를 적용하지 않음 |
LAX | 특정 상황에서만 사용.(Default) |
Strict | 동일한 사이트에서만 사용 |
Chorme 80버전 부터 Samesite 속성이 없으면 기본적으로 LAX를 설정
None
설정을 하기 위해허는 해당 쿠키에 Secure
옵션이 설정되어 있어야합니다.
Cross-site에서 전송할 수 있는 상황
Request Type | Sample Code | Cookie Sent |
---|---|---|
Link | <a href="..."></a> | None, Lax |
Prerender | <link rel="prerender" href="..."/> | None, Lax |
Form GET | <form action="..."method="GET"></form> | None, Lax |
Form POST | <form action="..." method="POST"></form> | None |
iframe | <iframe src="..."></iframe> | None |
img | <img src="..."> | None |