![]() | ![]() | ![]() |
|---|
평소 서버 개발자라면, 특히 BFF(Backend For Frontend) 또는 전시 서비스 서버 개발자라면 프록시 기반 트래픽 분석 도구를 반드시 경험하게 되는데요.
오늘은 이 프록시 기반 HTTP/HTTPS 트래픽 분석 도구를 선택하는 사람들을 위해 종류들을 간단히 알아보고 이 도구들을 썼을 때, 공통으로 만나게 되는 이슈들에 대한 트러블 슈팅들을 간단히 알아보겠습니다.
참고로, 설치 및 디버깅 방법에 대해서는 공식 사이트에서 가이드를 친절히 해주고 있거나(Fiddler 가 가장 친절) 이미 관련된 블로그들이 많이 있으므로 생략하겠습니다.
현업에서 자주 사용되는 트래픽 분석 도구로는 Fiddler, Proxyman, Charles가 있습니다. 각 도구는 주로 HTTP/HTTPS 트래픽 디버깅에 사용되며, 기능과 사용성이 약간씩 다릅니다.
Proxyman은 무료에 해당하고 Fiddler, Charles는 유료입니다. (무료로 사용이 가능하나 사용 기한 또는 툴의 연속적인 사용 시간 등이 제한적임)
UI 관점으로 볼때는 개인적으로 Fiddler, Proxyman > Charles인데요. Proxyman이 더 아기자기한 분위기에 가깝다면 Fiddler는 직관적인 UI 들을 띄고 있어서 개인적으로 Fiddler UI 를 더 선호합니다.
공통점이 있다?
이 툴들은 설치 및 디버깅하는 과정에서 모두 공통점이 있습니다.
바로 인증서를 설치한다는 것인데요. 이 인증서 설치는 프록시 디버깅 도구가 위치하는 PC 에도 설치해야하고, 디버깅하려는 대상이 위치하는 디바이스(대표적으로 안드로이드 또는 IOS 스마트폰)에도 설치해야 합니다.
설치 및 셋팅하는 과정에서 다소 헤멜 수 있는 점은 인증서를 설치할 때는 반드시 프록시 디버깅 도구가 위치하는 PC의 WIFI 와 디버깅 대상이 설치되어있는 디바이스의 WIFI 가 같아야 합니다.
그렇지 않으면 디버깅 대상이 설치되어있는 디바이스에서는 인증서 설치가 되지 않습니다.(인증서 설치를 제공하는 사이트에 접근하면 오류가 발생)
참고로, 이는 Fiddler, Proxyman, Charles가 모두 해당되는 방식입니다.

HTTP/HTTPS 트래픽 디버깅을 하기 위한 과정만 놓고 볼 때(특히 인증서를 설치하는 과정과 디버깅 시, 네트워크 망이 같아야하는 조건), 이 세 가지 도구가 모두 비슷한 형태를 취하는 것을 볼 수 있습니다.
각 도구의 선택에 대한 고민은 HTTP/HTTPS 트래픽 디버깅 외에도 어떤 정보들을 제공하는지, 유/무료여부, UI 편의성, 각 재단에서 소프트웨어 발전에 힘을 지속적으로 기울이는지 여부 등에 따라 선택의 방향이 달라질 걸로 보입니다.
그럼, 이제 아래 추가적인 내용으로 디버깅 과정에서 발생할 수 있는 이슈와 해결 방법에 대해 공유해보도록 하겠습니다.
이 역시 특정 디버깅 툴에 국한된 내용은 아니고 어떤 툴을 쓰더라도 발생할 수 있는 문제점이니 참고하시면 좋을 것 같습니다.
디버깅 툴 통해서 원하는 HTTPS Request 가 탐지는 되는데, 정작 Request 및 Response 의 상세 정보를 확인할 수 없는 경우가 있습니다. 즉, 무언가 Request 가 발생했다는 것을 알 뿐, 자세한 내용은 알 수 없는 현상이 있는데요.
제 경험상 일반적인 원인은 아래 세가지로 추려집니다.
안드로이드 앱의 HTTPS 요청은 기본적으로 신뢰할 수 있는 CA(Certificate Authority) 인증서만 허용합니다. 디버깅 도구는 자체 서명된 인증서를 사용하므로, 앱에서 이를 신뢰하지 않으면 디버깅이 차단됩니다.
원인
앱 소스 코드 설정에 의해 네트워크 보안 구성 중 사용자 인증서(User Certificates)를 신뢰하지 않도록 설정해서 그렇습니다.
안드로이드 7.0(Nougat) 이상부터는 기본적으로 사용자 인증서를 신뢰하지 않습니다.
그렇다면 사용자 인증서는 무엇이고 사용자 인증서가 아닌 것은 또 무엇일까요?
안드로이드에서는 인증서를 시스템 인증서와 사용자 인증서로 구분하고 있습니다.
안드로이드 14(Upside Down Cake) 를 기준으로 설정 > 보안 및 개인정보 보호 > 기타 보안 설정 > 인증서 확인 메뉴에 들어가게되면 아래와 같이 시스템 인증서와, 사용자 인증서가 서로 구분되어있음을 확인할 수 있습니다.
![]() | ![]() |
|---|
확인 방법
그렇다면 안드로이드 앱 소스코드 중에 관련된 설정이 어떻게 되어있는지 확인해봐야겠죠.
안드로이드 앱 소스코드 중 res/xml/network_security_config.xml에서 다음과 같은 설정이 있는지 확인합니다.
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<trust-anchors>
<!-- 시스템 인증서만 신뢰 -->
<certificates src="system" />
</trust-anchors>
</domain-config>
</network-security-config>
해결 방법
certificates src="user": 사용자 인증서(프록시 도구의 인증서)를 신뢰하도록 설정합니다.
다만, 이 방법은 개발 환경에서만 사용하도록 권장됩니다.
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<trust-anchors>
<!-- 시스템 인증서 신뢰 -->
<certificates src="system" />
<!-- 사용자 인증서도 신뢰 -->
<certificates src="user" />
</trust-anchors>
</domain-config>
</network-security-config>