개발팀 문서 접근 제어
문서 사이트는 애플리케이션 사용자 인증과 분리된 Cloudflare Pages 프로젝트로 배포하고, Cloudflare Access가 모든 요청을 인증합니다.
Developer
-> Cloudflare Access (GitHub organization/team + independent MFA)
-> eduboard-docs Pages
-> Docusaurus static assets
Access는 정적 파일이 전달되기 전에 동작하므로 Docusaurus 코드에서 문서 링크만 숨기는 방식보다 안전합니다.
권장 배포 경계
| 항목 | 값 |
|---|---|
| Pages project | eduboard-docs |
| Production branch | main |
| Build command | npm ci && npm run typecheck && npm run build |
| Build output | build |
| Production hostname | docs.<company-domain> |
| Docusaurus URL variable | DOCS_SITE_URL=https://docs.<company-domain> |
문서 프로젝트는 Frontend 애플리케이션 Pages 프로젝트와 분리합니다. 문서 장애나 Access 정책 변경이 사용자용 애플리케이션 배포에 영향을 주지 않고, 호스트 전체에 단일 Access 정책을 적용할 수 있습니다.
1. GitHub 로그인 방법 등록
- GitHub에서 OAuth App을 생성합니다.
- Homepage URL은
https://<team-name>.cloudflareaccess.com으로 설정합니다. - Authorization callback URL은
https://<team-name>.cloudflareaccess.com/cdn-cgi/access/callback으로 설정합니다. - Cloudflare Zero Trust의
Integrations > Identity providers에서 GitHub를 추가합니다. - GitHub 조직과 팀 정보를 읽을 수 있도록 OAuth App을 승인하고 연결 테스트를 실행합니다.
GitHub client secret은 Cloudflare에만 저장하고 저장소나 Pages 환경 변수에 넣지 않습니다.
2. Pages와 사용자 도메인 연결
eduboard-docsPages 프로젝트를 생성합니다.- 위 표의 빌드 명령과 출력 디렉터리를 설정합니다.
docs.<company-domain>을 Custom domain으로 연결합니다.- Pages production 환경 변수
DOCS_SITE_URL에 최종 HTTPS 주소를 설정합니다.
로컬에서 직접 배포할 때는 다음 명령을 사용합니다.
npm run docs:deploy
3. 프로덕션 Access 정책
Zero Trust의 Access controls > Applications에서 Self-hosted 애플리케이션을 만들고 docs.<company-domain> 전체를 보호합니다.
권장 정책:
| 설정 | 권장값 |
|---|---|
| Action | Allow |
| Include | GitHub organization의 개발 조직 |
| Require | GitHub team의 문서 접근 팀 |
| Login method | 등록한 GitHub IdP만 허용 |
| Session duration | 8시간 |
| Instant authentication | 활성화 |
| App Launcher visibility | 조직 정책에 따라 선택 |
조직 전체가 문서를 봐야 한다면 Include에 GitHub organization만 사용합니다. 최소 권한이 필요하면 docs-readers 같은 전용 GitHub team을 Require 조건으로 추가합니다.
4. 독립 MFA
GitHub IdP는 Access의 IdP 기반 MFA method claim 강제 대상이 아니므로 Cloudflare Access의 independent MFA를 사용합니다.
Access controls > Access settings에서 independent MFA를 활성화합니다.- 피싱 방지를 위해 WebAuthn security key 또는 passkey를 허용합니다.
- 문서 애플리케이션 또는 정책에서 independent MFA를 필수로 설정합니다.
- MFA 재인증 시간을 문서 세션과 같거나 더 짧게 설정합니다.
이 설정은 GitHub 계정의 2FA 여부와 별개로 문서 접근 시 두 번째 인증을 강제합니다.
5. 우회 경로 차단
Custom domain만 보호하면 Pages 기본 도메인이나 preview URL로 문서를 우회할 수 있습니다.
- Pages 프로젝트
Settings > General에서 preview deployment Access policy를 활성화합니다. eduboard-docs.pages.dev프로덕션 주소에도 별도 Access 애플리케이션을 적용합니다.*.eduboard-docs.pages.devpreview 주소가 같은 개발팀 정책을 사용하는지 확인합니다.- custom domain, production
pages.dev, preview URL을 시크릿 창에서 각각 테스트합니다.
모든 주소는 인증 전 문서 HTML, JavaScript, 검색 인덱스, source map을 반환하지 않아야 합니다.
6. Backend 문서 동기화
Backend 문서 원본은 ../Backend/docs에 유지합니다. Docs 저장소의 배포 가능한 복사본은 다음 명령으로 생성합니다.
npm run docs:sync
npm run docs:sync:check
기본적으로 Docs와 Backend 저장소가 같은 상위 디렉터리에 있다고 가정합니다. 다른 위치에서는 BACKEND_REPO_DIR을 지정합니다.
BACKEND_REPO_DIR=/path/to/Backend npm run docs:sync
docs/backend 파일은 생성 결과이므로 직접 수정하지 않습니다. Backend 문서를 변경한 커밋에는 동기화된 Docs 문서 변경도 함께 포함해야 합니다.
배포 후 검증
- 허용된 GitHub team 사용자는 GitHub 로그인과 MFA 후 접근할 수 있습니다.
- 조직에는 속하지만 허용 team이 아닌 사용자는 거부됩니다.
- 조직 외부 GitHub 사용자는 거부됩니다.
- 로그아웃 후 HTML과 정적 asset 직접 URL이 모두 다시 인증을 요구합니다.
- production,
pages.dev, preview deployment가 동일하게 보호됩니다. - Access audit log에 로그인 성공과 정책 거부 이벤트가 기록됩니다.