안드로이드 네트워크 보안 구성(Network Security Config)이란?
네트워크 보안 구성(Network Security Configuration) 기능을 활용하면 앱 코드를 수정하지 않고도 별도의 선언적 XML 파일을 통해 앱의 네트워크 보안 설정을 정의할 수 있습니다. 예를 들어 특정 자체 서명(self-signed) 인증서만 신뢰하도록 하거나, 제한된 공개 CA(인증 기관) 집합만 신뢰하도록 앱을 구성할 수 있습니다.
안드로이드 네트워크 인증서란 무엇인가요?
안드로이드 운영체제가 보안 리소스에 안전하게 연결하려면 신뢰할 수 있는 인증서(trusted certificate)가 사용됩니다. 이러한 인증서는 VPN(가상 사설망), Wi-Fi 및 애드혹(ad-hoc) 네트워크, Exchange 서버 등 기기에서 지원하는 다양한 애플리케이션에서 활용됩니다.
내 SSL 핀(SSL Pin)을 찾는 방법
GitHub에서 관련 최신 소식을 확인할 수 있습니다. 'hello-pinnedcerts' 인증서 피닝(pinning) 테스트를 실행하면 설정이 올바르게 구성되었는지 검증할 수 있으며, GitHub에 가입하면 소스 코드도 열람할 수 있습니다. 또한 iSECPartners가 배포하는 'Android SSL Trust Killer'라는 도구를 사용하면 특정 앱의 피닝 메커니즘을 우회할 수 있습니다.
cleartextTrafficPermitted란 무엇인가요?
cleartextTrafficPermitted는 안드로이드 네트워크 보안 구성 파일에 포함된 플래그(flag)입니다. 안드로이드 9(파이)부터는 기본 구성에 따라 클리어텍스트(암호화되지 않은) 트래픽이 차단되어 기기가 보호됩니다.
안드로이드 클리어텍스트(Cleartext) 트래픽이란?
클리어텍스트 트래픽은 전송, 저장 또는 처리되는 모든 암호화되지 않은 데이터를 의미합니다. 앱이 서버와 통신할 때 사용하는 개방형 HTTP 채널은 도청이나 콘텐츠 변조에 노출될 위험이 있습니다.
Flutter에서 네트워크 보안 구성 파일을 추가하는 방법
먼저 안드로이드 네트워크 보안 구성용 XML 파일을 생성합니다. 그다음 매니페스트(AndroidManifest.xml)의 <application> 태그에 android:networkSecurityConfig 속성을 추가하고, 해당 XML 파일의 리소스 식별자를 지정하면 됩니다.
네트워크 인증서(Network Certification)란?
네트워크 자격증을 취득하는 것은 정보기술(IT) 분야에서 네트워크 관련 업무를 수행하는 데 필요한 지식과 기술을 갖추었음을 공식적으로 입증하는 방법입니다.
안드로이드에서 Wi-Fi 인증서를 설치하는 방법
'설정' > 'Wi-Fi' > 메뉴의 '고급(Advanced)' > '인증서 설치(Install certificates)' 경로를 통해 Wi-Fi 접속 인증서를 설치할 수 있습니다.
네트워크 인증서를 다운로드(설치)하는 방법
앱 목록에서 휴대폰의 '설정' 앱을 엽니다. '보안(Security)' > '고급(Advanced)'으로 이동한 뒤 '암호화 및 사용자 인증 정보(Encryption & credentials)'를 선택합니다. '인증서 설치(Install a certificate)' 항목에서 'Wi-Fi 인증서'를 선택하세요. 왼쪽 상단의 메뉴 버튼을 누른 후, 저장해 둔 위치에서 인증서 파일을 찾아 파일명을 탭합니다. 인증서 이름을 입력하고 '확인(OK)'을 누르면 설치가 완료됩니다.
SSL 핀(SSL Pin)이란 무엇인가요?
SSL(보안 소켓 계층) 핀을 사용하면 데이터를 안전하게 보호할 수 있습니다. SSL 인증서는 신뢰를 확립할 수 있는 보안 연결을 만들어 주며, 이 연결을 통해 웹 서버와 브라우저 간 데이터의 프라이버시와 무결성이 유지됩니다. 호스트의 공개 키나 인증서를 해당 호스트에 고정하는 것이 바로 SSL 핀입니다.
SSL 인증서 해시를 확인하는 방법
브라우저를 실행한 후 메뉴에서 '도구(Tools)' > '인터넷 옵션(Internet Options)'을 선택합니다. '콘텐츠(Content)' 탭을 클릭해 인증서 페이지로 이동한 뒤, 인증서 창에서 확인하려는 탭(개인, 다른 사람, 중간 인증 기관, 신뢰할 수 있는 루트 인증 기관)을 선택하면 인증서를 살펴볼 수 있습니다.
SSL 피닝(SSL Pinning)이 필요한가요?
SSL 피닝은 앱이 기기에 구성된 모든 CA를 신뢰하는 기본 동작 대신, 특정 인증서나 인증 기관(CA)만 신뢰하도록 앱을 구성하는 기술입니다. 따라서 네트워크 보안 구성을 통해 이미 신뢰할 인증서 범위를 제한해 두었다면 별도의 SSL 피닝 구현은 불필요할 수 있습니다.
'클리어텍스트가 허용되지 않음(Cleartext not permitted)' 오류 해결 방법
해결 방법은 매우 간단합니다. AndroidManifest.xml 파일에 android:usesCleartextTraffic='true' 속성을 추가하거나, 네트워크 보안 구성 파일에 해당 도메인을 추가하고 cleartextTrafficPermitted='true'로 설정하면 됩니다.
android:usesCleartextTraffic 속성의 용도
앱이 클리어텍스트 트래픽을 사용하지 않도록 강제하려면 AndroidManifest.xml에서 android:usesCleartextTraffic='false'로 설정하면 됩니다. 이렇게 하면 앱이 암호화되지 않은 통신을 실수로 처리하는 상황을 미연에 방지할 수 있습니다.