교육 문의커뮤니티 입장하기

크롬 확장 프로그램 배포: 권한과 심사 준비하기

AI로 SEO 확장 프로그램을 만든 경험을 바탕으로 로컬 확인부터 스토어 심사 준비까지 설명합니다. 권한 소명, 원격 코드와 API의 차이, 개인정보 처리방침을 실제 동작과 대조하는 방법을 다룹니다.

지금까지 100명 넘게 읽었어요, 27%가 끝까지 읽었어요
Share
크롬 확장 프로그램 배포: 권한과 심사 준비하기 대표 이미지
목차
  1. 제가 만든 도구는 무엇을 하나요?
  2. 첫 확인: 내 크롬에서 실행하기
  3. 권한 요청 소명: 실제 동작을 한 문장으로 적기
  4. 원격 코드와 외부 API는 무엇이 다른가요?
  5. 개인정보 처리방침: 로컬과 외부 전송을 구별하기
  6. 짧은 연습: 어떤 설명을 고쳐야 하나요?
  7. 제출 준비부터 심사 결과 확인까지
  8. 자주 묻는 질문

세 줄로 먼저 읽기

이번 방문에서 한 편은 바로 볼 수 있습니다.

업무에 쓰려고 AI의 도움을 받아 SEO 분석용 크롬 확장 프로그램을 만들었습니다. SEO는 검색엔진이 웹페이지 내용을 이해하도록 제목과 구조 등을 정리하는 작업입니다. 크롬 확장 프로그램은 브라우저에 기능을 추가하는 작은 프로그램입니다.

코드를 만드는 일보다 어려웠던 단계는 Chrome 웹 스토어의 심사 질문에 답하는 일이었습니다. 권한이 필요한 이유와 원격 코드 사용 여부에 답하려니, 만든 프로그램이 실제로 무엇을 하는지 설명할 수 있어야 했습니다.

이 글은 그 경험을 바탕으로 완성한 확장 프로그램을 확인하고 심사 자료를 준비하는 순서를 설명합니다. 확장 프로그램을 처음부터 만드는 코드 튜토리얼은 아닙니다. 아직 파일이 없다면 아래 가상 사례의 답을 판단하는 연습부터 해볼 수 있습니다. 2026년 10월 4일 Chrome 공식 문서를 기준으로 권한과 데이터 처리 설명을 보완했습니다.

제가 만든 도구는 무엇을 하나요?

Claude 같은 생성형 AI와 작업하며 manifest.json과 JavaScript 코드를 수정했습니다. manifest.json은 확장 프로그램의 이름, 버전, 필요한 권한을 선언하는 설정 파일입니다.

이 도구는 현재 웹페이지의 HTML, 즉 페이지 구조를 나타내는 코드를 읽고 제목과 설명 등을 점검합니다. 아래는 AI 분석을 실행한 뒤 키워드와 제목 제안을 보여주는 개발 당시 화면입니다. 화면의 점수는 도구의 자체 평가이며 검색 순위나 검색엔진의 공식 점수가 아닙니다.

이런 도구를 만든 다음에는 화면이 보이는지만 확인해서는 부족합니다. 언제 페이지를 읽는지, 무엇을 외부로 보내는지, 어디에 저장하는지를 설명할 수 있어야 합니다.

첫 확인: 내 크롬에서 실행하기

준비물은 데스크톱 Chrome과 본인이 만든 확장 프로그램 폴더입니다. 폴더를 열었을 때 manifest.json이 바로 보여야 합니다. 개발 원본에서 별도로 배포 파일을 만드는 프로젝트라면, 코드를 실행 가능한 파일로 만드는 빌드 과정을 거친 결과 폴더를 사용합니다. 소스 폴더와 배포 폴더를 구분하지 못하겠다면 AI에게 먼저 그 위치와 생성 명령을 설명하도록 요청합니다.

  1. 주소창에 chrome://extensions를 입력합니다.
  2. 개발자 모드를 켜고 압축해제된 확장 프로그램을 로드합니다 또는 Load unpacked를 선택합니다.
  3. manifest.json이 들어 있는 폴더를 선택합니다. 등록된 확장 프로그램 이름이 보이는지 확인합니다.
  4. 분석해도 되는 공개 페이지를 열고 확장 프로그램 아이콘을 눌러 봅니다. 브라우저의 페이지 소스 보기에서 <title>을 찾아 도구가 표시한 페이지 제목과 비교합니다. SEO 점수가 높다는 것만으로 정상 작동으로 판단하지 않습니다.

