Skip to content

정리: 제품 웹 이름을 셀프서비스로 301 리다이렉트 - #58

Merged
mack-erel merged 1 commit into
mainfrom
web-redirect
Oct 20, 2026
Merged

mack-erel merged 1 commit into
mainfrom
web-redirect

Conversation

@mack-erel

Copy link
Copy Markdown
Contributor

요약

제품 웹 이름을 443에서 전용 SNI 인증서로 받고, 계정 셀프서비스의 정확한 루트 URL로 301 보냅니다. 웹메일이나 랜딩 페이지는 추가하지 않습니다.

  • IONOSPHERE_HOST_WEB + IONOSPHERE_WEB_REDIRECT_URL은 짝입니다. 불완전하거나 위험한 URL이면 기동을 막습니다.
  • 요청 경로·쿼리는 Location에 붙이지 않습니다. 301 캐시는 1시간입니다.
  • IONOSPHERE_TLS_WEB_TLS_*는 라우트 전용 인증서 소스입니다. 기본·admin 인증서와 분리됩니다.
  • cert-api가 기동 때 실패해도 다음 6시간 폴링 성공 시 재시작 없이 복구됩니다.
  • 443 프런트가 없으면 웹 설정을 거부합니다.

검증

  • 독립 코드 리뷰: APPROVE
  • npm run verify: 초록(리베이스 뒤 재실행)
  • 관련 77개 테스트 통과

배포 순서

코드를 먼저 배포하고, 그다음 세 서버 env에 웹 이름·리다이렉트 URL·mailer-web cert-api 소스를 넣어 한 대씩 재시작합니다. env가 먼저 들어가면 기존 코드는 값을 모르므로 의미가 없습니다.

배포 뒤 와이어에서 확인합니다.

  1. 웹 이름 둘의 SNI 인증서 SAN
  2. Cloudflare 경유 301 + 셀프서비스 Location
  3. mx·mta-sts·admin 인증서 불변

이 PR에는 마이그레이션과 운영 env 변경이 없습니다.

🤖 Generated with Claude Code

왜: 제품 사이트 이름은 443에서 메일용 기본 인증서를 받아 이름이 맞지 않았고, 그 이름을 받을
vhost도 없어 Cloudflare strict 연결이 526으로 끝났다. 웹메일은 없으므로 맨 도메인·www 요청을
계정 셀프서비스의 정확한 루트 URL로 보내는 것이 현재 제품 표면과 맞다.

- IONOSPHERE_HOST_WEB + IONOSPHERE_WEB_REDIRECT_URL을 짝으로 검증한다. 하나만 있거나 http URL,
  자격증명·프래그먼트·제어문자, 다른 서비스와 이름 충돌, 자기 리다이렉트면 기동을 막는다.
- 443 프런트가 로컬 301을 낸다. 요청 경로·쿼리는 섞지 않아 open redirect·CRLF 경로가 없다.
  메서드와 무관하게 301, HEAD는 본문 없음, 브라우저 캐시는 1시간이다.
- route-only webTls 소스가 IONOSPHERE_TLS_WEB_TLS_*를 읽는다. 웹 이름에만 SNI로 제시하고,
  6시간 폴링 갱신도 웹 라우트만 바꾼다. 기동 때 cert-api가 실패해도 라우트는 남아 다음 폴링
  성공 때 재시작 없이 전용 인증서가 붙는다. 기본·admin 인증서는 건드리지 않는다.
- IONOSPHERE_HTTPS_FRONT_PORT 없이 웹 이름을 켜면 기동을 막아 설정 드리프트를 드러낸다.

검증: 독립 리뷰 APPROVE. npm run verify 초록(테스트 2,805개, 실패 0), 관련 테스트 77개 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mack-erel
mack-erel merged commit 227a376 into main Oct 20, 2026
9 checks passed
@mack-erel
mack-erel deleted the web-redirect branch October 20, 2026 01:12
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