plugin 삭제후 즉시 재설치

→ 해야할 것 리스트!

https://chatgpt.com/g/g-p-6a3387b6f32481c2b52c11c11aebd0e3-peurogeuraem-gaebalja1/c/6a347291-3d7c-8342-8871-751e8465685a

너는 지금부터 “4VPN Chrome Web Store + Desktop Auto-Install Integration 에이전트”로 행동해줘.

상황:

* 내 앱 4VPN의 핵심 기능 중 하나는 Chrome 확장을 자동으로 설치하고 유지하는 것이다.
* 이 확장은 사용자가 지정한 유튜브 채널/영상/키워드 및 특정 사이트를 차단하는 집중/차단 도우미다.
* 이전 문제는 Chrome이 웹스토어에서 승인되지 않은 외부 CRX/plugin을 신뢰하지 않아서, 확장이 꺼짐/삭제 가능/위험 플래그 상태가 되는 것이었다.
* 나는 Chrome Web Store 개발자 등록비 $5를 이미 결제했고, 계정 컨펌도 된 것 같다.
* 이제 목표는 미승인 external_crx 방식이 아니라, Chrome Web Store에 1회 승인된 확장 ID를 사용해서 데스크톱 앱이 공식 Chrome 정책으로 확장을 설치/유지하게 만드는 것이다.

중요한 보안/정책 원칙:

* 몰래 설치하는 악성 동작을 만들지 않는다.
* 사용자가 4VPN 데스크톱 앱을 설치하고, 브라우저 차단 기능을 켠 경우에만 Chrome 확장 자동 설치를 진행한다.
* 자동 설치 전에 앱 UI 또는 문서에서 “Chrome 확장이 설치되고, 차단 기능을 위해 Chrome 정책이 적용될 수 있음”을 명확히 안내한다.
* 사용자의 동의 없이 제3자 기기, 회사/학교 소유 기기, 타인의 Chrome에 정책을 강제로 적용하지 않는다.
* Chrome 보호 기능을 우회하지 않는다.
* 승인되지 않은 CRX, external_crx, 임의 update_url, 자체 서명 꼼수, 브라우저 취약점 이용, 삭제 방해 꼼수는 사용하지 않는다.
* 오직 Chrome Web Store 승인 확장 ID와 공식 정책 경로를 사용한다.
* 앱 이름은 4VPN이지만, Chrome Web Store 설명에서는 네트워크 VPN 우회 앱이 아니라 “집중/차단 도우미”임을 분명히 한다.

제출 파일:

* 현재 Chrome Web Store 제출용 zip:
  ~/Desktop/4VPN_ChromeWebStore_v1.3.22.zip

확장 이름:

* 4VPN Blocker

Chrome Web Store 공개 범위:

* Unlisted 권장
* 검색에는 안 뜨지만, 승인된 Web Store 확장 ID를 통해 앱 정책 설치에 사용할 수 있게 한다.

최종 목표:

1. Chrome Web Store에 4VPN Blocker 확장을 제출할 준비물을 만든다.
2. 승인 후 부여되는 32자 Chrome Web Store extension ID를 앱 코드에 연결할 준비를 한다.
3. 데스크톱 앱이 Windows/macOS에서 공식 Chrome 정책으로 확장을 자동 설치할 수 있게 설계한다.
4. 기존 external_crx / 자체 호스팅 HTTPS / 인증서 기반 임시 설치 방식을 제거하거나 비활성화할 계획을 만든다.
5. 사용자가 앱 안에서 “Chrome 차단 기능 켜기”를 누르면, 필요한 안내와 권한 요청 후 공식 정책을 적용하는 구조로 정리한다.

작업 1: 현재 프로젝트 조사
프로젝트 전체에서 다음 키워드를 검색해라.

* ChromeExtensionIdentity
* extensionID
* chromeExtensionId
* ExtensionInstallForcelist
* ExtensionSettings
* external_crx
* update_url
* clients2.google.com
* chrome policy
* managed policy
* localhost
* 127.0.0.1:17361
* incognito
* force_enabled
* native messaging
* blocker
* crx
* pem
* certificate
* self-hosted
* auto install
* install extension

검색 결과를 바탕으로 현재 구조를 요약해라.
추측하지 말고, 확인한 파일과 코드 근거를 기준으로 작성해라.

작업 2: Chrome Web Store 제출 준비 폴더 생성
프로젝트 루트 또는 적절한 위치에 다음 폴더를 만들어라.

cws_submission/

그 안에 다음 파일을 생성해라.

1. cws_submission/README_CWS_SUBMISSION.md

내용:

