Chrome 확장 프로그램을 Firefox로 포팅해서 AMO(addons.mozilla.org)에 제출하면, Chrome Web Store에서는 없던 오류들을 만난다. 특히 2025년 11월부터 필수가 된 data_collection_permissions 때문에 삽질하기 쉽다.


증상: QR 이미지가 안 보인다?

확장 프로그램 팝업에서 이미지가 깨져 보이는 문제가 있었다. 원인은 단순했다 — 패키징된 zip에 이미지 파일이 누락된 것. 로컬 개발 환경에서는 파일이 있지만, 스토어에 업로드한 빌드에는 빠져있었다.

해결: 깔끔한 zip 패키징

cd my_extension && zip -r ../extension.zip . \
  -x ".*" "__MACOSX/*" "*.DS_Store" "store_assets/*"

macOS에서 zip 만들면 __MACOSX/ 폴더와 .DS_Store가 들어가는데, 이걸 제외해야 한다. store_assets/ 같은 스토어 에셋 폴더도 확장 프로그램 자체에는 불필요하다.

패키징 후 반드시 확인:

unzip -l extension.zip | grep "이미지파일"

Chrome → Firefox 포팅 시 manifest.json 차이점

1. background 설정

Chrome은 service_worker, Firefox MV3는 scripts:

// ❌ Chrome 방식 (Firefox에서 오류)
"background": {
  "service_worker": "background.js"
}

// ✅ Firefox 방식
"background": {
  "scripts": ["background.js"]
}

// ❌ 둘 다 넣기 (오류 원인)
"background": {
  "service_worker": "background.js",
  "scripts": ["background.js"]
}

2. browser_specific_settings 필수

Firefox는 gecko 설정이 필요하다:

"browser_specific_settings": {
  "gecko": {
    "id": "your-extension@example.com",
    "strict_min_version": "128.0"
  }
}

3. windows 권한 미지원

Firefox에서 "permissions": ["windows"]는 유효하지 않다. 경고가 뜨므로 제거해야 한다.

// ❌ Firefox에서 경고
"permissions": ["storage", "activeTab", "windows", "tabs"]

// ✅ windows 제거
"permissions": ["storage", "activeTab", "tabs"]

data_collection_permissions 삽질 기록

2025년 11월부터 모든 새 Firefox 확장 프로그램data_collection_permissions을 manifest.json에 명시해야 한다. 이걸 빠뜨리면 AMO 검사에서 오류로 제출이 차단된다.

시도 1: ❌ is_exempt 사용

"data_collection_permissions": {
  "is_exempt": true,
  "description": "데이터를 수집하지 않습니다."
}

오류: must have required property 'required'

is_exempt라는 속성은 존재하지 않는다.

시도 2: ❌ required: false

"data_collection_permissions": {
  "required": false
}

오류: "required" must be array

boolean이 아니라 배열이어야 한다.

시도 3: ❌ 빈 배열 required: []

"data_collection_permissions": {
  "required": []
}

오류: 통과하지 못함

빈 배열도 안 된다.

시도 4: ✅ required: ["none"]

"data_collection_permissions": {
  "required": ["none"]
}

이게 정답이다. 데이터를 수집하지 않는 확장 프로그램은 "none"을 배열에 명시해야 한다.


최종 Firefox manifest.json 템플릿

데이터 수집을 하지 않는 확장 프로그램의 최소 설정:

{
  "manifest_version": 3,
  "name": "My Extension",
  "version": "1.0.0",
  "permissions": ["storage", "activeTab", "tabs"],
  "action": {
    "default_popup": "popup.html"
  },
  "content_scripts": [
    {
      "matches": ["https://example.com/*"],
      "js": ["content.js"],
      "all_frames": true,
      "run_at": "document_idle"
    }
  ],
  "background": {
    "scripts": ["background.js"]
  },
  "browser_specific_settings": {
    "gecko": {
      "id": "your-extension@example.com",
      "strict_min_version": "128.0",
      "data_collection_permissions": {
        "required": ["none"]
      }
    }
  }
}

AMO 제출 시 참고사항

소스 코드 제출 여부

“코드 생성기, 압축기, webpack 등을 사용합니까?”

빌드 도구 없이 순수 HTML/CSS/JS로 작성했다면 “아니요” 선택. 소스 코드 = 배포 코드이므로 별도 제출 불필요.

innerHTML 경고

AMO 검사에서 innerHTML 사용 시 경고가 뜬다:

Unsafe assignment to innerHTML

경고(warning)이므로 제출은 차단되지 않지만, 가능하면 textContent나 DOM API로 대체하는 것이 좋다.

Firefox for Android

데스크탑 전용 확장 프로그램이라면 Android 호환성 테스트는 건너뛰어도 된다. AMO 제출 시 플랫폼 선택에서 데스크탑만 체크하면 된다.


참고 문서