.apk
혹은 ipa
를 전달하여 취약점 점검을 할 수 있도록 준비해야 합니다.Print문에 적힌 에러를 통해 유추했습니다. 그리고 그것으로 서버 이슈임을 진단했고 문제를 해결했습니다.
제가 담당하던 iOS Project에서 이전과 동일한 프로젝트를 실행했더니 갑자기 앱이 종료되고 있었습니다. UI에 노출된 메시지는 다음과 같습니다.
"무결성 검증에 실패했습니다."
그래서 다음 절차대로 디버깅을 시작합니다.
SDK의 동작 시점(혹은 메모리 할당 시점)을 찾아서 Breakpoint를 앞뒤로 추가합니다. 그리고 그 사이에 발생한 로그를 확인합니다.
여러 로그가 있었지만, 그 중에서 가장 의심되는 것을 선택했습니다.
MSG : <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>503 Service Unavailable</title>
</head><body>
<h1>Service Unavailable</h1>
<p>The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.</p>
</body></html>
503
: 503은 HTTP 통신에서 주로 서버 에러일 때 오는 응답코드중 하나입니다. 그 중에서도 "Service Unavailable" 은 일시적으로 서비스를 제공할 수 없음을 나타내곤 합니다. 만약 내부 프로젝트의 이슈로 인해 해당 SDK에 에러가 있는지 확인해 보았습니다. SDK 제공업체 측 문서를 했습니다. 1000
이라는 에러가 현재 출력되고 있었는데, 문서에는 해당 에러 메시지는 없었습니다. 이런 경우 사실 바로 전화를 해보는게 속편합니다. 다만, 전화는 전화대로 해보고 동시에 문제도 해결해야 시간을 아낄 수 있습니다. 퇴근시간 엄수
그 다음으로 플랫폼 특성을 보기로 했습니다. iOS의 경우, 특정 Domain 접근을 막습니다. 그리고 HTTP 통신은 기본적으로 하지 못하도록 합니다. 혹시 그 부분이 문제가 되진 않을까 생각했습니다. (이미 서버 응답이 왔기에, 이 부분은 문제가 될 가능성이 아주 낮습니다만, 혹시나 확인해봤습니다.)
info.plist 파일에서 설정 중 App Transport Security Settings
를 찾습니다. 그리고 거기서 Allow Arbitrary Loads
라는 항목이 없다면 추가해서 "YES"로 설정합니다.
이렇게 했으나, 여전히 문제는 재발하고 있었습니다. 그래서 내부 프로젝트에서 점검할 사항은 모두 확인했다고 판단했습니다.
이제 서버를 점검해보고자 했습니다. 그리고 서버 모니터링 툴을 통해 확인했고, 역시 오류가 검출되고 있었습니다. 이 에러를 해결하고 정상적으로 동작했습니다. 관련 내용은 Problem
에서 자세히 설명하겠습니다.
서버의 일시적인 응답 불능 상태로 인한 버그
503 에러로, "Service Unavilable" 상태입니다. 이 에러는 서버의 인스턴스는 있으나, 모종의 이유(리소스 없음, 과부하, 다른 작업중... 등)로 일시적으로 요청을 처리할 수 없는 상태를 의미합니다. 만약 서버 인스턴스 자체가 없었다면 아마도 404 에러가 출력되었을 확률이 높습니다.
실제로 회사 내 모니터링 툴을 확인해보니, 실제로 "Crash...." 와 같은 에러가 있었습니다.
서버 재기동
해결방법은 클라이언트에서는 없었습니다. 서버 재기동 후, 정상적인 Request - Response를 주고받았고, 앱 무결성 서버와도 지장 없이 통신할 수 있었습니다.
에러의 발생 가능성을 상상하는 것이 중요하고, 최초 개발 시점에 이 에러에 대해 미리 핸들링할 줄 아는 것이 "노하우(=짬)"가 아닐까?