* 내가 Chrome Web Store Developer Dashboard에서 직접 해야 하는 단계 작성
* New Item 클릭
* zip 업로드
* Store listing 작성
* Privacy practices 작성
* Permission justification 작성
* Distribution에서 Unlisted 선택
* Submit for review
* 승인 후 32자 Extension ID 확인
* 초보자도 따라 할 수 있게 “어디를 누르는지” 수준으로 작성
* Cursor가 준비한 것과 사람이 직접 클릭해야 하는 것을 분리해서 작성

2. cws_submission/STORE_LISTING.md

Chrome Web Store에 복붙할 리스팅 문구 작성.

반드시 포함:

* Name: 4VPN Blocker
* Summary: 132자 이내 한국어
* Description: 한국어 긴 설명
* Category: Productivity
* Language: Korean
* Visibility: Unlisted 권장
* Single purpose 설명
* 이 확장은 네트워크 VPN 우회 기능이 아니라 집중/차단 도우미라는 설명
* 유튜브 채널/영상/키워드 및 특정 사이트 차단 기능 설명
* 4VPN 데스크톱 앱과 같은 기기의 localhost로만 연동한다는 설명
* 외부 서버로 방문 기록이나 차단 규칙을 보내지 않는다는 설명
* 사용자가 4VPN 데스크톱 앱에서 차단 기능을 켰을 때 Chrome 확장과 연동된다는 설명

3. cws_submission/PERMISSION_JUSTIFICATIONS.md

manifest.json을 실제로 읽고 권한 정당화 문구를 작성해라.

규칙:

* manifest에 실제 존재하는 permissions, host_permissions, optional_permissions, content_scripts, externally_connectable만 다룬다.
* 없는 권한은 지어내지 않는다.
* 한국어 버전과 영어 버전을 둘 다 작성한다.
* 심사자가 이해하기 쉽게 차분하고 전문적으로 쓴다.

반드시 확인하고 해당되면 작성:

* <all_urls> 또는 broad host permissions:
  사용자가 지정한 사이트와 유튜브 채널/영상/키워드를 모든 탭에서 차단하기 위해 콘텐츠 스크립트 주입이 필요하다는 설명
* <http://127.0.0.1:17361/*:>
  같은 기기에서 실행되는 4VPN 데스크톱 앱에서 사용자의 차단 규칙을 가져오기 위함이며, 외부 서버로 데이터를 보내지 않는다는 설명
* storage:
  사용자의 차단 설정 또는 확장 상태를 로컬에 저장하기 위함
* scripting/content_scripts/declarativeNetRequest/tabs/activeTab 등:
  manifest에 실제 존재할 때만 정당화
* remote code 사용 없음
* 외부 분석 SDK 없음
* 광고/추적 없음

4. cws_submission/PRIVACY_POLICY.md

한국어/영어 개인정보처리방침 작성.

내용 원칙:

* 개인정보 수집하지 않음
* 방문 기록을 외부 서버로 전송하지 않음
* 광고, 추적, 분석 SDK 없음
* 차단 규칙은 사용자의 기기 안에서 처리
* localhost 127.0.0.1:17361은 같은 기기의 4VPN 데스크톱 앱과 연동하기 위한 통신
* 제3자에게 데이터 판매/공유 없음
* 문의 이메일은 TODO_CONTACT_EMAIL로 남김
* 개인정보처리방침 배포 URL은 TODO_PRIVACY_POLICY_URL로 남김

5. cws_submission/privacy_policy_site/index.html

위 개인정보처리방침을 정적 HTML 페이지로 만들어라.
GitHub Pages 또는 Vercel에 바로 올릴 수 있는 단일 index.html로 작성해라.
제목은 “4VPN Blocker Privacy Policy”.
디자인은 단순하고 신뢰감 있게 작성해라.

6. cws_submission/REVIEW_ANSWERS.md

Chrome Web Store 심사 폼에 복붙할 답변을 작성해라.

포함:

* Extension single purpose
* Why this extension needs broad host permissions
* Why this extension communicates with localhost
* Whether the extension collects user data
* Whether the extension transmits browsing history
* Whether the extension uses remote code
* Whether a test account is required
* How reviewers can test the extension
* Desktop companion app dependency
* What happens if the desktop app is not running
* Why the extension may be installed/managed by the 4VPN desktop app after Web Store approval
* 이 자동 설치는 사용자의 4VPN 데스크톱 앱 설치 및 차단 기능 활성화 흐름 안에서 이루어진다는 설명

7. cws_submission/SCREENSHOT_GUIDE.md

웹스토어 스크린샷 준비 가이드 작성.

포함:

* 최소 1개 이상 스크린샷 준비
* 권장 스크린샷: “이 채널의 영상은 차단되었습니다” 화면
* 1280×800 이미지 준비 방법
* macOS에서 스크린샷 찍는 방법
* 심사용으로 오해 없는 문구
* VPN 우회 앱처럼 보이지 않게 “차단/집중 도우미” 기능이 드러나는 화면 권장

8. cws_submission/TEST_PLAN.md

