+[{"content":"","date":"2026-02-02","externalUrl":null,"permalink":"/tags/mitmproxy/","section":"Tags","summary":"","title":"Mitmproxy","type":"tags"},{"content":" 작성 배경 # static js 파일 로컬 디버깅이 필요했다. 이전 회사에서 fiddler를 사용했었는데 알고보니 windows os에서만 무료였다. macOS에서 사용 가능한 무료 프로그램 중에 mitmproxy를 선택했다. 이유: 오픈 소스, console 기반, 기능 많음, 원하면 web ui도 사용할 수 있음 mitmproxy를 구성하고 사용하면서 삽질했던 내용을 정리해보려고 한다. mitmproxy? # HTTP/HTTPS 트래픽을 중간에서 가로채서 분석하고 수정할 수 있는 도구 official page: https://mitmproxy.org/ 주요 기능 # 트래픽 모니터링 모든 HTTP/HTTPS 요청과 응답을 실시간으로 확인 헤더, 쿠키, 데이터 등을 분석 트래픽 수정 요청/응답을 중간에서 변경 가능 특정 도메인의 요청을 다른 서버로 리다이렉트 Python 스크립트로 커스텀 로직 추가 주로 사용되는 상황 # 웹/앱 개발 시 디버깅 API 테스트 네트워크 문제 분석 보안 테스트 동작 방식 # [브라우저] → [mitmproxy] → [인터넷/웹서버] → [mitmproxy] → [브라우저]\n브라우저가 https://google.com 접속 시도 시스템 프록시 설정으로 인해 요청이 localhost:8080(mitmproxy 기본 포트)로 전달됨 mitmproxy가 요청을 분석/기록 mitmproxy가 실제 google.com으로 요청을 전달 google.com이 응답 mitmproxy가 응답을 분석/기록 mitmproxy가 브라우저에게 응답 전달 비슷한 프로그램 # Charles Proxy 유료 Fiddler Windows 에서 많이 사용 특정 파일로 바인딩하는 기능을 Mac에서 사용하려면 유료 Wireshark 설치 # 환경: macOS mitmproxy 설치 # # homebrew를 통한 설치 brew install mitmproxy 인증서 설치 # mitmproxy를 한번이라도 실행했다면 ~/.mitmproxy 하위에 CA 인증서가 설치된다. 참조: https://docs.mitmproxy.org/stable/concepts-certificates/#installing-the-mitmproxy-ca-certificate-manually 인증서 설치에 실패한다면 mitmproxy를 먼저 실행한다. mitmproxy 실행\n# 기본 포트(8080)로 실행 mitmproxy # 원하는 포트를 지정하여 실행 mitmproxy --listen-port 8888 인증서 설치\n# macOS (automated) sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pem 설치 후 키체인 접근 앱에서 확인 가능 키체인 접근 앱 - 시스템 키체인 - 시스템 실행 # 프록시 서버 설정하기 # 시스템 설정 앱 혹은 터미널 명령 중 편한 방법으로 프록시 서버를 설정한다. 1. 시스템 설정 # 시스템 설정 - 검색바에 프록시 검색 - 프록시 메뉴에 접근한다. 현재 연결된 네트워크의 프록시 구성 화면임 웹 프록시(HTTP), 보안 웹 프록시(HTTPS)를 켜고 다음 정보를 입력한다. 서버: 127.0.0.1 or localhost 포트: 8080 시스템 설정 - 프록시 구성 화면 2. 터미널 명령 # 1번 과정을 터미널 명령어로 간단하게 할 수 있다. # https # networksetup -setsecurewebproxy \u0026#34;Wi-Fi\u0026#34; [프록시서버주소] [포트번호] networksetup -setsecurewebproxy \u0026#34;Wi-Fi\u0026#34; 127.0.0.1 8080 # http # networksetup -setwebproxy \u0026#34;Wi-Fi\u0026#34; [프록시서버주소] [포트번호] networksetup -setwebproxy \u0026#34;Wi-Fi\u0026#34; localhost 8080 mitmproxy 실행 # # mitmproxy 실행 mitmproxy mitmproxy 실행 후 브라우저로 여기 저기 돌아다니다 보면 이 이미지처럼 mitmproxy에 트래픽이 쌓이는 걸 확인할 수 있다. mitmproxy 종료 # mitmproxy 실행하면 하단에 기능 키들이 보임 종료는 q → y 프록시 설정 해제 # 프록시 설정 화면에서 웹 프록시(HTTP), 보안 웹 프록시(HTTPS) off 터미널 명령어로 프록시 설정 해제하기 networksetup -setwebproxystate \u0026#34;Wi-Fi\u0026#34; off networksetup -setsecurewebproxystate \u0026#34;Wi-Fi\u0026#34; off mitmproxy 종료 후 프록시 설정을 해제 하지 않으면 모든 인터넷이 안됨 프록시 설정과 mitmproxy 실행을 한번에 하기 # 실행 스크립트 # 프록시 설정과 mitmproxy 실행을 한번에 해주는 간단한 스크립트 # proxy-start #!/bin/bash networksetup -setwebproxy \u0026#34;Wi-Fi\u0026#34; localhost 8888 networksetup -setsecurewebproxy \u0026#34;Wi-Fi\u0026#34; localhost 8888 mitmproxy --listen-port 8888 Info mitmproxy listening port == proxy server port mitmproxy로 listening 할 포트와 프록시 서버의 포트는 같아야함\n프록시 해제 스크립트 # 프록시 설정만 해제하는 스크립트 mitmproxy는 직접 종료해야함 # proxy-stop #!/bin/bash networksetup -setwebproxystate \u0026#34;Wi-Fi\u0026#34; off networksetup -setsecurewebproxystate \u0026#34;Wi-Fi\u0026#34; off 실행 권한 추가 # chmod +x proxy-st* 명령어로 추가 # sudo mv proxy-st* /usr/local/bin Apple Silicon Mac 사용중인데 /usr/local/bin 폴더가 없다면? 수동으로 /usr/local/bin 폴더 만들기 시스템 전역에서 사용 가능 다른 사용자들도 동일한 명령어 사용 가능 개인 사용자용으로 ~/.local/bin 폴더 사용 개인 용도라면 ~/.local/bin 폴더를 사용하는게 더 깔끔하고 안전함 권한 문제도 발생하지 않음 고급 # 요청 가로채기(Python addon) # python 스크립트로 트래픽을 변경할 수 있다. 원하는 요청을 원하는 서버로 전달하도록 구성할 수 있는데 나는 주로 운영 환경 요청을 내 로컬에서 확인하고 싶을 때 사용했다. python 스크립트 작성\n원하는 경로에 python 파일을 생성한다. 나는 ~/.mitmproxy 디렉토리에 redirect.py라는 파일을 생성했다. from urllib.parse import urlparse from mitmproxy import http # \u0026#34;가로챌 서버\u0026#34;:\u0026#34;redirect할 서버\u0026#34; mapping = { \u0026#34;https://my-server.com\u0026#34;: \u0026#34;http://localhost:8080\u0026#34;, \u0026#34;https://api.my-server.com\u0026#34;: \u0026#34;http://localhost:8080\u0026#34;, \u0026#34;https://my-2nd-server.com\u0026#34;: \u0026#34;http://localhost:8080\u0026#34; } def request(flow: http.HTTPFlow) -\u0026gt; None: # pretty_host takes the \u0026#34;Host\u0026#34; 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 == \u0026#34;https\u0026#34;: flow.request.port = 443 else: flow.request.port = 80 flow.request.scheme = redirect_parsed.scheme 위에서 구성한 내용을 적용하려면 mitmproxy 실행 시 옵션을 주면 된다.\n# mitmproxy -s [python 스크립트 파일 위치] mitmproxy -s ~/.mitmproxy/redirect.py 요청을 항상 가로채도록 구성하기 # 매번 옵션과 경로를 포함해서 실행하는 건 귀찮다. mitmproxy가 redirect.py 파일을 항상 참조하도록 구성할 수 있다. ~/.mitmproxy 디렉토리에 config.yaml 파일을 생성하고 해당 파일에 참조할 파일 경로를 작성한다. # ~/.mitmproxy/config.yaml # scripts: [\u0026#34;파일경로\u0026#34;] scripts: [ \u0026#34;~/.mitmproxy/redirect.py\u0026#34; ] http2: false # 필요 시 listen_port: 8090 # 필요 시. mitmproxy 기본 포트는 8080 특정 파일 로컬 파일로 대체하기(map_local) # 사실 이 기능이 내가 찾던 기능이었다..ㅎ 담당 프로젝트가 바뀌면서 이 기능을 사용할 일이 없어졌지만.. 알아둬서 나쁠 거 없겠지.. Options - map_local 에서\n|요청을 가로챌 대상 파일|가로챈 요청을 대체할 파일 # 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 를 눌러 빠져나온다\n더보기 구분자는 꼭 | 가 아니어도 됨 맨 앞에 쓰인 첫번째 기호가 구분자로 쓰임 예를 들어 !를 구분자로 쓴다면 다음과 같이 사용할 수 있음 !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/ https://blog.outsider.ne.kr/1514 https://velog.io/@rolroralra/mitmproxy-사용법 ","date":"2026-02-02","externalUrl":null,"permalink":"/posts/mitmproxy%EB%A1%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%8A%B8%EB%9E%98%ED%94%BD-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0/","section":"Posts","summary":"","title":"mitmproxy로 네트워크 트래픽 확인하기","type":"posts"},{"content":"","date":"2026-02-02","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"2026-02-02","externalUrl":null,"permalink":"/tags/proxy/","section":"Tags","summary":"","title":"Proxy","type":"tags"},{"content":"","date":"2026-02-02","externalUrl":null,"permalink":"/","section":"R11S","summary":"","title":"R11S","type":"page"},{"content":"","date":"2026-02-02","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"2026-01-30","externalUrl":null,"permalink":"/about/","section":"R11S","summary":"","title":"About","type":"page"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]
0 commit comments