공부/flutter

[Flutter] 시뮬레이터에서 네트워크 차단 테스트

iris3455 2026. 2. 1. 12:37

 

회사 프로젝트에서 이슈가 발생했다. 이미 런칭된 앱이 해외에서 정상적으로 실행되지 않는다는 이슈였다.

가장 먼저 든 생각은 “혹시 Google이나 Firebase 관련 도메인이 해외 네트워크에서 차단된 건 아닐까?” 하는 생각이 들었다. 이 가설을 검증하기 위해, 시뮬레이터에서 동일한 상황을 재현해보기로 했는데 간단하게 끝나지가 않았다. 처음에는 가장 간단한 방법으로 맥의 hosts 파일을 수정해 도메인을 차단해보려고 했다. 웹에서는 이 방법으로 특정 도메인 접근을 쉽게 막을 수 있기 때문이다. 하지만 모바일 앱은 웹과 달리, 로컬 환경에서 직접 도메인을 호출하지 않는다.

 

Android 에뮬레이터는 호스트 컴퓨터와 분리된 가상 네트워크를 사용한다. 이 때문에 에뮬레이터 내부에서 127.0.0.1은 에뮬레이터 자신을 가리키며, 호스트 컴퓨터에서 실행 중인 서비스에 접근하려면 에뮬레이터 전용 주소인 10.0.2.2를 사용해야 한다.

  • Emulator 내부 네트워크 스택
       → Emulator DNS
        → Internet

이 때문에 호스트 파일 변경은 시뮬레이터나 앱 네트워크에는 영향을 주지 못했고 결국 접근 방식을 바꿔야 했다.
Android 에뮬레이터의 모든 네트워크 요청을 프록시로 우회시키고, 프록시 단에서 Google / Firebase 도메인을 의도적으로 차단하는 방식으로 문제 상황을 재현하기로 했다. 이를 위해 프록시 기반 네트워크 디버깅 도구인 Proxyman을 사용했다.

 

맥 호스트 파일(hosts 파일)이란?
:도메인 이름을 IP 주소로 “수동 매핑”해두는 시스템 파일

google.com → 142.250.xxx.xxx
이런 변환을 DNS 서버에 묻기 전에, 내 컴퓨터가 먼저 참고하는 주소록

 

 

전체 흐름 요약

1. 모바일 앱의 네트워크 구조

 

Android 에뮬레이터는 완전히 독립된 가상 네트워크를 가짐.

[Android Emulator]
  IP: 10.0.2.15 (예시)
        │
        │ 
        │
        ▼
Emulator 네트워크 스택  (가상 네트워크, NAT)
        │
        ▼
Emulator DNS 
        │
        ▼
Internet
  • 10.0.2.2 → 항상 호스트 Mac
  • 10.0.2.15 → 에뮬레이터 자기 자신

 

2. 프록시가 개입하는 위치

 

프록시는 DNS 해석 단계에 개입하는 방식이 아니라, 네트워크 요청이 실제로 외부로 전송되는 경로 자체에 개입한다.

App
└─ Proxy
└─ Internet
 
  • 모든 트래픽이 프록시를 반드시 통과

 

3. Proxyman 역할


앱에서 나가는 인터넷 요청을 중간에서 가로채서 특정 주소(Google/Firebase)를 일부러 막게 함.

Android Emulator → 호스트 mac → Proxyman (프록시) → 인터넷
 
  • 에뮬레이터의 모든 네트워크 요청을 호스트 mac으로 이동시킴 (10.0.2.2)
  • Proxyman을 거치도록 설정
  • Proxyman에서 특정 도메인을 Block List로 차단

 

 

 

단계

1. Proxyman 설치 및 실행

  • https://proxyman.io 에서 Proxyman 다운로드
  • 설치 후 실행
  • 상단에 Listening on ... 상태 확인

👉 이 상태면 프록시 서버는 이미 열려 있음

 

 

2. Android 에뮬레이터에 프록시 연결

핵심 개념

  • 10.0.2.2 는 에뮬레이터에서 호스트 Mac을 가리키는 고정 주소

설정 방법

  1. Android Emulator 실행
  2. Settings 앱 실행
  3. Network & Internet → Wi-Fi
  4. 연결된 Wi-Fi 선택 → ⚙️ 수정
  5. Advanced options 펼치기
  6. Proxy → Manual

아래 값 입력:

Proxy hostname:10.0.2.2
Proxy port:8888

 

3. 프록시 연결 확인

 

확인 방법

  1. 에뮬레이터에서 Chrome 실행
  2. 아무 사이트 접속 (예: google.com)
  3. Proxyman 확인

👉 Proxyman에 요청이 실시간으로 보이면 연결 성공

 

4. Proxyman에서 도메인 차단하기

 

Block List 설정

  1. macOS 상단 메뉴바에서:
    ToolsBlock List
  2. Block List Enable ON
  3. 도메인 추가
    • accounts.google.com
      → Google 로그인 화면

5. 테스트 여부 

앱에서 확인

  • Google 로그인 버튼 클릭
  • 로그인 화면이 안 뜸

Proxyman에서 확인

  • 해당 요청이 Blocked / Cancelled / Failed 상태로 표시됨

 

 

+ 추가로 
만약 에뮬레이터에 10.0.2.2로 로컬 맥에 연결하고 
http://10.0.2.2:8080
이렇게 IP를 직접 호출하면

App (Emulator)
 → 10.0.2.2 (Mac)
   → macOS 네트워크 스택


hosts 파일은 “이름(도메인)을 IP로 바꿀 때”만 쓰인다. 위의 방식 역시 이미 IP를 쓰기 때문에, 바꿀 게 없어서 hosts를 볼 이유가 없다.

  • DNS 조회 자체가 없음
  • hosts는 애초에 안 거침
  • IP라서 이름 해석 단계가 없음

즉,

hosts 파일과는 여전히 무관

 

'공부 > flutter' 카테고리의 다른 글

[Flutter] Const construtor  (0) 2025.10.18
[Flutter] 렌더링 엔진  (0) 2025.10.17
[Flutter] DraggableList의 아키텍쳐 분석  (0) 2025.02.19
[Flutter] final 과 const 차이  (0) 2025.02.16
[Flutter] draggable_list 패키지 개발  (0) 2025.01.24