ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PG결제 연동 시 Chrome에서 발생하는 이슈 해결
    보안 2021. 12. 3. 16:59

    PG모듈 (이니시스) 연동 시 크롬80 이상의 버전에서 same site 보안 이슈가 발생하는 것을 확인했다.

    해당 문제는 동일 출저가 아닌 교차 컨텍스트에서 쿠키를 공유할 수 없도록 하는 구글의 패치에서 비롯되었다.

    처음엔 왜 오류가 발생하는 것일까 삽질을 한참했다.

    https://www.inicis.com/blog/archives/121508 참고

     

    나는 이 문제를 우회할 수 있도록하기 위해 여러 방법을 고민했다.

    핵심은 jSESSIONID 였다. 

    PG승인 이후 returnUrl에서 세션을 검증 및 사용해야하는 일이 있는데, same site 보안 패치로 인하여 세션이 끊겨서 결제 마무리 단계에서 error가 발생하는 것이다.

     

    첫번째로 고민한 것은, 'returnUrl에서 세션을 사용하지 않으면 어떨까' 였다.

    하지만 사내에서 사용하는 프레임 워크 내 filter/interceptor에서 이미 세션을 검증하고 있었다.

    결국 returnUrl의 서블릿 내용이 중요한 것이 아니라, 프레임워크를 뜯어 고치거나 filter/interceptor를 뜯어고치는 등의 영향도 큰 작업이 필요했다. 따라서 다른 방법을 생각했다.

     

    두번째로 고민한 것은 javaScript 혹은 JAVA언어로 쿠키를 조작하는 것이었다.

    하지만 javaScript로는 다른 쿠키면 모를까, JSESSIONID를 조작하는 것은 불가능했다.

    하긴 브라우저에서 간단하게 세션을 마음대로 조작할 수 있는게 말이 안되는 일이다.

    JAVA로도 시도해보았으나 역시 JSESSIONID를 조작할 수는 없었다.

    same-site 관련 쿠키설정을 지원하는 WAS면 가능한 것으로 파악되었는데, 사내에서 사용하는 WAS는 해당 설정이 없었다.

     

    결국 마지막에 찾은 해결책은

    same site를 검증하지 않는 JSESSIONID를 중복 등록하여 same site 이슈를 회피하는 것이었다.

    그런데 same site 옵션이 none인 같은 쿠키를 중복등록한다고해서 간단히 끝나지 않았다.

    쿠키에는 path 옵션도 들어가게 되는데, 쿠키의 path가 검증하고자 하는 서블릿 URL의 path와 달리 등록될 경우 여전히 세션 검증에 실패하고 말았다.

    그렇다고 단순히 스크립트에서 최상위 path('/')를 지정하여 등록하는 것은 브라우저가 허용하지 않았다.

     

    그래서 인덱스에서 request.getSession().getId()로 세션 쿠기 value를 가져온 후

    document.cookie = 'JSESSIONID={$쿠키값}; SameSite=None; Secure;'; 로 등록했더니 최상위 path로('/') 자동 설정되어 중복 등록에 성공했다.

    그리고 유저들에게 하위 path가 있는 url이 아닌, 도메인으로 접속&로그인 해달라고 부탁했다.

    사실 이것은 관리자 시스템에서 발생한 이슈였기에 가능한 우회 방법이었다.

     

    만약 고객이 사용하는 시스템의 이슈였다면, WAS혹은 프레임워크를 뒤엎어서라도 해결해야하는 문제였다.

    갑자기 잘 쓰고 있는 크롬이 밉게 보였다.

    '보안' 카테고리의 다른 글

    log4j2 취약점 해결 과정  (0) 2021.12.17
    XSS란?  (0) 2019.12.27

    댓글