업데이트: 사용자 추적에 대한 Stripe의 대응
원문은 Michael Lynch님이 에 게재했습니다. 이 블로그 구독하기
지난주 저는 Stripe가 고객사 웹사이트에서 방문자 행동을 어떻게 기록하는지를 다룬 블로그 글을 게시했습니다. 간단히 말해, Stripe의 JavaScript 라이브러리는 사이트에 Stripe 결제 폼이 전혀 표시되지 않은 경우에도 사용자가 방문한 URL 정보와 마우스 움직임에 대한 텔레메트리를 수집했습니다. 저는 대부분의 Stripe 고객이 이 사실을 모르고 있을 것이라 생각했고, Stripe가 데이터 수집 관행을 더 눈에 띄게, 더 자세하게 공개해야 한다고 주장했습니다.
이 글은 Hacker News에서 활발한 토론을 불러일으켰으며, 여기에는 Stripe 공동 창업자이자 CEO인 Patrick Collison이 남긴 여러 댓글이 포함되어 있었습니다. 그가 남긴 최상위 댓글에서 그는 이렇게 말했습니다:
제기된 질문(“Stripe가 이 데이터를 광고 목적으로 수집하는가?”)에 대한 답은 명확히 ‘아니다’입니다. 이 데이터는 지금까지 광고주에게 판매·대여된 적이 없으며, 앞으로도 절대 판매·대여되는 일이 없을 것입니다.
여러 댓글 작성자들은 그의 확언에 감사를 표하면서도, Stripe의 서비스 약관과 개인정보 처리방침에 공식적이고 구속력 있는 문구를 명시해 달라고 요구했습니다.
제 글이 나온 지 일주일도 채 되지 않아 Stripe는 데이터 수집 관행과 사용자 개인정보 보호에 대한 보장을 더 잘 공개하기 위해 어떤 변화를 만들었는지를 설명하는 블로그 글을 게시했습니다.
저는 Stripe의 새로운 문서를 검토했으며, Stripe의 변경 사항이 제가 제기했던 문제들을 얼마나 잘 해결했는지 살펴보겠습니다.
Stripe의 변경 사항
개발자 문서에 추적 기능이 명시적으로 공개되다
제게 가장 중요한 변화는 Stripe의 개발자 문서가 이제 자사 JavaScript 라이브러리의 추적 동작을 공개한다는 점입니다. 어제의 변경 이전까지 유일한 단서는 다음 두 문장뿐이었습니다:
Stripe의 고도화된 사기 방지 기능을 최대한 활용하려면 Stripe.js를 결제 페이지뿐 아니라 모든 페이지에 로드하세요. 이를 통해 Stripe는 고객이 웹사이트를 탐색하는 동안 사기를 나타낼 수 있는 비정상적인 행동을 탐지할 수 있습니다.
이 문장들은 핵심 정보를 빠뜨렸고, 라이브러리가 어떤 정보를 수집하며 그 데이터를 Stripe 서버와 어떻게 공유하는지를 제대로 전달하지 못했습니다.
현재 Stripe 문서에서 라이브러리에는 “고도화된 사기 탐지 시그널 비활성화”라는 섹션이 포함되어 있으며, 이 섹션은 사기 방지를 위해 Stripe가 수집하는 정보 유형을 명확하게 정의한 웹페이지로 연결됩니다.

