권한 설명
NewbieFinder는 기능에 꼭 필요한 최소 권한만 요청합니다. 이 문서는 요청하는 권한 세 가지의 사용 목적과, 의도적으로 요청하지 않는 권한을 함께 정리합니다.
1. 요청하는 권한
manifest 선언은 다음이 전부입니다.
{
"permissions": ["declarativeContent", "storage"],
"host_permissions": ["https://api.chzzk.naver.com/*"]
}
declarativeContent
치지직 웹사이트를 보고 있을 때만 NewbieFinder 아이콘을 활성화하기 위해 사용합니다. 페이지 내용을 읽지 않습니다.
-
무엇에 쓰나요: 현재 탭의 호스트가
chzzk.naver.com이고 HTTPS일 때만 툴바 아이콘을 활성 상태로 바꿉니다. 다른 사이트에서는 아이콘이 비활성 상태로 남고 클릭 이벤트가 발생하지 않습니다. - 무엇을 하지 않나요: 이 권한은 규칙을 브라우저에 등록할 뿐이며, 확장이 페이지의 DOM이나 텍스트를 읽지 않습니다. 규칙 판정은 브라우저가 수행합니다.
- 대안 검토: 같은 동작을 Content Script로도 만들 수 있지만, Content Script는 페이지에 코드를 주입해야 하므로 권한 범위가 넓어집니다. 페이지 접근 없이 URL 조건만 보기 위해 이 권한을 선택했습니다.
storage
사용자가 설정한 시청자·팔로워 조건과 짧은 기간의 공개 라이브 캐시를 브라우저 내부에 저장하기 위해 사용합니다.
-
무엇에 쓰나요
chrome.storage.sync: 필터 설정 (조건 활성화 여부, 상한 값, 정렬 여부)-
chrome.storage.local: 라이브·채널 공개 정보 캐시, 마지막 갱신 시각, 안내 닫힘 여부 -
chrome.storage.session: 새로고침 쿨다운과 요청 잠금 (브라우저 종료 시 삭제)
- 무엇을 하지 않나요: 개인 식별 정보, 계정 정보, 방문 기록을 저장하지 않습니다. 저장한 값을 외부로 보내지 않습니다.
-
대안 검토:
localStorage는 Service Worker와 공유하기 어렵고 MV3 환경에서 접근 방식이 제한되므로 제외했습니다. - 자세한 보존 기간은 개인정보 처리방침에 있습니다.
https://api.chzzk.naver.com/* (호스트 권한)
현재 라이브와 채널의 공개 정보를 읽어 조건에 맞는 방송을 찾기 위해 사용합니다. 로그인 쿠키나 계정 정보는 읽지 않습니다.
-
무엇에 쓰나요: 확장 내부 Finder 페이지에서 다음 두 경로에 GET 요청을
보냅니다.
GET https://api.chzzk.naver.com/service/v1/lives GET https://api.chzzk.naver.com/service/v1/channels/{channelId} -
어떻게 보내나요: 모든 요청은 인증 정보가 실리지 않도록 명시적으로
구성합니다.
fetch(url, { method: "GET", credentials: "omit", // 쿠키를 보내지 않습니다 redirect: "error", // 다른 호스트로 따라가지 않습니다 referrerPolicy: "no-referrer", headers: { Accept: "application/json" }, signal, }); -
무엇을 하지 않나요
- 쿠키와
Authorization헤더를 설정하지 않습니다. User-Agent,Origin,Referer를 위장하지 않습니다.- 쓰기(POST/PUT/DELETE) 요청을 보내지 않습니다.
-
요청 URL은 허용 목록(
origin === https://api.chzzk.naver.com이고 프로토콜이https:)을 통과한 경우에만 사용합니다. - 요청은 사용자가 Finder를 열거나 새로고침했을 때만 발생하며, 주기적인 백그라운드 수집이 없습니다.
- 쿠키와
-
왜
https://chzzk.naver.com/*는 요청하지 않나요: 확장은 치지직 웹 페이지에 접근하지 않습니다. 결과 카드를 클릭하면 일반 링크처럼 새 탭이 열릴 뿐이며, 이 동작에는 호스트 권한이 필요하지 않습니다.
2. 사용하지 않는 권한
아래 권한은 의도적으로 요청하지 않습니다. 이 목록은 설계 결정이며, 기능
추가를 이유로 조용히 늘리지 않습니다. 권한이 늘어나야 하는 변경은 버전 증가와 함께
CHANGELOG.md 에 명시합니다.
| 권한 | 제외 이유 |
|---|---|
cookies |
로그인 쿠키를 읽지 않습니다. |
activeTab |
치지직 페이지 콘텐츠를 읽거나 조작하지 않습니다. |
scripting |
Content Script를 동적으로 주입하지 않습니다. |
tabs |
새 탭 생성 자체에는 광범위한 탭 메타데이터 권한이 필요하지 않습니다. |
webRequest |
요청을 감시하거나 변조하지 않습니다. |
declarativeNetRequest |
네트워크 트래픽을 리다이렉트하지 않습니다. |
history |
방문 기록을 사용하지 않습니다. |
identity |
OAuth를 사용하지 않습니다. |
notifications |
v1에서 브라우저 알림을 제공하지 않습니다. |
unlimitedStorage |
캐시 크기를 스스로 제한하므로 필요하지 않습니다. |
추가로 다음 요소도 포함하지 않습니다.
- Content Script: v1에 존재하지 않습니다. 그 결과 치지직 페이지와의 CSS·DOM 충돌 가능성이 없습니다.
-
default_popup: 팝업을 지정하지 않고, 아이콘 클릭 시 확장 내부 페이지를 새 탭으로 엽니다. -
개발자 센터 등록·OAuth: Client ID, Client Secret, Access Token을
발급받거나 저장하지 않으며 공식 Open API(
/open/v1/*)를 호출하지 않습니다.
3. 콘텐츠 보안 정책 (CSP)
확장 페이지의 CSP는 다음과 같이 고정합니다.
script-src 'self';
object-src 'none';
base-uri 'none';
form-action 'none';
connect-src 'self' https://api.chzzk.naver.com;
img-src 'self' data: https://*.pstatic.net https://*.akamaized.net;
style-src 'self';
font-src 'self';
unsafe-eval,unsafe-inline을 넣지 않습니다.- 모든 실행 코드는 확장 패키지 안에 포함합니다. 원격 스크립트, CDN JavaScript, 원격 폰트를 로드하지 않습니다.
-
connect-src는 API 호스트 하나로 제한합니다. 호스트 권한과 같은 범위를 유지합니다. -
img-src의 이미지 호스트 허용 목록은 코드의ALLOWED_IMAGE_HOST_SUFFIXES와 항상 같은 범위를 유지합니다. 허용 목록 밖의 썸네일은 로컬 대체 이미지로 표시합니다.
4. 사용자가 직접 확인하는 방법
권한 선언이 문서와 같은지 직접 확인하실 수 있습니다.
-
chrome://extensions에서 NewbieFinder의 세부정보를 엽니다. 사이트 접근 권한이api.chzzk.naver.com하나인지 확인합니다. -
빌드된
dist/manifest.json을 엽니다.permissions,host_permissions,content_security_policy를 확인합니다. -
Finder 탭에서 개발자 도구의 네트워크 탭을 열고 새로고침을 누릅니다. 요청이
api.chzzk.naver.com외 다른 호스트로 나가지 않는지 확인합니다. -
npm run validate:manifest빌드 산출물의 권한·CSP·경로가 기준과 일치하는지 자동으로 검사합니다.
5. 접근 제한을 만났을 때
치지직이 401, 403, 429 를 반환하면 NewbieFinder는
우회하지 않고 중단합니다.
- 헤더를 위장해 재시도하지 않습니다.
- CAPTCHA나 봇 방어를 자동으로 통과시키지 않습니다.
-
429를 무시한 무한 재시도를 하지 않습니다.Retry-After가 지나치게 길면 재시도 없이RATE_LIMITED로 멈춥니다. - 접근 정책이 바뀌어 기능이 유지될 수 없다면 우회를 추가하는 대신 제품 범위를 다시 검토합니다.