제출 전 테스트 체크리스트 작성.

반드시 포함:

* Chrome에서 확장 로드 테스트
* YouTube 채널 차단
* YouTube 영상 차단
* 키워드 차단
* 특정 사이트 차단
* 127.0.0.1:17361 로컬 서버가 켜져 있을 때 규칙 수신
* 로컬 서버가 꺼져 있을 때 확장이 죽지 않고 안전하게 동작
* 새 Chrome 프로필에서 동작
* 시크릿 모드 관련 동작
* Console 에러 확인
* Network 탭에서 외부 서버 전송이 없는지 확인
* Chrome Web Store 제출용 zip 안에 개인키/인증서/불필요 파일이 없는지 확인

9. cws_submission/AUTO_INSTALL_ARCHITECTURE.md

가장 중요한 문서다.
“4VPN 데스크톱 앱이 Chrome 확장을 자동 설치하는 공식 구조”를 설계해라.

반드시 포함:

* Chrome Web Store 승인 전 구조와 승인 후 구조 비교
* 승인 전 external_crx 방식의 문제점
* 승인 후 공식 구조:

  * Chrome Web Store approved extension ID
  * update_url = <https://clients2.google.com/service/update2/crx>
  * ExtensionInstallForcelist 정책
  * 필요하면 ExtensionSettings 정책
* Windows에서 정책 적용 개념:

  * HKLM 또는 HKCU의 Chrome Policies 경로 사용 가능성
  * 관리자 권한이 필요한 경우 앱에서 사용자에게 명확히 안내
  * 실제 경로와 구현은 기존 코드 확인 후 작성
* macOS에서 정책 적용 개념:

  * Chrome managed policy 또는 configuration profile 방식
  * /Library 수준 적용은 관리자 권한이 필요할 수 있음
  * 실제 구현은 기존 코드 확인 후 작성
* 사용자가 앱 안에서 “Chrome 차단 기능 켜기”를 누를 때의 흐름:

  1. 안내 화면 표시
  2. 사용자가 동의
  3. 필요한 관리자 권한 요청
  4. Chrome 정책 적용
  5. Chrome 재시작 안내
  6. 확장 설치 여부 확인
  7. 실패 시 복구/재시도 안내
* 정책 제거/비활성화 흐름:

  * 앱에서 사용자가 차단 기능을 끄면 정책 제거 또는 비활성화 옵션 제공
  * 단, 자기통제 앱이라면 잠금 모드/해제 지연이 있을 수 있으나 반드시 사용자가 사전에 동의한 범위 내에서만 동작
* 윤리/보안 원칙:

  * 몰래 설치하지 않음
  * 사용자가 이해할 수 있게 설명
  * 공식 정책만 사용
  * 승인되지 않은 CRX 사용 금지
  * 취약점/우회/은폐 방식 금지

10. cws_submission/POST_APPROVAL_INTEGRATION_PLAN.md

승인 후 앱 코드에 반영할 작업 계획 작성.

포함:

* Chrome Web Store에서 32자 Extension ID 확인하는 방법
* NEW_CHROME_WEBSTORE_EXTENSION_ID를 앱 설정에 넣는 방법
* ChromeExtensionIdentity.extensionID 교체
* update_url을 <https://clients2.google.com/service/update2/crx> 로 변경
* ExtensionInstallForcelist 값 형태:
  NEW_CHROME_WEBSTORE_EXTENSION_ID;<https://clients2.google.com/service/update2/crx>
* 기존 external_crx, 자체 호스팅 HTTPS 서버, 인증서, 임시 CRX 배포 로직 제거/비활성화 계획
* Chrome 재시작 후 설치 확인
* chrome://policy 확인
* chrome://extensions 확인
* 기존 임시 확장 정리
* 실패 시 롤백 방법

11. cws_submission/MANUAL_CLICK_GUIDE.md

내가 브라우저에서 직접 해야 하는 클릭 순서 작성.

초보자용으로:

1. Chrome Web Store Developer Dashboard 접속

2. rogan2534 계정 확인

3. New Item 클릭

4. ~/Desktop/4VPN_ChromeWebStore_v1.3.22.zip 업로드

5. manifest와 아이콘 인식 확인

6. Store listing 작성

7. Privacy practices 작성

8. Permission justification 작성

9. Distribution에서 Unlisted 선택

10. Submit for review

11. 승인 대기

12. 승인 후 Extension ID 복사

13. 그 ID를 앱 연동 작업에 사용

14. cws_submission/COPY_PASTE_FIELDS.md

Chrome Web Store 콘솔에 복붙할 필드를 한 파일에 모아라.

포함:

* Name
* Summary
* Description
* Category
* Language
* Single purpose
* Permission justifications
* Data usage answers
* Privacy policy URL 자리
* Review notes
* Visibility
* 자동 설치/데스크톱 앱 연동 설명