다른 공개 페이지를 열고 다시 실행해 제목이 새 페이지의 값으로 바뀌는지도 확인합니다. 이전 제목이 남아 있다면 새 페이지를 읽는 동작부터 수정해야 합니다. 페이지가 실행 중 제목을 바꾸는 사이트라면 소스와 현재 값이 다를 수 있으므로, 첫 비교는 제목이 고정된 간단한 페이지에서 진행합니다.

등록 자체가 실패하면 오류에 적힌 파일 이름과 경로부터 확인합니다. chrome:// 같은 브라우저 내부 페이지는 일반 웹페이지와 달리 접근이 제한되므로 분석 시험에 사용하지 않습니다. 수정한 뒤에는 확장 프로그램 목록의 새로고침을 누르고 대상 웹페이지도 새로고침해 다시 시험합니다. 시험을 멈추려면 해당 확장 프로그램의 켜기 스위치를 끕니다. Chrome 로컬 실행 안내

로컬 로드는 스토어 게시가 아닙니다. 스토어 개발자 등록에는 일회성 등록비가 있고 AI 분석의 API 사용료도 별도일 수 있습니다. 지금은 게시나 유료 분석을 실행하지 않고 권한 설명 초안까지 준비해도 됩니다. 개발자 등록 안내

권한 요청 소명: 실제 동작을 한 문장으로 적기

권한 요청 소명은 프로그램이 그 권한을 왜 사용하는지 설명하는 일입니다. 먼저 manifest.json의 permissions와 host_permissions를 봅니다. 전자는 기능 권한, 후자는 접근할 웹주소 범위를 선언하는 항목입니다. 웹페이지 안에서 실행하는 코드인 콘텐츠 스크립트의 접근 대상도 함께 확인합니다. 권한 선언은 허용 범위를 보여주며 실제로 읽거나 전송한 항목 전체를 알려주지는 않습니다.

다음 문장은 작성 방법을 보여주는 예시입니다. 자신의 코드가 같은 방식으로 동작할 때만 사용할 수 있습니다.

권한동작이 일치할 때 쓸 수 있는 설명 예시
activeTab사용자가 확장 아이콘을 누르면 현재 탭의 페이지를 분석하기 위해 일시적으로 접근합니다
scripting분석 대상으로 지정된 페이지에서 제목과 메타 설명을 읽는 코드를 실행합니다
storage사용자가 선택한 언어와 테마 설정을 storage.local에 저장합니다

activeTab은 아이콘 클릭 같은 사용자 동작으로 현재 탭에 임시 접근을 허용합니다. 여기서 출처는 주소의 통신 방식, 호스트와 포트를 합친 기준입니다. 예를 들어 https://example.com/a에서 같은 사이트의 /b로 옮기는 것과 다른 사이트로 이동하는 것은 다릅니다. 다른 출처의 페이지로 이동하거나 탭을 닫으면 그 접근이 해제됩니다. 같은 출처 내 이동에서는 유지될 수 있습니다. 모든 사이트에 계속 접근하는 권한과는 다릅니다. activeTab 안내

scripting이라는 권한 자체가 읽기 전용인 것은 아닙니다. 실행하는 코드에 따라 페이지를 바꿀 수도 있습니다. “읽기만 한다”고 쓰려면 코드가 실제로 값을 읽기만 하는지 확인해야 합니다.

storage도 그 이름만으로 로컬 저장을 뜻하지 않습니다. storage.local과 storage.sync를 구분해야 하며, 후자는 사용자가 동기화를 켰을 때 다른 Chrome 브라우저와 데이터를 동기화할 수 있습니다. 저장 방식 안내

AI에게는 “심사를 통과할 문장을 써줘”보다 아래처럼 요청하는 편이 확인하기 쉽습니다.

이 확장 프로그램의 제출용 파일을 읽고 권한별 사용 위치를 찾아 주세요. 권한 이름, 사용하는 파일과 함수, 실행 계기, 읽거나 바꾸는 데이터, 외부 전송 여부를 표로 적어 주세요. 코드에서 확인할 수 없는 내용은 미확인으로 남겨 주세요. 권한을 추가하거나 파일을 수정하지 말고, 불필요해 보이는 권한과 그 근거를 알려 주세요.

