Skip to content

feat: Rust로 포팅하고 쿼리 키 인증 추가 - #5

Merged
psi59 merged 2 commits into
mainfrom
rust-port
Oct 11, 2026
Merged

psi59 merged 2 commits into
mainfrom
rust-port

Conversation

@psi59

@psi59 psi59 commented Oct 11, 2026

Copy link
Copy Markdown
Owner

요약

Go 구현을 Rust(hyper/tokio)로 포팅하고, Cloudflare Access 대신 쓸 수 있는 쿼리 키 인증을 추가합니다.

Rust 포팅

외부에서 관찰되는 동작은 Go 버전과 동일하게 유지했습니다.

  • Go 표준 라이브러리 동작을 바이트 단위로 재현
    • net/url: 쿼리 파싱, 이스케이프, URL 검증
    • net/http: 리다이렉트 본문, ServeMux 경로 정리(307), Host 검증
    • encoding/json, yaml.v3: 디코딩·인코딩 규칙
  • Go 테스트를 Rust로 옮기고 테스트를 추가해 총 73개

동일성 검증

같은 설정으로 Go/Rust 서버를 나란히 띄우고 119개 요청을 보내 상태줄·헤더·본문을 비교했고, 모두 일치했습니다.

  • 포함한 요청: 잘못된 UTF-8, 경로 정리, POST/HEAD, OPTIONS *, Host 누락, 1만 개 초과 파라미터
  • 포함한 업스트림 상황: 네이버 형식, 500, 1MB 초과, 타임아웃, gzip, 리다이렉트
  • 실제 Google·Wikipedia·YouTube·네이버 자동완성 응답도 일치
  • 설정 핫 리로드 동작도 일치

성능 (CPU 2코어, 동시 연결 64)

엔드포인트 Go Rust
/search 12.4만 rps, p99 1.8ms 18만 rps, p99 0.9ms
/suggest 2.3만 rps, p99 6.7ms 7.3만 rps, p99 1.7ms
/health 13.4만 rps 20만 rps

달라진 점

  • 로그를 tracing JSON으로 변경. 필드명은 유지했지만 time→timestamp, info→INFO로 바뀜
  • 메모리: mimalloc 사용으로 대기 15.7MB, 최대 22MB (Go 8.6MB / 17.6MB)
  • 2KB 넘는 응답을 chunked 대신 Content-Length로 전송 (클라이언트 동작에는 영향 없음)
  • Dockerfile, CI(fmt/clippy/test), pre-commit 훅을 cargo 기반으로 변경. Go 커버리지용 Codecov 업로드 단계는 제거

쿼리 키 인증

  • BANGS_AUTH_KEYS(쉼표 구분)를 설정하면 /, /search, /suggest, /opensearch.xml에 key 쿼리 파라미터를 요구
  • 키가 없거나 틀리면 일반 404를 반환
  • /health, /favicon.ico는 열어 둠
  • /?key=...로 접속해 검색엔진을 등록하면 OpenSearch 템플릿에 키가 포함됨
  • 키 비교는 상수 시간, 여러 키를 등록해 교체 가능, 키가 32자 미만이면 시작 시 경고
  • 키는 업스트림으로 전달되지 않고 로그에도 남지 않음

테스트 계획

  • cargo fmt --check, cargo clippy -D warnings, cargo test (73개)
  • Go 바이너리와의 비교 테스트 (119개 일치)
  • 실제 서버로 검색·자동완성·OpenSearch·핫 리로드 확인
  • 인증 켠 상태에서 404·302 동작과 로그에 키가 남지 않는지 확인
  • Docker 이미지 빌드 (로컬에 Docker가 없어 미확인, CI에서 확인 필요)

🤖 Generated with Claude Code

psi59 and others added 2 commits October 11, 2026 10:30
Go 구현을 hyper/tokio 기반 Rust로 옮긴다. 외부에서 관찰되는 동작은
Go 버전과 동일하게 유지한다.

- net/url, net/http(리다이렉트·ServeMux 경로 정리), encoding/json,
  yaml.v3의 동작을 바이트 단위로 재현 (gocompat, gojson, config)
- 동일 설정으로 Go/Rust 서버에 비정상 입력 포함 119개 요청을 보내
  상태줄·헤더·본문이 모두 일치함을 확인
- 처리량: /search 약 1.45배, /suggest 약 3.2배 (2코어, 동시 64)
- 로그는 tracing JSON으로 변경 (필드명 유지)
- Dockerfile, CI, pre-commit 훅을 cargo 기반으로 변경

BANGS_AUTH_KEYS를 설정하면 /, /search, /suggest, /opensearch.xml에
key 쿼리 파라미터를 요구한다. 키가 없거나 틀리면 404를 반환하고,
/health와 /favicon.ico는 열어둔다. /?key=...로 등록하면 OpenSearch
템플릿에 키가 포함되어 Firefox가 자동으로 키를 보낸다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@psi59
psi59 merged commit 958d879 into main Oct 11, 2026
3 checks passed
@psi59
psi59 deleted the rust-port branch October 11, 2026 10:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant