위키 역할 인증과 권한 경계¶
사용자에게 달라지는 점¶
공개 문서·게임 실행·오늘의 업데이트는 로그인 없이 유지합니다. 기획자와 개발자는 같은 로그인 화면에서 역할을 선택하며, 인증 후 각자 필요한 정보만 압축한 보호 탭으로 이동합니다. 초기 계정은 첫 로그인 뒤 아이디와 비밀번호를 변경하기 전까지 역할 탭을 열 수 없습니다.
| 역할 | 첫 화면 우선순위 | 쓰기 원본 |
|---|---|---|
| 기획자 | 결정 대기, 데이터 요청, Notion 대조, 플레이 인식 검수 | 인증된 Notion·Google Sheet |
| 개발자 | 다음 작업선, 코드 노드맵, 모듈 감사, E2E | 비공개 저장소 작업 브랜치·PR |
| 공개 | 진행률, 당일 업데이트, 플레이·다운로드, 확정 문서 | 없음 |
보안 계약¶
- 비밀번호 원문과 초기 계정은 저장소·정적 JavaScript·검색 색인에 넣지 않습니다.
- 비밀번호는 사용자별 salt, 서버 비밀 pepper와 PBKDF2-SHA256으로 해시해 전용 Private R2에 저장합니다.
- 세션은 256비트 난수 토큰이며 브라우저에는
HttpOnly,Secure,SameSite=Strict쿠키만 둡니다. 저장소에는 토큰 해시와 8시간 만료 시각을 저장합니다. - 상태 변경 API는 동일 출처와 세션별 CSRF 토큰을 함께 검사합니다.
- 아이디·비밀번호가 바뀌면 credential version을 올려 기존 세션을 모두 무효화합니다.
- 5회 연속 로그인 실패는 해당 주소·아이디 조합을 15분간 잠급니다.
- 보호 HTML은 클라이언트 CSS로 숨기지 않고 Pages Function이 세션과 역할을 확인한 뒤 제공합니다.
planner,developer,account페이지는 공개 검색 색인에서 제외하고private, no-store로 제공합니다.
모듈 경계¶
cloudflare/wiki-auth/_worker.js는 인증·세션·접근 판정만 담당합니다. 문서 표현은 role-auth.js와 각 Markdown 페이지가 담당하며, 기획 상태·게임 데이터·배포 Worker에는 접근하지 않습니다. 저장소는 sfh-wiki-auth Private R2만 사용하고 Cloudflare 플랜이나 기존 게임 R2를 변경하지 않습니다.
초기 사용자 레코드는 배포 작업이 객체 부재를 확인한 경우에만 생성합니다. 이후 배포는 변경된 아이디·비밀번호를 덮어쓰지 않습니다. 초기 비밀번호와 pepper는 GitHub Actions Secret에서만 읽습니다. 인증 R2에는 pepper 지문만 남겨 GitHub Secret이 실수로 바뀌면 기존 계정을 잠그는 배포를 거부합니다.
E2E 수락 기준¶
- 공개 문서는 비로그인 상태로 정상 열림
- 보호 경로는 로그인 화면으로 이동하고 HTML을 직접 내려주지 않음
- 역할이 다른 보호 경로는
403 - 최초 로그인은 계정 변경 화면으로 강제 이동
- 변경 전 아이디·비밀번호는 즉시 실패하고 새 정보만 성공
- 로그아웃·만료·credential version 변경 후 이전 쿠키는 실패
- 로그인 실패 제한, CSRF, 동일 출처, 본문 크기 제한이 작동
- 320·390·1440px에서 로그인·계정·역할 탭이 겹치지 않음
운영 경계¶
이 기능은 게임 내 계정, 결제, 유료 재화와 무관합니다. Cloudflare Zero Trust 유료 기능을 활성화하지 않으며 기존 위키 주소와 게임 배포를 유지합니다. 인증 R2 사용량은 배포 전후로 확인하고 과금 플랜 변경은 자동화하지 않습니다.