안드로이드 네트워크 보안 강화하기: Network_security_config 사용법
늘은 안드로이드 앱의 네트워크 보안 설정을 관리하는 데 필수적인 network_security_config에 대해 알아보는 시간을 가졌다. 개발 중인 앱에서 보안을 강화할 필요성을 느껴 이 주제를 선택하게 되었고, 다양한 설정 방법을 통해 앱의 네트워크 트래픽을 안전하게 관리할 수 있는 방법을 배웠다.
network_security_config란 무엇인가?
network_security_config는 안드로이드 애플리케이션에서 네트워크 트래픽에 대한 보안 설정을 세밀하게 조정할 수 있도록 도와주는 구성 파일이다. 이 파일을 통해 개발자는 앱에서 신뢰하는 인증서, 암호화 프로토콜, 특정 도메인에 대한 트래픽 허용 정책 등을 설정할 수 있다. 기본적으로 네트워크 보안을 강화하기 위한 도구로, 여러 장점이 있다.
네트워크 보안 설정의 중요성
안드로이드 9(API 레벨 28)부터는 기본적으로 평문 트래픽인 HTTP가 차단되고, HTTPS를 통한 암호화된 트래픽 사용이 권장된다. 이러한 보안 강화는 사용자의 개인정보와 데이터를 보호하기 위해 필수적이다. 하지만 개발 및 테스트 단계에서는 HTTP를 사용할 필요가 종종 발생한다. 이럴 때 network_security_config를 사용하면 특정 도메인에 대해 HTTP를 예외적으로 허용할 수 있어 매우 유용하다.
기본 설정 방법
network_security_config를 사용하기 위해서는 먼저 XML 파일을 생성하고 기본적인 설정을 구성해야 한다. 보통 이 파일은 res/xml/ 디렉토리에 위치하며, 일반적으로 network_security_config.xml이라는 이름으로 작성한다.
다음은 기본적인 설정 방법이다:
1. res/xml/ 디렉토리에 network_security_config.xml 파일을 생성한다.
2. 아래와 같이 기본 설정을 추가하여 평문 트래픽을 허용하거나 차단할 수 있다. 예를 들어, 앱의 모든 도메인에 대해 HTTP 트래픽을 허용하려면 다음과 같이 설정할 수 있다:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">example.com</domain>
</domain-config>
</network-security-config>
이 설정은 example.com과 그 하위 도메인에 대해 평문 트래픽을 허용하는 구성이다.
3. AndroidManifest.xml에 연결: 설정한 network_security_config.xml 파일을 앱에 적용하려면, AndroidManifest.xml 파일에서 연결해줘야 한다. 아래와 같이 application 태그에 추가하면 된다:
<application
android:networkSecurityConfig="@xml/network_security_config"
... >
</application>
이렇게 기본 설정을 완료하면, 앱은 설정한 네트워크 보안 규칙을 따르게 된다.
여러 도메인 설정하기
오늘 수업에서 특히 흥미로웠던 부분은 여러 신뢰하는 도메인에 대해 보안 설정을 개별적으로 다룰 수 있다는 점이었다. 예를 들어, 외부 API 서버는 HTTPS만 허용하면서, 내부 개발 서버에서는 HTTP를 사용할 수 있도록 설정하고 싶었다. 이를 위해 각 도메인별로 domain-config를 추가할 수 있었다.
다음은 여러 도메인에 대한 설정 예시다:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- example1.com 도메인에 대한 설정: HTTP 허용 -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">example1.com</domain>
</domain-config>
<!-- example2.com 도메인에 대한 설정: HTTPS만 허용 -->
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">example2.com</domain>
</domain-config>
<!-- example3.com 도메인에 대한 설정: HTTP 허용 -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">example3.com</domain>
</domain-config>
</network-security-config>
위 설정을 통해 각 도메인마다 다른 보안 정책을 적용할 수 있었다. example1.com과 example3.com에 대해서는 HTTP 트래픽을 허용하고, example2.com은 HTTPS만 허용하도록 설정했다. 이처럼 세부적인 네트워크 정책을 적용할 수 있다는 점이 정말 인상 깊었다.
실제 적용하기
설정 파일을 작성한 후, 이 파일을 앱에 적용하기 위해 AndroidManifest.xml 파일에 연결해야 했다. 이 과정은 간단하면서도 중요했다. 아래와 같이 application 태그에 추가하면 된다:
<application
android:networkSecurityConfig="@xml/network_security_config"
... >
</application>
이렇게 연결하면 앱이 설정한 네트워크 보안 규칙을 따르게 된다. 처음엔 이 과정이 복잡할 것이라고 생각했지만, 한 번 해보니 매우 직관적이었다.
전역 설정과의 차이점
수업 중에 usesCleartextTraffic="true" 옵션과의 차이점도 명확히 이해하게 되었다. 이 옵션은 앱 전체에 대해 HTTP를 허용하는 전역 설정이지만, 보안성이 떨어질 수 있다는 단점이 있다. 반면 network_security_config는 도메인별로 세부적인 제어가 가능하여 더 안전한 보안 정책을 설정할 수 있다. 특정 API는 HTTPS만 사용하고, 내부 개발 서버는 HTTP를 허용할 수 있는 유연함이 그 예다.
결론
오늘 network_security_config를 통해 안드로이드 앱의 네트워크 보안을 강화하는 방법을 배웠다. HTTPS와 HTTP 트래픽을 적절히 관리하고, 개발 환경에서 필요한 인증서나 네트워크 보안을 유연하게 설정할 수 있었다. 안드로이드 9 이후 강화된 보안 정책에 맞춰, 필요할 때만 예외를 두어 더 안전한 앱을 만들 수 있었다.
이 경험을 통해 앞으로 개발하는 앱에서도 network_security_config를 적극 활용해 보안과 유연성을 모두 챙길 수 있을 것 같다. 오늘의 배움은 단순히 기능적 지식에 그치지 않고, 실제 앱 개발에서의 보안 관행을 다지는 데 큰 도움이 될 것이라고 믿는다.