이 페이지는 처음부터 끝까지 따라 하는 튜토리얼입니다. 위에서 아래로 진행하면 갓 설치한 상태에서 시작해, 캡처한 HTTPS 요청을 살펴보고 Repeater로 보내 편집한 뒤 재전송하는 것까지 터미널을 벗어나지 않고 끝낼 수 있습니다. 10분 정도 잡아 두세요.
각 단계는 확인 항목으로 끝납니다. 다음으로 넘어가기 전에 보여야 하는 상태입니다. 화면이 다르게 보인다면 그 지점에서 멈추고 바로잡으세요.
시작하기 전에. gori를 설치하고 브라우저를 준비하세요. 자신의 브라우징을 캡처하게 되므로, 테스트 권한이 있는 사이트(자신의 앱, 스테이징 서버, 또는 의도적으로 취약하게 만든 연습용 타깃)를 고르세요. 정확한 결과가 필요한 부분에서는 안정적인 일회용 타깃인
example.com을 사용합니다.
1. gori 시작하기
하위 명령 없이 실행하면 프로젝트 선택 화면이 열립니다. 프로젝트를 열면 프록시가 시작됩니다:
gori
첫 실행 시 짧은 설정 마법사(전역 바인드, 테마, Miss Ring 마스코트)가 실행되고, 이어서 가이드 UI 투어를 제안합니다. 투어는 지금 해도 되고 건너뛰었다가 나중에 돌아와도 됩니다. 이 페이지는 같은 내용을 실제 트래픽으로 다룹니다.
프로젝트 선택 화면에서 New project를 고르고 이름을 입력한 뒤 Enter를 두 번 누르세요(설명은 선택 사항). 첫 실행에서 가이드 투어를 마치면 이 화면으로 돌아옵니다.
어떤 프로젝트가 토큰, 호스트, 엔드포인트 같은 무언가를 캡처했는지 찾으려면 프로젝트 선택 화면에서 Ctrl-F를 누르고 입력하세요. gori가 모든 프로젝트의 플로우를 호스트와 경로로 검색하고, 세 글자 이상 입력하면 본문 텍스트로도 검색한 뒤 결과를 프로젝트별로 보여 줍니다. Enter를 누르면 해당 프로젝트가 그 플로우의 상세 화면이 열린 상태로 열립니다. Esc는 아직 진행 중인 검색을 멈추고, 검색이 끝난 뒤에는 검색 창을 닫습니다.
기본적으로 프록시는 127.0.0.1:8070에서 수신합니다. 한 번의 실행에 대해서만 재정의할 수 있습니다(프로젝트 자체 바인드가 설정되어 있으면 여전히 그쪽이 우선합니다):
gori --listen 0.0.0.0 --port 8080
확인. 프로젝트 세션이 History 탭에서 열렸습니다. Project, Target, History, … 탭과 프록시 주소 127.0.0.1:8070을 보여주는 상단 바가 보입니다.
2. CA 신뢰 후 첫 플로우 캡처
HTTPS를 읽으려면 클라이언트가 gori의 루트 인증서(첫 실행 시 ~/.gori/ca 아래에 생성됨)를 신뢰해야 합니다. 가장 쉬운 방법은 사전 신뢰된 브라우저입니다.
Option A: 사전 신뢰된 브라우저 열기 (권장)
TUI 안에서:
Ctrl-P를 눌러 커맨드 팔레트를 엽니다.browser를 입력하고 Open browser를 실행합니다.- 설치된 브라우저(Chrome, Chromium, Brave, Edge, Firefox, …)를 고릅니다.
gori는 이미 CA를 신뢰하고 HTTP/HTTPS를 프록시로 경유하는 일회용 프로파일로 브라우저를 실행합니다. 그 브라우저에서 사이트를 방문하세요(https://example.com을 먼저, 그다음 테스트 중인 사이트를).
Firefox 참고. CA 자동 신뢰에는
PATH에 있는certutil(NSS)이 필요합니다. 없으면 gori가 프록시는 설정하지만 Firefox가 CA를 신뢰하지 않아 HTTPS 사이트에서 보안 경고가 뜹니다. 먼저 설치하고(macOS는brew install nss, Debian/Ubuntu는apt install libnss3-tools, Fedora는dnf install nss-tools) 브라우저를 다시 열거나, 같은 창에서 직접 신뢰 등록하세요:about:preferences#privacy를 열고 인증서 보기, 인증기관 탭으로 가서gori ca가 출력한 파일을 가져오기 하면 됩니다.
Option B: 클라이언트를 직접 지정하기
CA 경로를 출력하고 그 파일을 시스템 또는 브라우저 신뢰 저장소에 신뢰된 루트 CA로 가져오세요:
gori ca
그런 다음 클라이언트가 127.0.0.1:8070을 HTTP 및 HTTPS 프록시로 사용하도록 설정하세요. 다른 터미널에서 간단한 동작 확인:
curl -x http://127.0.0.1:8070 https://example.com
gori는 필요할 때 루트로 호스트별 리프 인증서를 발급하므로, 루트만 한 번 신뢰하면 됩니다.
커맨드라인 도구에는 지름길이 있습니다. gori run shell(또는 팔레트의 Open shell)은 OS 설정을 건드리지 않고, curl, git, Python, Go, Node 트래픽이 실행 중인 gori를 거치며 그 CA를 신뢰하는 셸을 엽니다. gori run shell -- curl https://example.com은 명령 하나만 그렇게 실행합니다. gori run shell을 참고하세요.
gori의 개인 키는 이 머신에만 두는 비밀입니다.
0600권한으로 기록되며 머신 밖으로 나가지 않습니다. 이전의 모든 신뢰를 무효화할 의도가 있을 때만 팔레트(Regenerate CA certificate)에서 교체하세요.
Option C: 휴대폰이나 태블릿에 CA 설치하기
휴대폰은 파일 시스템에서 CA를 읽을 수 없으므로, gori가 네트워크로 직접 제공합니다.
-
기기가 접근할 수 있도록 프록시를 바인딩하고 머신의 LAN IP를 확인하세요:
gori --listen 0.0.0.0 --port 8070 -
기기에서 WiFi의 HTTP 및 HTTPS 프록시를
<LAN-IP>:8070으로 설정합니다. -
그 기기의 브라우저에서 **
http://gori.proxy/**로 접속합니다(http://gori/도 됩니다). -
인증서를 내려받아 신뢰 등록합니다. iOS는 두 단계입니다. 프로파일을 설치한 뒤 설정 → 일반 → 정보 → 인증서 신뢰 설정에서 활성화하세요. Android는 설정 → 보안 → 암호화 및 인증 정보 → 인증서 설치 → CA 인증서에서 설치합니다.
gori.proxy는 gori가 스스로 응답하는 예약된 이름입니다. 프록시를 설정한 뒤에만 동작하며 네트워크로 나가지 않습니다. 프록시를 먼저 설정하고 싶지 않다면 http://<LAN-IP>:8070/으로 바로 접속해도 같은 페이지가 나옵니다.
Option D: adb로 Android 에뮬레이터 설정하기
adb가 PATH에 있고(또는 ANDROID_HOME이 설정되어 있고) 에뮬레이터가 실행 중이거나 USB 디버깅을 켠 기기가 연결되어 있으면 gori가 설정을 대신합니다. 프록시는 loopback에 그대로 있고, 기기의 트래픽은 adb reverse로 전달됩니다.
gori run android setup --dry-run # adb 명령을 먼저 출력
gori run android setup --system # Play Store 없는 에뮬레이터, 또는 루팅된 기기
gori run android undo # 프록시와 포트 매핑 해제
--system은 root 권한으로 gori의 루트 인증서를 시스템 저장소에 넣으므로, 앱은 network security config 없이도 신뢰합니다. 기기를 재부팅하면 사라집니다. root가 필요하며 Android 14+(API 34)는 아직 지원하지 않습니다. 기본값인 --user는 인증서를 /sdcard/Download/gori-ca.crt에 올리고 보안 설정을 열어 CA 인증서로 설치하게 합니다. API 24 이상을 대상으로 하는 앱은 network security config에서 허용해야만 사용자 CA를 신뢰합니다. TUI에서는 팔레트의 Set up Android device가 같은 단계를 실행합니다. gori run android를 참고하세요.
확인. History로 전환하세요(3). 최소 한 개의 행이 보여야 합니다. 200 상태의 GET https://example.com/ 요청입니다. History가 비어 있다면 트래픽이 gori에 닿지 않는 것입니다. 프록시 설정(Option B)을 다시 확인하거나 Open browser(Option A)를 사용하세요.
3. 두 가지 탐색 표면 익히기
탭별 단축키를 외울 필요는 없습니다. 키 두 개로 모든 동작에 닿습니다.
| 표면 | 키 | 용도 |
|---|---|---|
| space 메뉴 | Space |
지금 있는 패널(History 행, 플로우 상세, Repeater 편집기, …)에서 가장 자주 하는 동작, 동작마다 글자 하나 |
| 커맨드 팔레트 | Ctrl-P |
모든 동작을 이름을 입력해 찾기: 그 패널의 동작이 먼저, 이어서 설정이나 Open browser 같은 앱 전역 동작 |
둘 다 동작 옆에 그 단축키를 보여주므로, 열어 보는 것 자체가 키를 익히는 방법입니다. 방금 캡처한 플로우로 바로 해 보세요.
- History에서
↓로 플로우를 고른 뒤Space를 누릅니다. 행 왼쪽 글자는 그 행을 실행하고, 오른쪽 키(Repeater flow 옆의^R)는 메뉴 없이 같은 일을 합니다.>**Send flow to…**처럼›가 붙은 행은 두 번째 카드를 열고,Esc는 한 단계 뒤로 갑니다. 메뉴가 닫힐 때까지Esc를 누르세요. Ctrl-P를 누르고send를 입력합니다. History의 동작이THIS TAB아래 먼저 나오고, 각각 닿는 키나 메뉴 경로가 함께 보입니다(␣ > c는Space,>,c순서).Esc를 누릅니다.
send를 입력한 커맨드 팔레트(Ctrl-P): 그 탭의 동작이 더 빠른 길과 함께 먼저 나오고, 앱 전역 명령이 뒤따릅니다.space 메뉴와 팔레트에서 Z Display…, P Protocol… 카드와 팔레트에만 있는 동작까지 자세히 다룹니다.
처음부터 알아 두면 좋은 전역 토글 세 가지입니다:
| 키 | 동작 |
|---|---|
c |
캡처 토글(끄면 프록시가 리스닝을 멈추고 아무것도 기록하지 않음) |
i |
인터셉트 토글(일치하는 요청을 잡아 forward / drop / edit) |
s |
스코프 렌즈 토글(뷰를 스코프 내 트래픽으로 필터) |
4. TUI 이동하기
gori의 화면은 한 줄로 늘어선 탭입니다. 기본 순서는 Project → Target → History → Intercept → Repeater → Fuzzer → … 로 시작합니다.
| 키 | 동작 |
|---|---|
[ / ] |
이전 / 다음 탭 |
1-9 |
N번째 표시된 탭으로 이동(기본값에서 History는 3) |
Enter / ↓ |
탭 바에서 탭 본문으로 진입 |
Esc |
포커스를 탭 바 쪽으로 되돌림 |
Tab / Shift-Tab |
탭 바와 패널 사이로 포커스 이동 |
마우스는 활성화하면(Preferences → Editor & Keys → Mouse) 동작합니다. 탭을 클릭하고, 행을 클릭해 선택하고, 한 번 더 클릭해 엽니다. Help 탭(?)은 앱 안에 있는 전체 키 치트시트입니다.
5. History에서 플로우 읽기
History가 활성화되어 있는지 확인하세요(3). 모든 요청/응답은 플로우입니다. 플로우에는 시작 줄, 헤더, 본문(기본값으로 앞 2 MiB까지 저장)이 담기고, 해당하면 HTTP/2 프레임, WebSocket 메시지, 디코드된 JWT / SAML / GraphQL도 함께 담깁니다.
다음을 하나씩 해보세요:
| 키 | 동작 |
|---|---|
↑ / ↓ (또는 j / k) |
선택 이동 |
Enter |
요청/응답 상세 열기 |
/ |
쿼리 언어로 필터 |
Space Z f |
최신 따라가기(tail) 토글 |
y |
선택한 플로우 복사 |
/를 누르고 필터를 입력한 뒤 Enter를 누르세요:
host:example.com
History가 그 호스트로 좁혀집니다. 필터를 지우면(/, 지우기, Enter) 다시 전체가 보입니다. 나중에 시도해 볼 몇 가지:
status:5xx
method:POST body:password
이제 example.com 플로우를 선택하고 Enter를 누르세요. 상세 화면에서는 ↑ / ↓로 스크롤하고 y로 복사하며, hex / whitespace / pretty 본문은 Ctrl-X / b / p로 토글합니다. Esc로 목록에 돌아옵니다.
확인. History를 호스트 하나로 필터하고, 플로우를 열어 전체 요청과 응답을 읽을 수 있습니다.
6. Repeater로 보내 재전송하기 (핵심 루프)
대부분의 시간을 보내게 될 루프입니다. 캡처한 요청을 가져와 무언가를 바꾸고, 다시 보내고, 비교합니다.
-
History에서
example.com플로우를 선택합니다. -
Ctrl-R을 누릅니다. gori가 플로우를 Repeater 탭으로 복사하고 그쪽으로 전환합니다. -
요청 패널에서
Enter또는i를 눌러 편집합니다(INS 모드). 작은 것 하나를 바꿔 보세요. 예를 들어 헤더 한 줄을 추가합니다:X-Gori-Test: 1 -
Esc로 편집 모드를 벗어난 뒤Ctrl-R로 전송합니다.편집 중 복사하기:
Shift+화살표는 두 모드 모두에서 선택하지만, 복사 키는 다릅니다. READ에서는y이고, INS에서y는 리터럴 문자라 선택 위에 입력하면 선택을 덮어씁니다. 그러니 **Ctrl-Y**를 쓰세요.Esc도 선택을 INS 밖으로 들고 나오므로Esc뒤y도 됩니다. 어떤 키 입력이 선택을 먹어 버렸다면,Ctrl-Z가 한 번에 되돌립니다. -
응답과 타이밍, 이전 응답 대비 diff가 오른쪽에 나타납니다.
Tab으로 target → request → response를 순회합니다.
확인. Repeater 상태 줄에 sent → 200 in … ms 같은 문구가 보이고, Ctrl-R로 원하는 만큼 재전송할 수 있습니다. 이것이 완전한 캡처 → 검사 → 리플레이 루프입니다.
7. 다음으로 갈 곳
이제 핵심 루프를 갖췄습니다. 여기서부터는 Playbooks가 이어받아, 스코프·매핑·인터셉트·퍼징·리포트를 한 번에 하나씩 체크포인트와 함께 끝까지 안내합니다. 아래는 첫 방향 몇 가지이며, 각각 가이드에서도 깊이 다룹니다:
- 파라미터 퍼징. 플로우를 선택하고
Shift-I로 Fuzzer에 보낸 뒤, 위치를 표시하고(Ctrl-A가 흔한 파라미터를 자동 표시), 워드리스트를 붙이고Ctrl-R로 실행합니다. Repeater & Fuzzer를 보세요. - 오가는 도중에 잡아 편집하기.
i를 눌러 일치하는 요청을 잡아 두고, 계속 진행되기 전에 forward, drop, 또는 수정합니다. Proxy & History를 보세요. - 찾은 것 추적하기. 보고할 가치가 있는 것은
Shift-F로 Issue로 만들고, 둘러보는 동안 Probe 탭에서 패시브 결과를 읽으세요. Scanning & Issues를 보세요.
Day-1 키 맵
키 조합이 손에 익을 때까지 이 표를 가까이 두세요:
| 키 | 위치 | 동작 |
|---|---|---|
Space |
포커스된 패널 | space 메뉴: 이 패널의 동작, 동작마다 글자 하나 |
Ctrl-P |
어디서나 | 커맨드 팔레트: 아무 동작이나 이름으로 찾기 |
? |
어디서나 | Help: 전체 키 목록 |
Ctrl-, |
어디서나 | Preferences(모든 설정을 담은 하나의 모달) |
c / i / s |
어디서나 | 캡처 / 인터셉트 / 스코프 렌즈 |
[ ] · 1-9 |
어디서나 | 탭 전환 |
/ |
History | 쿼리 언어 필터 |
Enter |
History | 플로우 상세 열기 |
Ctrl-R |
History | → Repeater |
Shift-I |
History | → Fuzzer |
> |
History | Send flow to…로 아무 도구에나 보내기(> c → Comparer) |
Ctrl-R |
Repeater / Fuzzer | 요청 전송 / 퍼즈 실행 |
Esc |
대부분의 곳 | 한 단계 뒤로 |
첫 실행 마법사
가이드 설정(전역 프록시 바인드 기본값, 테마, 그다음 Miss Ring)을 언제든 다시 실행할 수 있습니다:
gori wizard
수신 IP의 기본값 127.0.0.1은 이 컴퓨터에서만 접속할 수 있고, 0.0.0.0을 고르면 다른 기기에서도 접속할 수 있습니다. 첫 Enter는 IP에서 포트로 이동하고 다음 Enter는 계속 진행합니다. 이 값은 settings.json의 공유 기본값이며, 프로젝트별 주소는 Project 탭에서 따로 고정할 수 있습니다. 포트가 이미 사용 중이면 Enter를 한 번 더 눌러 그대로 유지할 수 있습니다. Esc를 두 번 누르면 마법사를 건너뜁니다.
마지막 Review 스텝은 선택한 값을 요약하고, 현재 에디터 키셋과 바꾸는 곳을 알려 줍니다(마법사는 키셋을 바꾸지 않습니다). 편집 가능한 행이 하나 있습니다. Shortcuts입니다. ←/→로 gori 내장 키 조합 패밀리(^P ^N ^W ^1-9)의 모디파이어를 Ctrl과 Option (⌥) 사이에서 전환합니다. Option을 고르면 Ctrl을 대체하는 게 아니라 ⌥ 별칭이 추가됩니다. 터미널이나 멀티플렉서가 Ctrl 형태를 전달하지 않을 때 유용합니다. macOS의 Option-as-Meta 요구사항은 커맨드 모디파이어를 참고하세요.
가이드 UI 투어
탭/패널 이동, space 메뉴(두 번째 카드 포함), 커맨드 팔레트 검색, READ/INS 편집 모드에 이어, 트래픽 자체를 다룹니다: 클라이언트를 어디로 향하게 하고 CA를 어떻게 신뢰시키는지, 캡처 스위치, 인터셉트. 모두 목업 UI에서 따라가며, 실제 프록시 세션 없이 안전하게 실행할 수 있습니다. 각 레슨은 짧은 데모를 보여주고 실제 키를 눌러 보도록 요청합니다. 앞의 네 가지 동작은 실습 샌드박스에서 직접 해보고, 투어는 도움말과 종료 방법, 첫 세션 체크리스트로 끝납니다. 목업 메뉴는 재지정한 키를 포함해 설치된 gori와 같은 글자와 키를 씁니다.
gori tutorial
이 투어는 첫 실행 마법사의 마지막에도 제안되며, 세션 안에서는 팔레트 명령 Guided tour(Ctrl-P)로 열 수 있습니다. 마지막 카드는 투어를 마치면 프로젝트 선택 화면, --db 세션, 셸, 현재 세션 중 어디로 이어지는지 안내합니다.
다음 단계
- 설정: 저장소 구조, 네트워크 설정, 그리고 CA
- Proxy & History: 캡처, 인터셉트, 스코프, 가져오기, match & replace
- Repeater & Fuzzer: 테스트 워크벤치와 env 토큰
- Query Language: 전체 필터 문법
- space 메뉴와 팔레트: 키를 외우지 않고 모든 동작 찾기
- Hotkeys: 위의 키 조합을 원하는 대로 재지정