- 이전 회사에서 fiddler 라는 프로그램으로 static js 디버깅을 했었음
- windows os에서는 무료로 사용할 수 있지만 macOS에서 사용하려면 유료였음
- fiddler를 대체할만한 프로그램을 찾아보다가 mitmproxy를 알게 됐음
- mitmproxy를 활용하여 프론트엔드-백엔드 연동이 필요한 디버깅을 수월하게 함
mitmproxy 란?
- HTTP/HTTPS 트래픽을 중간에서 가로채서 분석하고 수정할 수 있는 도구
- official page: https://mitmproxy.org/
주요 기능
- 트래픽 모니터링
- 모든 HTTP/HTTPS 요청과 응답을 실시간으로 확인
- 헤더, 쿠키, 데이터 등을 분석
- 트래픽 수정
- 요청/응답을 중간에서 변경 가능
- 특정 도메인의 요청을 다른 서버로 리다이렉트
- Python 스크립트로 커스텀 로직 추가
주로 사용되는 상황:
- 웹/앱 개발 시 디버깅
- API 테스트
- 네트워크 문제 분석
- 보안 테스트
동작 방식
[브라우저] → [시스템 프록시 설정] → [mitmproxy] → [인터넷/웹서버]
- 브라우저가 https://google.com 접속 시도
- 시스템 프록시 설정으로 인해 요청이 localhost:8080(mitmproxy 기본 포트)로 전달됨
- mitmproxy가 요청을 분석/기록
- mitmproxy가 실제 google.com으로 요청을 전달
- google.com이 응답
- mitmproxy가 응답을 분석/기록
- mitmproxy가 브라우저에게 응답 전달
비슷한 프로그램
- Charles Proxy
- 유료
- Fiddler
- Windows 에서 많이 사용
- 특정 파일로 바인딩하는 기능을 Mac에서 사용하려면 유료
- Wireshark
설치
mitmproxy 설치
- 환경: macOS
# homebrew를 통한 설치
brew install mitmproxy
# mitmproxy 실행
mitmproxy
인증서 설치
- mitmproxy 를 한번이라도 실행했다면 ~/.mitmproxy 하위에 CA 인증서가 설치된다.
- 인증서 설치에 실패한다면 mitmproxy를 먼저 실행
# --listen-port 8888 옵션은 생략가능. 기본 포트는 8080. 충돌 시 포트 지정하여 실행.
mitmproxy --listen-port 8888
인증서 설치
# macOS (automated)
sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pem
- 설치 후
키체인 접근
앱에서 확인 가능 - 키체인 접근 - 시스템 키체인 하위 시스템
실행
프록시 서버 설정
아래 방법 중 하나를 선택하여 프록시 서버를 설정한다.
시스템 설정
- 시스템 설정 - Wi-Fi - 연결된 Wi-Fi 의 세부사항… 버튼 클릭 - 프록시
혹은
- 시스템 설정 - 검색바에
프록시
검색 - 프록시(연결된 네트워크의 프록시 창이 열림) - 웹 프록시(HTTP), 보안 웹 프록시(HTTPS) 를 켜고 다음 정보를 입력한다.
- 서버
- 127.0.0.1
- 포트
- 8080
- 서버
터미널
networksetup -setsecurewebproxy "Wi-Fi" localhost 8888 # https
networksetup -setwebproxy "Wi-Fi" localhost 8888 # http
mitmproxy 실행
# mitmproxy 실행
mitmproxy
종료
q
를 눌러 종료
프록시 설정 해제
- 프록시 설정 화면에서 웹 프록시(HTTP), 보안 웹 프록시(HTTPS)
off
- 설정을 해제 하지 않으면 모든 인터넷이 안됨
프록시 설정 및 mitmproxy 실행 스크립트화
프록시 설정 및 mitmproxy 실행 스크립트 파일 생성
# proxy-start
#!/bin/bash
networksetup -setwebproxy "Wi-Fi" localhost 8888
networksetup -setsecurewebproxy "Wi-Fi" localhost 8888
mitmproxy --listen-port 8888
프록시 설정 해제 스크립트 파일 생성
# proxy-stop
#!/bin/bash
networksetup -setwebproxystate "Wi-Fi" off
networksetup -setsecurewebproxystate "Wi-Fi" off
실행 권한 추가
chmod +x proxy-st*
명령어로 추가
sudo mv proxy-st* /usr/local/bin
고급
요청 가로채기(Python addon)
redirect.py
파일 생성
from urllib.parse import urlparse
from mitmproxy import http
# "가로챌 서버":"redirect할 서버"
mapping = {
"https://my-server.com": "http://localhost:8080",
"https://api.my-server.com": "http://localhost:8080",
"https://my-2nd-server.com": "http://localhost:8080"
}
def request(flow: http.HTTPFlow) -> None:
# pretty_host takes the "Host" header of the request into account,
# which is useful in transparent mode where we usually only have the IP
# otherwise.
for org_url, redirect_url in mapping.items():
org_parsed = urlparse(org_url)
if flow.request.pretty_host == org_parsed.hostname:
redirect_parsed = urlparse(redirect_url)
flow.request.host = redirect_parsed.hostname
if redirect_parsed.port is not None:
flow.request.port = redirect_parsed.port
else:
if redirect_parsed.scheme == "https":
flow.request.port = 443
else:
flow.request.port = 80
flow.request.scheme = redirect_parsed.scheme
redirect.py 참조하도록 실행
# mitmproxy -s [redirect.py 파일 위치]
mitmproxy -s ~/.mitmproxy/redirect.py
config.yaml
파일 생성
실행 시 redirect.py
자동으로 참조하도록 하려면 ~/.mitmproxy/config.yaml
파일에 참조할 파일을 작성한다.
# scripts: ["파일경로"]
scripts: ["~/.mitmproxy/redirect.py"]
http2: false # 필요 시
listen_port: 8090 # 필요 시. mitmproxy 기본 포트는 8080
특정 파일 로컬 파일로 대체하기(map_local)
Options - map_local 에서
|요청을 가로챌 대상 파일|가로챈 요청을 대체할 파일
# e.g.
- 요청을 가로챌 대상 파일: https://file.my-server.com/my-script.min.js
- 대체 파일: /Users/river/my-local-script.min.js
|https://file.my-server.com/my-script.min.js|/Users/river/my-local-script.min.js
형태로 입력 후 [esc
] - q
를 눌러 빠져나온다
더보기
구분자는 꼭 |
가 아니어도 됨
맨 앞에 쓰인 첫번째 기호가 구분자로 쓰임
!https://file.my-server.com/my-script.min.js!/Users/river/my-local-script.min.js
이렇게 사용할 수도 있음
References
https://blog.psi59.com/posts/2020-08-09-mitmproxy-installation/