회사 프로젝트에서 이슈가 발생했다. 이미 런칭된 앱이 해외에서 정상적으로 실행되지 않는다는 이슈였다.
가장 먼저 든 생각은 “혹시 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을 가리키는 고정 주소
설정 방법
- Android Emulator 실행
- Settings 앱 실행
- Network & Internet → Wi-Fi
- 연결된 Wi-Fi 선택 → ⚙️ 수정
- Advanced options 펼치기
- Proxy → Manual
아래 값 입력:
Proxy hostname:10.0.2.2
Proxy port:8888
3. 프록시 연결 확인
확인 방법
- 에뮬레이터에서 Chrome 실행
- 아무 사이트 접속 (예: google.com)
- Proxyman 확인
👉 Proxyman에 요청이 실시간으로 보이면 연결 성공
4. Proxyman에서 도메인 차단하기
Block List 설정
- macOS 상단 메뉴바에서:
Tools → Block List - Block List Enable ON
- 도메인 추가
- accounts.google.com
→ Google 로그인 화면
- accounts.google.com
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 |