쿠키는 기본적으로 클라이언트가 서버에 요청을 보낼때 같이 자동으로 Cookie
라는 헤더에 같이 보내게 되어있다.
왜냐면, 서버는 기본적으로 stateless이기에, 현재 클라이언트의 상태(ex> 로그인 유무, 장바구니 상태, 광고 안보기 유무 등등)를 알려주기 위함이다.
쿠키에는 해당쿠키의 특성을 나타내는 attribute가 있다. 몇개만 알아보자
쿠키가 유효한 도메인을 설정한다. 아래처럼 되어있다고 해보자
set-cookie : key=value Domain=naver.com
그럼 naver.com
에서만 쿠키가 전송이 된다. 그리고 naver.com
에서만 쿠키를 읽을 수 있다.
다른 도메인에서는 보내기도 읽기도 불가능하다.
그럼 다른 도메인에서도 읽는게 가능하려면 어떻게 해야할까?
samesite
라는 속성을 이용하면 된다.
이제는 도메인 뒤에 붙는 경로를 설정한다.
path='/hello'
라고 하면 hello와 hello의 하위 경로에서는 cookie를 볼 수 있지만 그외의 경로에서는 쿠키를 볼 수 없다는 것을 뜻함
예를들어, '/' 에서는 쿠키를 볼 수 없다.
또한 request url이 /hello나 그 하위 directory일때만 cookie가 request에 담겨져 보내진다. 그러나 다른 request url일 경우엔 cookie가 담겨있지 않다.
예를 들어 'origin-server.com/hello/world' 로 request를 보내면 cookie가 담기지만, 'origin-server.com/api/world' 로 request를 보내면 cookie가 담겨있지 않게 된다.
먼저 samesite에 대해 설명하기 전 퍼스트파티
와 서드파티
에 관해 알아보고자 한다.
다른 도메인으로 쿠키를 보내는 것을 말한다. 아래와 같이 html이 구성되어있다고 해보자
<html>
<head>
<title>chat-app</title>
<meta property="og:url" content="https://chat-app.live" />
</head>
<body>
<img src="https://example.com/image.png" />
</body>
</html>
지금 접속한 사이트의 도메인을 chat-app.live라고 하자 그리고 이미지를 클릭하면 example.com으로 요청이 간다. example.com에 대한 쿠키가 있다면, 요청이 가면서 쿠키도 같이 포함되어 전송될것이다.
이때 쿠키를 서드파티 쿠키라고 부른다. 요청하는 장소와 쿠키 도메인이 다른 경우를 뜻함.
그럼 요청한 장소의 도메인과 쿠키 도메인이 같은 경우를 퍼스트 파티
라고 한다.
이와 관련하여 잠깐 CSRF(Cross Site Request Forgery)에 대해 이야기 해보자.
CSRF는 공격자가 사용자의 로그인된 사실을 이용해 쿠키를 탈취하는 악의적인 해킹방법을 뜻한다.
공격자가 A라는 사이트에 회원가입된 P라는 사람을 안다고 하자. 그리고 P의 브라우저에 저장되어있는 쿠키에 로그인 토큰이 저장되어있다고 하자.
그럼 공격자는 그럴듯한 링크를 P가 클릭하게 유도한다. 그 링크는 A라는 사이트에 요청을 가게하는 링크이다. 그리고 공격자에게 쿠키를 전송하게 하는 코드가 심겨져 있다.
클릭을 하게 되면 A 브라우저에 저장되어있는 쿠키를 공격자가 탈취하게 되는 것이다.
그래서 별도로 쿠키를 보호하지 않으면 탈취당할 수 있으니 조심하자.
그럼 이제 samesite에 대해 자세하게 알아보자. samesite에 적용가능한 정책은 크게 3가지가 있다.
크로스사이트, 즉 서드파티로 쿠키가 전송되지 않는다는 뜻이다.
현재 크롬의 디폴트 모드이다.
크로미움에서 소개된 설명을 보자
A cookie with "SameSite=Lax" will be sent with a same-site request, or a cross-site top-level navigation with a "safe" HTTP method.
같은 사이트 끼리 당연히 쿠키가 전송이 됨. 그리고 크로스사이트 같은 경우 a
태그나 302 리다이렉팅 같이 top-level에서 일어나는 navigation인 경우 쿠키 전송이 된다. 이때 safe http method는 서버 상태를 바꾸는 POST,PATCH,PUT은 차단된다. 즉 , GET method를 사용하여 전송되는 요청만 쿠키가 전송된다.
참고로, top-level이기 때문에 iframe이나 문서에 삽입된 이미지는 해당되지 않는다.
크로스사이트로 전송이 가능하다. 이때 Secure
이라는 속성이 함께 추가되어야한다. Secure
는 https끼리만 쿠키가 전송가능하도록 한다.(암호화되어서)