호스팅과 검토

경험은 제작자의 이름으로 독립된 출처에서 제공돼요. 필요한 출처 설정과 경험이 플랫폼에 등록되기 전에 확인하는 사항을 안내해요.

독립된 출처

https://my-garden.example처럼 ZenClub과 다른 출처에서 HTTPS로 경험을 제공해요. 쿠키를 설정하지 말고 민감한 서비스와 공유하지 마세요. 프레임에서는 스크립트와 자체 출처만 허용하고 나머지는 차단해요.

프레임에서 할 수 없는 작업

  • 팝업이나 새 창을 열거나 주변 페이지를 이동할 수 없어요.
  • alert, confirm, prompt 대화상자 표시, 양식 제출, 다운로드 시작을 할 수 없어요.
  • 카메라, 마이크, 위치 정보, 결제를 사용할 수 없어요. 전체 화면은 허용돼요.
  • 방문자가 누구인지 알 수 없어요. 리퍼러와 플랫폼 쿠키도 전달되지 않아요.

보안 헤더

ZenClub만 프레임에 포함할 수 있게 하고, 꼭 필요한 경우가 아니면 네트워크 접근을 차단해요. SDK 자체는 네트워크 접근이 전혀 필요하지 않아요.

http
Content-Security-Policy: default-src 'self'; connect-src 'none'; frame-ancestors https://zenclub.app; base-uri 'none'; object-src 'none'
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer

변경되는 대상 대신 버전 배포하기

매니페스트와 connect()에 릴리스마다 새 버전을 지정해요. 버전이 지정된 경로나 콘텐츠 해시를 사용해 리소스를 제공하면 이미 시작한 세션이 처음 사용한 파일을 계속 이용할 수 있어요. 플레이 중인 방문자는 기존 버전을 유지하고 새로 시작하는 경우 활성 버전을 사용해요.

배포물 봉인하기

seal은 빌드의 SHA-256 목록을 기록하고 verify는 게시 전에 폴더가 그 목록과 일치하는지 확인해요. 누락되거나 바뀐 파일을 찾아내지만 전자 서명은 아니에요.

shell
npx zenclub-plugin seal dist
npx zenclub-plugin verify dist

검토 체크리스트

카탈로그에 표시되기 전에 모든 버전을 검토해요. 먼저 다음 항목을 확인해요.

  • 일반적인 휴대전화에서 콘솔 오류 없이 15초 안에 준비돼요.
  • 일시 정지, 재개, 숨김, 종료가 모두 올바르게 작동하고 일시 정지 중에는 아무것도 재생되지 않아요.
  • 새로 고쳐도 진행 상황이 유지되고 충돌로 저장 내용을 알림 없이 덮어쓰지 않아요.
  • 다시 시작하지 않아도 밝은 테마와 어두운 테마, 동작 줄이기를 적용해요.
  • 너비 390픽셀 휴대전화부터 넓은 데스크톱까지 터치, 마우스, 키보드로 사용할 수 있어요.
  • 모든 화면이 방문자의 언어로 표시돼요. ZenClub은 영어, 중국어 간체, 중국어 번체, 일본어, 한국어, 프랑스어, 독일어, 스페인어를 지원하며 한 화면에서 언어를 섞지 않아요.
  • 광고, 추적기, 카운트다운 압박, 다크 패턴 없이 차분하게 설계돼요.

검토 요청하기

매니페스트와 검토할 버전의 시작 URL, 경험에 대한 간단한 설명을 담아 문의해 주세요. 해당 버전과 시작 URL, 기능 조합을 승인해요. 이 중 하나라도 바뀌면 새 릴리스를 같은 방식으로 보내주세요.

도시 이정표를 검토받으려면 정확한 선언과 지원되는 저장 데이터 구조를 함께 제출해요. 소리 지원 게임을 출시하기 전에 1.5 플랫폼을 배포하고, 이정표 지원 게임을 출시하기 전에 1.6 플랫폼을 배포해요. 플랫폼을 이전 상태로 되돌릴 때는 코드와 함께 호환되는 승인 권한도 복원해야 해요. 도시 데이터베이스의 표와 플레이어 기록은 유지해요. 저장 데이터 구조가 바뀌면 보고 전에 승인된 항목 추출 규칙이 필요해요.