13. cws_submission/scripts/validate_cws_zip.sh

업로드 전 zip 검수 스크립트 작성.

요구사항:

* ~/Desktop/4VPN_ChromeWebStore_v1.3.22.zip 존재 확인
* 임시 폴더에 unzip
* manifest.json 존재 확인
* manifest_version이 3인지 확인
* name, version 존재 확인
* icons 16/48/128 존재 확인
* .pem, .key, .p12, .mobileprovision, .xpi, .DS_Store, __MACOSX 포함 여부 검사
* manifest permissions 출력
* host_permissions 출력
* content_scripts 출력
* background/service_worker 출력
* externally_connectable 출력
* 127.0.0.1:17361 권한 존재 여부 출력
* zip 내부 최상위 구조 출력
* 문제 발견 시 빨간색 에러와 exit 1
* 통과 시 초록색 성공 메시지 출력

14. cws_submission/scripts/make_clean_cws_zip.sh

현재 확장 소스 폴더에서 깨끗한 zip을 다시 만들 수 있는 스크립트 작성.

요구사항:

* 소스 폴더 위치가 확실하지 않으면 TODO_EXTENSION_SOURCE_DIR로 남김
* 개인키, 인증서, XPI, node_modules, .git, __MACOSX, .DS_Store 제외
* 최종 zip 이름:
  4VPN_ChromeWebStore_v1.3.22.zip
* 생성 후 validate_cws_zip.sh를 실행하도록 구성

작업 3: 기존 앱 코드의 자동 설치 구조 점검
현재 앱 코드에서 Chrome 확장을 자동 설치하려는 부분을 찾아라.

찾을 것:

* Windows registry 정책 작성 코드
* macOS Chrome managed policy/profile 작성 코드
* external_crx 설치 코드
* 자체 update_url 생성 코드
* 로컬 HTTPS 서버/인증서 생성 코드
* extension ID 하드코딩
* Chrome 재시작 안내 코드
* extension 설치 여부 검사 코드

그 결과를 아래 문서에 작성해라.

cws_submission/CURRENT_AUTO_INSTALL_AUDIT.md

내용:

* 현재 자동 설치 구조 요약
* 문제 있는 부분
* Chrome Web Store 승인 후 유지할 부분
* 제거할 부분
* 바꿔야 할 부분
* 사람이 확인해야 할 TODO

작업 4: 승인 후 바로 실행할 마이그레이션 프롬프트 생성
다음 파일을 만들어라.

cws_submission/NEXT_CURSOR_PROMPT_AFTER_APPROVAL.md

이 파일 안에는 Chrome Web Store 승인 후 내가 다시 Cursor에 넣을 프롬프트를 작성해라.

그 프롬프트는 아래 목표를 가져야 한다:

* NEW_CHROME_WEBSTORE_EXTENSION_ID 입력받기
* 32자 형식 검증
* 앱 코드의 기존 확장 ID를 새 ID로 교체
* update_url을 Chrome Web Store 표준 URL로 교체
* ExtensionInstallForcelist 정책 값 생성/적용
* external_crx/자체 호스팅/인증서 방식 제거 또는 비활성화
* Windows/macOS 자동 설치 정책 코드 정리
* “Chrome 차단 기능 켜기” UI 문구 정리
* Chrome 재시작 안내
* chrome://policy와 chrome://extensions 확인 가이드 생성
* flutter analyze 실행
* 가능한 경우 테스트 실행

작업 5: zip 실제 검수

* validate_cws_zip.sh를 실행해라.
* manifest.json을 읽고 요약해라.
* permissions, host_permissions, content_scripts, background, externally_connectable, icons를 출력해라.
* 결과를 cws_submission/ZIP_VALIDATION_RESULT.md에 저장해라.

작업 6: 마지막 요약
마지막에 아래를 출력해라.

1. 내가 지금 직접 해야 하는 것 5개 이하
2. Chrome Web Store 콘솔에서 복붙할 핵심 필드 위치
3. 승인 전에는 아직 자동 설치를 완성할 수 없는 이유
4. 승인 후 필요한 값: 32자 Chrome Web Store Extension ID
5. 기존 문제였던 “미승인 plugin이라 Chrome에서 막히는 문제”가 이 구조에서 어떻게 해결되는지

말투:

* 한국어로 작성
* 초보자도 이해할 수 있게
* 심사용 문구는 차분하고 전문적으로
* 거짓말하지 말고 확인 못 한 것은 TODO로 남김
* 실제 코드 변경은 안전하게, 삭제보다 문서화/비활성화를 우선
* 몰래 설치/은폐/우회/악성 지속성처럼 보일 수 있는 구현은 만들지 말고, 공식 정책과 사용자 동의 흐름으로만 설계

작업을 시작해줘.

plugin 삭제후 즉시 재설치