결과에 파일 근거가 없거나 설명과 코드가 다르면 제출 문장을 먼저 확정하지 않습니다. 코드 확인을 도와줄 사람과 대조하고 필요한 범위만 요청하도록 수정합니다. AI의 검토 답변만으로 심사 통과가 보장되지는 않습니다.

원격 코드와 외부 API는 무엇이 다른가요?

제 도구는 Gemini API로 AI 분석을 요청합니다. API는 프로그램끼리 요청과 결과를 주고받는 연결 방식입니다. 외부와 통신한다는 이유만으로 원격 코드를 사용하는 것은 아닙니다.

원격 코드는 확장 프로그램 파일에 포함되지 않은 실행 코드를 외부에서 받아 브라우저에서 실행하는 경우를 말합니다. JavaScript나 WebAssembly가 여기에 해당할 수 있습니다. eval만 확인하면 되는 문제가 아닙니다. 원격 코드 공식 안내

  • API에서 프로그램이 읽을 수 있는 데이터 형식인 JSON으로 설명문을 받아 화면에 데이터로 표시한다면, 그 통신 자체는 원격 코드 실행이 아닙니다.
  • 외부 서버에서 JavaScript를 받아 실행한다면 원격 코드에 해당할 수 있습니다. 가져온 라이브러리가 이를 수행하는 경우도 살펴야 합니다.

Manifest V3는 manifest_version이 3인 확장 프로그램 규격입니다. 이 규격의 일반적인 확장 코드는 패키지 안에 포함해야 합니다. 심사 답변을 No로 골라 문제를 피하려 하지 말고, 제출할 파일과 포함된 라이브러리를 확인합니다. JSON을 받더라도 그 안의 문자열을 다시 코드로 실행한다면 단순 데이터 표시와는 다릅니다.

개인정보 처리방침: 로컬과 외부 전송을 구별하기

처음에는 별도 서버를 운영하지 않으니 데이터 처리도 없다고 생각하기 쉽습니다. 하지만 페이지 내용을 Gemini에 보내 분석한다면 외부 서비스로 전송하는 과정이 있습니다. “우리 서버에 저장하지 않는다”와 “외부로 보내지 않는다”는 다른 설명입니다.

Chrome의 사용자 데이터에는 이름과 이메일뿐 아니라 웹페이지 내용과 탐색 활동 등도 포함됩니다. 이를 처리하는 확장 프로그램은 로컬에서만 처리하더라도 처리방침이 필요합니다. 모든 확장에 무조건 URL이 필수라고 일반화하기보다, 실제로 다루는 데이터를 기준으로 판단해야 합니다. 사용자 데이터 정책 FAQ

처리방침을 쓸 때는 수집하는 항목, 사용 목적, 전송받는 곳, 저장 위치와 기간, 삭제 방법을 코드 및 연결 서비스의 조건과 대조합니다. AI 서비스로 보내는 내용을 빼놓거나 확인하지 않은 “저장하지 않음”을 적지 않습니다.

제가 사용했던 호스팅 방법은 Google Sites에 문서를 올리고 URL을 제출하는 방식입니다. 별도 서버가 없어도 문서를 제공할 수 있지만, 다른 서비스의 문장을 복사해 넣는 것만으로 준비가 끝나지는 않습니다. 실제 처리에 맞춘 내용을 게시하고 로그아웃한 브라우저에서도 그 URL이 열리는지 확인합니다.

짧은 연습: 어떤 설명을 고쳐야 하나요?

아래는 학습용 가상 확장 프로그램입니다.

사용자가 분석 버튼을 누르면 현재 페이지의 제목을 읽습니다. 제목을 Gemini API로 보내 설명문을 받아 표시합니다. 언어 설정은 storage.local에 보관합니다. 외부에서 받은 설명문은 코드로 실행하지 않습니다.

이 경우 “모든 데이터는 내 기기에서만 처리한다”는 설명은 틀립니다. 제목이 외부로 전송되기 때문입니다. 다만 설명문을 데이터로 받는 통신 자체는 원격 코드가 아닙니다. 언어 설정을 로컬에 저장한다는 설명과 페이지 제목을 외부로 보낸다는 설명을 함께 적어야 합니다.

이제 조건 하나만 바꿔 봅니다. 언어 설정을 storage.sync에 저장한다면 기존의 “언어는 로컬에만 저장한다”는 문장을 그대로 쓸 수 있을까요? 동기화 기능이 켜진 경우를 반영해야 하므로 수정해야 합니다. API 전송 방식은 바꾸지 않았으니 제목의 외부 전송 설명은 그대로 필요합니다.

