네이버 페이(Naver Pay) 연동 시 상품 정보 이미지(imageUrl) 정보를 읽어오지 못하는 문제 (CloudFlare WAP — Browser Integrity Check)

시작

PG(Payment Gateway) 연동은 회사의 매출을 위해서 가장 중요한 작업 중에 하나이지만, 그리 쉽지 않은 작업이다. 그렇기 때문에 ‘아임포트'라는 별도의 서비스까지 나온게 아닌가 싶다.

‘네이버 페이’는 국내에서 가장 많이 사용되는 PG 중에 하나인데, 지난 몇 달 동안 ‘네이버 페이’와 문제없이 잘 연동되던 환경에서 문제가 발생되어 그 원인을 찾는 과정에서 알게된 사실들을 정리해본다.

문제

문제의 현상은 간단했다. ‘아임포트’에서 제공하는 ‘네이버 페이' 연동 sample manual을 보면, 연동을 위해서 입력하는 정보들 중에 ‘imageUrl’ 정보를 넣어야하는 걸 볼 수 있다. 그런데 이 ‘imagaeUrl’에 명시한 주소의 image를 ‘네이버 페이' 측에서 접근할 수 없었고, 그로 인해서 연동에 문제가 발생되었다. 정확하게는 ‘네이버 페이'의 상품 정보 수집 bot이 ‘imageUrl’에 접근하면 ‘403 forbidden’ 오류가 발생된다는 것이다.

출처 https://http.cat

이에 대한 ‘네이버 페이' 측의 예상 문제 원인으로 방화벽에서 특정 IP, URL, ‘user-agent’의 접근을 제한한게 아니냐는 의견을 제시했다. 실제로 이 문제가 발생되기 며칠 전에 image server 앞단에 CloudFlare라는 CDN을 물리는 작업을 했는데, 이것이 영향을 미쳤을 거라 생각되었다. 하지만, 딱히 특정 IP, URL을 막은 적도 없고, 설마 ‘user-agent’를 막을까 싶었다. ‘user-agent’라는게 아래 예시처럼 너무도 쉽게 다른 값으로 바꿀 수 있기 때문에, 특정 ‘user-agent’를 막는건 의미없다고 생각했다.

curl -v -I -A 'whatever_you_want' http://naver.com
출처 https://namu.wiki

‘네이버 페이' 측에 요청해서 상품 정보 수집 bot의 ‘user-agent’ 값을 알아낸 후, 앞서 말한 ‘curl’ 예시처럼 해보았더니 정말로 ‘403 forbidden’ 오류가 발생되었다. 그리고 이 건과 별도로 ‘네이버 페이'의 상품 정보 수집 bot의 ‘user-agent’ 값이 다소 보안상 문제가 될 정보를 포함하고 있어서, 여기서는 그 값이 실제 어떤 값인지는 공개하지 않겠다. 어쨌든 문제 재현에 성공했고, 다음으로 원인 분석 및 해결 방안 탐색에 들어갔다.

문제 원인은 아래 2가지였다.

  1. ‘네이버 페이' 상품 정보 수집 bot이 평범하지 않은 ‘user-agent’ 값을 쓴다.
  2. CloudFlare에서는 평범하지 않은 ‘user-agent’ 값을 abusing으로 판단하고 WAF(Web Application Firewall)에서 차단하고 있다. 좀 더 정확하게는 ‘Browser Integrity Check’에서 차단되고 있었다.

그럼 해결 방안 역시 2가지가 되었다.

  1. ‘네이버 페이' 상품 정보 수집 bot이 평범한 ‘user-agent’ 값을 사용하도록 요청
  2. CloudFlare WAF 설정에 예외 사항 추가 요청

위의 2가지 모두 그리 빠른 대응을 기대하기 어렵고, 이 문제는 회사 매출에 직결되는 PG 연동 문제이기에, ASAP 중에 ASAP으로 해결해야했다.

출처 https://giphy.com

해결

다행히도 CloudFlare에서 WAF 관련해서 ‘page rule’ 설정을 지원하는데, main 화면에서 ‘Page Rules’ -> ‘Create Page Rule’ 후에 아래 화면처럼 ‘page rule’을 추가했다.

위와 같이 ‘page rule’ 추가 후, ‘네이버 페이' 상품 수집 bot은 문제없이 ‘imageUrl’ 접근이 되었고, PG 연동은 이전처럼 잘 동작하게 되었다.

미래

다시 모든게 정상이 된 후에, ‘앞으로 어떻게 하면 이런 비슷한 문제를 사전에 예방할 수 있을까?’라는 의문을 스스로 던져보았다. 하지만, 상상력의 부재인지 딱히 이렇다할 예방책을 찾지를 못했는데, 그 이유는 이번 문제처럼 2개 이상의 서로 다른 system(내부 상황을 모르는 black box) 간의 충돌(‘네이버 페이'의 ‘user-agent’와 CloudFlare의 WAF 설정)을 어떻게 사전에 예측하고, 미리 방지할 수 있을지 잘 상상이 안간다.

다만, OP(실제 서비스) 반영 전에 QA(내부 테스트)에서, 미리 설정을 변경하고, 충분히 정상 동작 여부를 확인 해본다든지 또는 OP 반영할 때, 전체 중에 일부(0.1%)만 적용하는 A/B test를 시행한다든지 등의 방법을 생각해봤다. 혹시 누군가 더 나은 방법을 댓글로 남겨준다면, 그 사람에게 저녁이라도 보답하겠다.