먼저 쿠키에는 First-Party, Third-Party가 있다.
간단히 설명하자면 First Party는 쿠키가 설정된 서버에서, 동일한 서버로 가는 쿠키이다.
Third Party는 다른 domain으로 이동하는 쿠키이다.
예를 들어 네이버 블로그에 유튜브 동영상을 넣을 수 있는데, 그럴 때는 서드파티가 맞지 않을까 싶다.
그래서 SameSite Cookie가 도대체 뭘까.
SameSite Cookie는 보안상의 목적으로 만들어졌다. 좀 더 정확히 말하자면 CSRF를 막기 위해서이다.
Lax는 몇 가지 예외적인 요청을 제외하고는 ThirdParty Cookie가 전송되지 않는다.
그리고 최신 브라우저들의 경우 SameSite값이 설정되어있지 않다면 Lax가 기본값이라 한다.
즉, Lax는 쿠키를 보내기 전에 SameSite인지 확인을 한 후, 소수의 경우를 제외하고는 쿠키를 보내지 않는 것이다.
그렇다면 그 예외적인 요청은 무엇일까?
https://www.invicti.com/blog/web-security/same-site-cookies-by-default/
바로 위의 경우들이다. 저기서 Lax를 보면 POST는 되지 않지만 GET의 경우에는 허용하는 것이 보인다. 내가 풀었던 CSRF관련 워게임 문제들은 주로 돈 옮기거나, 계정 변경하는 등의 문제들이 많았는데 다 POST Method로 진행되는 방법들이었다. 만약 Lax로 SameSite Cookie가 설정되어 있다면 불가능해질 것 같다.
아 같은 서버 내에서는 되겠구나
Strict는 무조건 First Party만 제공된다. 다른 말은 필요하지 않을 것 같다.
Lax에서 나온 표의 Normal이 None이랑 같다. 즉, 모든 경우에 대해 Third Party Cookie가 제공된다.
매우 취약할 것 같다.
그래서 Normal로 사용하려면 Cookie가 Secret Cookie여야 한다. 쿠키 서명을 말하는 듯 하다.
라고 생각했는데 + https도 말하는 것이다.
근데 안전한 이유는 당연하다.
Strict : Third Party Cookie 절대 안주므로 안전.
Lax : 안전한 요청에만 Third Party Cookie 제공.
None : Third Party 무조건 주지만, Secret이라 안전.
나는 이렇게 생각한다.
그래서 왜 크롬 80부터 SameSite 기본 값을 Lax로 잡는걸까
Strict로 잡으면 더 안전하지 않을까 ...?
근데 그건 그냥 개발, 사용의 편의성을 위해 사용하는 것이다. Strict가 더 안전한 것은 맞지만, 기본을 Lax로 설정한다 하더라도 어느 정도의 보안성은 잡을 수 있고 심지어 a태그 같은 부분에서도 쿠키가 안넘어가질 수 있기 때문이다.