이 두 사례에서 권한 이름, 실제 저장과 전송, 심사 답변을 연결해 설명할 수 있으면 첫 검토 연습은 완료입니다. 위 네 줄은 완성된 처리방침이 아닙니다. 실제 제출에는 연결한 서비스의 데이터 보관과 삭제 조건 등 빠진 항목을 확인해 작성해야 합니다.

제출 준비부터 심사 결과 확인까지

스토어 제출에는 개발자 계정과 게시할 ZIP 파일이 필요합니다. ZIP은 여러 파일을 하나로 묶은 압축 파일입니다. 확장 프로그램의 배포 파일과 아이콘 등을 담고, 비밀 키나 불필요한 개발 파일이 들어가지 않았는지 확인합니다.

  1. Chrome 개발자 대시보드에 로그인하고 새 항목에서 ZIP을 업로드합니다.
  2. 스토어 등록정보에 기능 설명과 실제 화면을 넣습니다. 개인정보 보호 항목에는 단일 목적, 권한 근거와 데이터 처리 내용을 적습니다.
  3. 배포 범위와 필요한 테스트 안내를 채웁니다. 외부 계정이 있어야 동작한다면 심사자가 재현할 방법도 준비합니다.
  4. 제출하여 검토받기를 누르기 전에 승인 후 자동 게시 여부를 확인합니다. 직접 게시 시점을 정하려면 자동 게시 선택을 해제합니다.
  5. 대시보드와 등록 이메일에서 심사 상태를 확인합니다. 반려되면 지적된 코드나 설명을 고친 뒤 다시 제출합니다. 공식 게시 절차

이 화면은 검토 대기 중이라는 뜻입니다. 심사를 통과했거나 공개됐다는 증거가 아닙니다. 로컬에서 작동하는 상태, 심사 제출 상태, 스토어 공개 상태를 각각 확인합니다.

제출이 막히면 화면의 제출 불가 사유와 비어 있는 항목부터 봅니다. 반려된 경우에는 사유를 보관하고, 어떤 파일이나 설명을 어떻게 바꿨는지 기록합니다. 같은 문제가 다음 버전에 반복되지 않도록 바뀐 자료로 다시 로컬 동작과 권한 설명을 대조합니다.

자주 묻는 질문

API를 호출하면 원격 코드를 쓴다는 뜻인가요?

API에서 데이터를 받아 표시하는 것만으로 원격 코드가 되지는 않습니다. 외부에서 받은 내용을 실행 코드로 쓰는지와 다른 라이브러리의 동작까지 확인해야 합니다.

로컬에서만 처리하면 개인정보 처리방침이 없어도 되나요?

이 글의 예시처럼 웹페이지 내용을 다루는 확장 프로그램은 로컬 처리라도 처리방침이 필요합니다. 웹페이지 내용도 사용자 데이터에 포함되므로, 외부 서버가 있는지만으로 판단하지 않습니다.

권한 소명 예시를 그대로 써도 되나요?

자신의 코드가 같은 동작을 할 때만 쓸 수 있습니다. 실행 계기, 읽는 항목, 저장 위치와 외부 전송을 확인한 뒤 그 동작을 설명하는 문장으로 작성합니다.

Share

제대로 이해했는지 한 문제로 확인해 볼까요?

답을 고르면 바로 풀이가 나와요.

외부 API에서 JSON 설명문만 받아 표시하고, 받은 내용을 코드로 실행하지 않는다면 무엇을 확인해야 할까요?

이 글이 도움이 되었나요?

이 글 다음 배우기비개발자를 위한 검색엔진 최적화(SEO) 기초입문 코스 · 10편

AI 검색에 인용되려면 먼저 크롤링과 색인이 되어야 합니다. 그 순서를 다룹니다

  1. 1검색엔진 최적화 (SEO) 이해하기
  2. 2검색엔진 크롤러 (Search Crawler) 이해하기
  3. 3색인 (Indexing) 이해하기
코스 전체 보기 →
이어서 읽기 좋은 글Claude Code 단축키와 슬래시 명령어 정리 →

Claude Code 안에 입력할 명령과 터미널에서 쓸 명령을 구분합니다. 대화에 이름을 붙여 다시 여는 연습부터 시작해 요약, 중단, 변경 확인에 필요한 명령을 찾아봅니다.