Stripe의 새로운 사기 탐지 문서는 Stripe가 사용자 데이터를 어떻게 수집하는지에 대해 더 명확하게 설명한다.
Stripe 고객은 추적을 비활성화할 수 있다
Stripe는 고객이 심층 데이터 수집을 거부할 수 있도록 JavaScript 라이브러리를 업데이트했습니다. 이제 <script> 태그에 advancedFraudSignals=false 파라미터를 추가해 이 기능을 비활성화할 수 있습니다:
<script src="https://js.stripe.com/v3/?advancedFraudSignals=false"></script>@stripe/stripe-js npm 패키지를 사용하는 고객도 라이브러리를 초기화할 때 {advancedFraudSignals: false}를 지정하여 이 기능을 활용할 수 있습니다:
import { loadStripe } from "@stripe/stripe-js/pure";
loadStripe.setLoadParameters({ advancedFraudSignals: false });
const stripe = await loadStripe("pk_test_TYooMQauvdEDq54NiTphI7jx");이는 웹사이트 소유자가 더 나은 사기 방지를 위해 얼마나 많은 데이터를 제공할지 스스로 결정할 수 있는 권한을 되돌려준다는 점에서 긍정적인 변화입니다.
개인정보 처리방침, 사용자 데이터 판매를 명시적으로 금지하다
수요일에 Stripe는 개인정보 처리방침을 대폭 개정했습니다. 개정안은 Stripe가 사용자 데이터를 처리하고 외부 파트너와 공유하는 방식에 대해 더 엄격한 제한을 두고 있습니다.
저는 개인정보 처리방침의 전체 변경 내용에 대한 diff 보기를 만들었지만, 여기서는 주목할 만한 변경 사항만 짚어보겠습니다.
- 광고 네트워크 및 사용자 데이터 판매 조항 삭제
원래 블로그 글에서 저는 Stripe 개인정보 처리방침의 다음과 같은 우려스러운 부분을 지적했습니다:
귀하가 당사의 사이트나 온라인 서비스를 방문할 때, 당사와 특정 제3자는 귀하의 개별 관심사에 맞춘 상품 및 서비스에 대한 광고(이러한 유형의 광고를 “관심사 기반 광고”라고 함)를 제공하기 위해 시간에 걸쳐 그리고 여러 사이트에 걸쳐 귀하의 온라인 활동에 대한 정보를 수집합니다.
Stripe는 또한 AdWords, AdRoll 같은 광고 파트너와 데이터를 공유할 수 있도록 허용하는 문구를 두고 있었습니다:
당사는 Google AdWords, Doubleclick, AdRoll 및 기타 광고 네트워크와 협력하고 있습니다.
Stripe는 이 두 문구를 모두 삭제했습니다. 새로 추가된 문구는 놀랍도록 명확하고 직접적입니다. Stripe는 고객 데이터를 광고주에게 판매하지 않는다는 내용입니다:
당사는 관심사 기반 광고를 위해 이용자 고객의 개인정보를 사용·공유·대여·판매하지 않습니다. 당사는 이용자, 이용자의 고객 또는 사이트 방문자의 개인정보를 판매하거나 대여하지 않습니다.
- 기업 매각 이후에도 사용자 데이터는 보호된다
Hacker News 토론 중 한 사용자가 우려를 표한 바 있습니다. Stripe의 현재 선의에도 불구하고 다른 회사가 Stripe를 인수할 경우 사용자 데이터가 잘못된 손에 넘어갈 수 있다는 것이었습니다. Patrick Collison은 이렇게 답했습니다:
법무팀에 문의해 청산 등의 상황에서도 이 데이터를 공유하지 못하도록 계약상으로 스스로를 제한하거나, 다른 유용한 방식으로 스스로를 구속할 수 있는지 알아보겠습니다…
아마도 그 대화에 대한 직접적인 대응으로, 새로운 개인정보 처리방침에는 다음과 같은 조항이 포함되었습니다:
당사 또는 당사 사업의 일부를 인수하는 다른 주체는 귀하의 개인정보를 계속 사용할 권리를 갖지만, 귀하가 달리 동의하지 않는 한 본 개인정보 처리방침에 명시된 방식에 따라서만 사용할 수 있습니다.
앞으로 개선이 필요한 부분
Stripe의 빠르고 철저한 대응에 깊은 인상을 받았지만, 여전히 개선이 필요하다고 생각하는 부분이 남아 있습니다. 저는 이러한 우려를 Stripe에 직접 전달했으며, Stripe 측은 향후 이를 개선할 계획이 있다고 답했습니다.
URL 수집에 대해 더 명시적으로 공개해야
Stripe의 사기 탐지 전용 페이지에는 사기 탐지의 일환으로 최종 사용자로부터 어떤 정보를 수집하는지 설명하는 “시그널 유형” 섹션이 있습니다.
저는 블로그 글에서 Stripe가 쿼리 스트링(예: example.com?userId=michael)과 URL 프래그먼트(예: example.com#key=1234)를 포함해 사용자가 방문한 모든 페이지의 전체 URL을 수집하고 있었다고 지적했습니다. Stripe는 여전히 이 정보를 수집하고 있다는 사실을 명확히 밝히지 않고 있습니다. 가장 가깝게 언급한 부분은 다음 문단뿐입니다(강조는 필자):
고도화된 사기 탐지 시그널에는 정상적인 구매자와 사기성 구매자 및 봇을 구별하는 데 도움이 되는 쇼핑 경험상의 활동 지표도 포함됩니다… 이러한 시그널에는 마우스 활동 지표와 쇼핑 경험에서 사용자가 각 페이지에 머무는 시간이 포함되며, 두 지표 모두 세션 전체에 걸쳐 봇과 유사한 행동을 예측하는 데 도움이 됩니다.
이 문장만으로 합리적인 사람이 Stripe가 전체 URL을 수집한다고 추론할 수 있을까요? 저는 그렇지 않다고 봅니다.
쿼리 스트링에 민감한 데이터를 저장하는 웹 애플리케이션은 보안이 취약한 패턴으로 널리 알려져 있으므로 동정할 여지가 없다고 생각할 수도 있습니다. 하지만 URL 프래그먼트는 더 심각한 문제입니다. 이는 원래 민감한 정보를 저장하는 안전한 방식인데, 서드파티 라이브러리가 이를 복사해 외부 서버로 전송한다는 사실은 충격적입니다.
Firefox Send와 Mega.nz는 모두 URL 프래그먼트를 이용해 클라이언트 측 암호화 키를 저장하는 대표적인 웹 앱 사례입니다. 이를 통해 사용자는 서버가 원본 데이터에 전혀 접근할 수 없는 상태에서 종단간 암호화된 파일을 클라우드에 저장할 수 있습니다. 만약 Stripe의 JS 라이브러리가 이와 유사한 방식을 사용하는 사이트에서 실행된다면, 해당 라이브러리는 민감한 암호화 키를 Stripe 서버로 유출하게 됩니다.

인기 파일 공유 애플리케이션인 Mega.nz는 민감한 암호화 키를 URL 프래그먼트 필드에 저장한다
라이브러리 언로딩 지원이 필요하다
loadStripe 함수와 /pure import 경로 덕분에 연동 개발자가 Stripe를 언제 켤지 결정할 수 있게 되었지만, Stripe를 끄는 방법은 여전히 없습니다.
예를 들어 결제 과정에서는 Stripe의 고도화된 사기 탐지를 활성화하고 싶지만, 거래가 완료된 후에는 Stripe와의 데이터 공유를 중단하고 싶다고 가정해 보겠습니다. 현재 이를 구현할 수 있는 유일한 방법은 페이지를 강제로 새로고침하는 것뿐입니다.
앱에서 더 이상 Stripe가 필요하지 않을 때 추적을 동적으로 비활성화할 수 있는 unloadStripe 같은 간단한 함수를 Stripe가 제공한다면 더 좋을 것입니다.
왜 이 모든 것이 중요한가?
서드파티 JavaScript 패키지를 포함함으로써 웹사이트 소유자는 해당 라이브러리에 큰 신뢰를 부여하게 됩니다. 사용자의 브라우저에서 코드를 실행할 수 있는 권한을 가진 JavaScript 라이브러리는 사실상 모든 권한을 쥐게 됩니다. 사용자가 볼 수 있는 모든 정보에 접근할 수 있고, 사용자의 권한으로 사이트에서 작업을 수행할 수도 있습니다.
웹사이트 소유자는 자신의 사이트가 직접 혹은 서드파티 라이브러리를 통해 어떤 정보를 수집하는지 파악할 책임이 있으며, 일부 관할권에서는 이는 법적 책임이기도 합니다. Stripe가 책임 있는 데이터 관리를 보여주고 있는 것은 긍정적이지만, 웹사이트 소유자는 외부 파트너가 어떤 데이터를 수집하고 그 데이터에 대해 어떤 제한을 보장하는지를 알 권리를 계속해서 주장해야 합니다.
글을 무작위로 읽기

댓글
로그인하고 댓글 남기기