unsolved.wa 개발하기 4 - samesite 문제 해결하기

Yaminyam·2022년 5월 17일
1
post-thumbnail

서론

지난번의 작업에 이어서 유저의 쿠키를 활용하여 요청을 보낼 수 있는지에 대해 연구했다
쿠키는 브라우저에서 가지고있어 충분히 활용할 수 있을 것 이라고 생각했다
하지만 여러가지로 문제가 발생했다

첫번째 고민


브라우저에서는 모든 쿠키를 가지고 있지만

특정 웹사이트에 접속할 때 사용되는 쿠키는 주소별로 관리가 되고 있었다
이 때 다른 주소의 쿠키를 사용할 수 있는지에 대해 알아보았다

먼저 가능성에 대해서는 solved.ac 비공식 api페이지에서도 활용하고 있는것을 보면 어떻게든 방법이 존재 할 것이라고 생각했다

먼저 js로 브라우저의 쿠키를 활용 하려고 했다
하지만 이 기능은 팀원의 조언으로 쿠키에 httpOnly 옵션이 설정되어 있으면 해당쿠키가 js로 접근이 불가능 하다는 것을 알게됐다
그래서 쿠키를 가져와서 활용하는것이 아닌 solved.ac에 접속해서 쿠키가 활용되는것과 같은 동작으로 GET 결과만을 가져올 수 있는 방법이 없는지를 알아 보았다

두번째 고민

가능성을 보았던 solved.ac 비공식 api에서는 어떤식으로 동작하는지를 더 알아보았다

주의: 테스트할 경우 현재 solved.ac에 로그인한 계정으로 요청을 전송합니다.

라는 문구가 account api들에 명시되어 있었는데 요청을 실행하면 아무런 값도 날아오지 않았다
그냥 대수롭지 않게 직접 주소에 해당 요청을 하면 response가 오기에 그렇게 이용하였다
그래서 이전 개발기3편의 사진을 보면 search와 account api의 reponse 모습이 다른 것을 알 수 있다

repository를 둘어보고 있던 중 Discussions 탭에 눈에 띄는 질문이 있었다

나와 비슷한 문제를 겪는 유저가 있었고 해당 문제는 쿠키를 만들어 전달하게 되면 credentials: "omit" 설정으로 출처가 다른 쿠키는 전송하지 않도록 하는 옵션때문에 생겼다

세번째 고민

Discussions 탭이 활발 한 것 같아 나도 해당 질문에 로그인한 계정으로 요청이 되지 않는 것에 대한 질문을 남겼고 다음과 같은 답변을 받았다

제작자분이 언급해주신 환경인 Firefox로 테스트하니 response가 오는것을 확인했다
브라우저 별로 동작이 다른것을 이해할 수 없었고 특히 가장 메이저하게 사용되는 Chrome에서 우리 서비스가 이용 불가능 하다면 의미가 없을것이라 생각되어 이러한 차이가 발생하는 이유에 대해 알아보았다

크롬의 쿠키 탭을 열심히 뒤적이다 solved.ac 에 쿠키를 이용해서 요청을 보내려고 할 때 쿠키 요청이 필터링 되어 전달되지 않는것을 알게됐다

이 이유에 대해 알아보니 Samesite라는 옵션에 대해 알게 됐다

쿠키의 Samesite 옵션은 다른 도메인에서 해당 쿠키를 사용할 수 없도록 하는 것이다
하지만 이 옵션을 강화하지 않고 사용하는 사이트가 굉장히 많아 쿠키를 다른 도메인에서 활용하게 되는 XSS 보안이슈가 많이 일어났고 이를 해결하기하기 위해 구글에서는 Chrome 80 버전부터 Samesite의 default 값을 Lax로 바꿔버렸다

하지만 Firefox에서는 이 Default값을 변경하지 않고 None으로 가지고 있어 Firefox에서만 쿠키를 활용 가능 했던 것이다

외부 도움 요청

팀원들과 엄청난 고민이 있었지만 결국 해결하지 못하고 solved.ac의 개발자인 shift님에게 문의를 드려보기로 했다

(위의 내용은 블로그에 작성된 여러가지 내용이므로 생략)

정말 장문의 구구절절한 설명과 무례한 부탁임에도 불구하고 친절하고 정말 빠르게 답변을 주셔서 너무 감사했다
흔쾌히 이메일 내용도 첨부가능하도록 허락해 주신 shift님 다시 한번 감사드립니다

조언해 주신 것처럼 확장 프로그램을 이용하여 사용 할 수 있도록 하는 방법밖에 없는 것 같아 그렇게 시도해 보기로 하였다

마치며

사실 Samesite옵션을 알고 바로 포기한것은 아니고 Samesite=Lax에서 활용가능한 form을 통한 GET 호출등을 활용해서 어떻게든 꼼수를 부려보려고 했으나 전부 실패했다
form으로 받은 값을 iframe에 넣어 값을 가져오거나 Samesite값이 유저의 브라우저 단에서 필터링 됨으로 이 값을 수정해서 사용하거나 하는 식을 방법을 도전했으나
결국 이게 보안적으로 취약점을 이용하는것이라 생각돼 올바르지 못한 방법이라 생각되어 포기하였다

브라우저 쿠키와 CORS 문제들은 서비스를 배포하게될 때 정말 많이 겪는 문제라고들 하던데 이번 기회에 엄청 많이 공부가 된 것 같다

그리고 특히 이번 기회에 알게된 Samesite의 Firefox에서의 허점을 알게되어 shift님에게 문의드려 solved.ac의 보안 이슈를 해결하게 된 건 정말 뿌듯한 일인 것 같다

0개의 댓글