안드로이드 웹뷰 백지 화면, 결제 콜백 평문 트래픽 차단이 원인
목차
안드로이드 웹뷰에서 갑자기 화면이 백지로 뜬 사건
QA에서 "안드로이드 앱 켜면 흰 화면만 나옴" 제보가 들어왔음. iOS는 멀쩡한데 안드로이드만 그럼. 로그를 까보니 익숙한 메시지가 보임.
net::ERR_CLEARTEXT_NOT_PERMITTED
원인은 한 줄로 정리됨. 안드로이드 9(API 28)부터 평문 HTTP 트래픽이 기본 차단됨. 우리 앱은 결제 플랫폼 연동 단계에서 일부 리다이렉트 URL이 아직 http 로 떨어지는 구간이 있었고, 이전 버전에선 어쩌다 통과되던 게 타깃 SDK 올리면서 막힌 것.
뭘 고쳤나
처음엔 단순하게 매니페스트에 usesCleartextTraffic="true" 한 줄 박을까 했는데, 보안팀에서 그건 전체 도메인을 다 열어버리는 거라 안 된다고 함. 맞는 말.
그래서 network_security_config.xml 파일을 만들어서 꼭 필요한 도메인만 평문 허용으로 화이트리스트 했음.
| 항목 | Before | After |
|---|---|---|
| 평문 트래픽 | 전 도메인 차단 | 지정 도메인만 허용 |
| 적용 범위 | 매니페스트 한 줄 | 별도 config 파일 |
| 보안 리스크 | 높음(전체 개방) | 낮음(화이트리스트) |
핵심 수정사항
res/xml/network_security_config.xml신규 생성,<domain-config cleartextTrafficPermitted="true">안에 결제대행사 콜백 도메인만 명시- 매니페스트의
application태그에networkSecurityConfig속성으로 연결 usesCleartextTraffic속성은 의도적으로 안 넣음 (있으면 config 가 무시되는 케이스가 있음)
삽질 포인트
가장 시간 잡아먹은 건 서브도메인 처리였음. 처음엔 루트 도메인만 열었는데 실제 결제 흐름은 pay.* / redirect.* 같은 서브도메인을 타고 있었고, includeSubdomains="true" 빼먹어서 같은 에러가 또 뜸. 한 번 더 빌드 돌리고 실기기 붙여서 확인.
그리고 에뮬레이터에서는 재현이 안 되는 케이스가 있었음. 에뮬레이터 기본 이미지가 API 27이라 평문이 그냥 통과됨. 실기기(API 33) 붙여서 테스트하니까 바로 재현됨. 이런 건 무조건 실기기.
회고
- HTTPS 마이그레이션은 진작에 끝났다고 생각했는데, 외부 결제대행사 콜백 한두 개가 아직 평문이었음. 외부 의존 트래픽은 정기적으로 한 번씩 훑어야 함
network_security_config.xml은 매니페스트 한 줄보다 귀찮지만 보안 감사 통과용 근거 파일로도 쓰기 좋음. 어떤 도메인을 왜 열었는지 그대로 남음- 다음에 타깃 SDK 올릴 때는 changelog 의 보안 변경사항을 미리 한 번 훑고 들어가야지, 또 QA 단계에서 백지 화면 보긴 싫음
다음
댓글 0
첫 댓글 달아줘.