SilentShield 2.6은 한 쇼핑몰의 결제 단계 가입 실패를 일으킨 허점을 해결합니다. 일반 submit 대신 버튼 클릭과 AJAX로 전송되는 폼이 저희에게 보고되지 않았습니다. 이 글에서는 무슨 일이 있었는지, 무엇이 바뀌는지, 무엇을 하셔야 하는지 설명합니다. 전체 목록은 변경 내역에서 확인하실 수 있습니다.
무엇이 잘못되었나
위젯은 입력과 마우스 움직임을 측정하고, 방문자가 폼을 제출할 때 그 결과를 보고합니다. 이때 브라우저의 submit 이벤트를 수신했습니다. 그런데 일부 쇼핑몰은 이 이벤트를 전혀 발생시키지 않습니다. 예를 들어 OpenCart 3 결제는 가입 단계를 AJAX로 불러오고, 일반 버튼과 jQuery.ajax로 전송합니다.
그 결과 고객님의 서버가 /v1/verify로 어떤 방문자에 대해 문의했을 때, 저희가 받은 것은 첫 페이지 이벤트뿐이었습니다. 입력 데이터와 마우스 데이터가 없으니 판정은 “의심”이었고, 실제 사용자의 가입이 실패했습니다. 폼은 보호되고 있었지만, 보호 기능이 방문자를 볼 수 없었습니다.
무엇이 바뀌나
버전 2.6부터 위젯은 이러한 방식의 제출도 인식합니다. 위젯은 behavior_nonce를 담은 요청을 살펴봅니다. 그 요청이 submit 이벤트 없이 페이지를 떠나고 폼이 아직 검사되지 않았다면, 위젯은 요청을 잠시 보류하고 수집한 입력 데이터와 마우스 데이터와 함께 제출을 보고한 다음, 판정이 나오면 요청을 보냅니다. 15초 안에 응답이 없으면 요청은 그대로 전송되고, 이전과 마찬가지로 고객님의 서버가 결정합니다.
나머지는 그대로입니다. 일반 submit을 사용하는 폼, nonce가 없는 요청, 단순 페이지 전송은 건드리지 않습니다.
어떻게 테스트했나
로컬 테스트 환경에서 실제 jQuery로 OpenCart 결제를 재현하고, 모의 고객 서버가 /v1/verify를 호출하도록 했습니다. 스위치를 끄면 클릭과 AJAX로 전송되는 폼은 거부되었습니다(HTTP 403, “의심”, 사유 NO_TYPING_PAUSES 및 NO_MOUSE_MOVEMENT). 스위치를 켜면 같은 방문자가 허용되었습니다(HTTP 200, “사람”). 일반 submit을 사용하는 폼, 단순 페이지 전송, nonce가 없는 요청은 스위치를 켜든 끄든 동일하게 동작했습니다.
알아 두실 점
XMLHttpRequest로 만든 요청을 다루며, 여기에는jQuery.ajax가 포함됩니다.fetch()로 전송되는 폼은 자체 처리가 있는 WooCommerce 블록 결제를 제외하고 아직 다루지 않습니다.- 서버 측 검증은 달라지지 않습니다. 계속 nonce와 함께
/v1/verify를 호출하세요.