# 변경 이력 이 문서는 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/) 형식을 따르고, 버전 번호는 [Semantic Versioning](https://semver.org/lang/ko/)을 따른다. - 사용자에게 보이는 변경만 적는다. - 설정 키 추가, 기본값 변경, 설정 파일 이전 규칙은 반드시 적는다. - 릴리스 태그 `vX.Y.Z`와 `src/TabBouncer.csproj`의 ``을 같게 맞춘다. ## [Unreleased] ## [1.1.1] - 2026-10-08 ### 수정 - Chrome도 함께 닫으며 종료할 때 응답을 기다리는 동안 창이 멈추던 문제를 고쳤다. 종료 처리를 비동기로 바꾸고, CDP 연결 정리가 상대의 종료 응답을 기다리지 않도록 했다. 송신 대기에도 명령 제한 시간을 적용하고 종료 시 대기 중인 명령을 취소한다. - 페이지 안 iframe이 문서를 불러오면 그 iframe 주소를 탭 주소로 잘못 기록하던 문제를 고쳤다. 그 페이지에서 열린 팝업은 탭을 연 페이지(opener)를 iframe 주소로 보고 판정했다. 특히 `data:` 주소 iframe이 있으면 opener가 없는 탭으로 보고 광고 팝업을 닫지 않았고, 광고 도메인으로 등록한 사이트도 버튼을 눌러 열리면 "유지"로 남았다. - 버튼을 눌러 열린 새 탭이라도 광고 도메인이면 "버튼을 눌러 열림" 감점을 적용하지 않는다. 광고 도메인으로 등록한 사이트는 다른 가산점이 없어도 닫힌다. ## [1.1.0] - 2026-09-14 ### 추가 - 트레이 아이콘을 추가했다. 최소화나 닫기(X)를 누르면 트레이로 숨고, 트레이 메뉴에서 감시·관측 모드·Chrome 열기·로그 폴더 열기·종료를 할 수 있다. 트레이로 숨기지 않고 바로 끝낼 수 있게 창에도 **완전 종료** 버튼을 두었다. - 광고 탭을 닫거나 이동을 되돌리면 Windows 알림을 띄운다. 3초 안의 여러 건은 한 번에 알린다. - 완전히 종료할 때 전용 Chrome도 닫을지 묻는다. "다음부터 묻지 않기"를 고를 수 있다. - 최근 목록에 종류 열과 상세 패널을 추가했다. 판정 사유를 사람이 읽는 문구로 보여 주고, 항목별 점수 내역을 표시한다. - 최근 목록에서 같은 사이트(호스트)의 같은 종류 항목이 반복되면 새 행을 만들지 않고 **횟수** 열을 올린다. 상세 패널에 반복 횟수와 처음 시각을 보여 준다. 이전 실행 기록을 복원할 때도 같은 기준으로 묶는다. - 설정 창 사이트 목록 탭의 입력칸을 목록 위의 파란 테두리 영역으로 옮겨 눈에 띄게 했다. 탭을 열면 입력칸에 바로 커서가 가고, 등록된 항목 수를 보여 준다. - 기준에 조금 못 미쳐 유지한 탭과 관측 모드에서 닫았을 탭도 목록에 보여 준다. 목록에서 **광고 도메인으로 등록**, **감시 사이트로 등록**을 할 수 있다. - 이전 실행의 최근 기록 20개를 목록에 복원하고, 누적 차단 수를 보여 준다. - 구조화된 설정 창을 추가했다. 일반, 사이트 목록, 고급(JSON) 탭으로 편집하고, 값을 검사한 뒤 저장한다. 기본값으로 복원할 수 있다. - 메인 창에서 주소를 입력해 전용 Chrome에 바로 열 수 있다. - 즐겨찾기 사이트를 안내 페이지에 바로가기로 보여 주고, 바탕화면 바로가기를 만들 수 있다. - 안내 페이지에서 감시 일시중지와 관측 모드를 바꿀 수 있고, 이번 실행의 차단 수를 보여 준다. - 실행 즉시 감시를 시작하는 옵션과 Windows 로그인 시 자동 실행 옵션을 추가했다. - 영어 화면을 추가했다. 화면 문구와 활동 로그 문구는 실행 파일 옆 `languages.json` 한 파일에 언어별로 들어 있고, 한국어가 기본 언어다. 설정의 **화면 언어**에서 이 파일에 등록된 언어를 고르거나 Windows 표시 언어를 따르게 할 수 있다. 파일에 언어를 더하면 목록에 나타난다. - Chrome이 없으면 Microsoft Edge, Brave, Chromium을 찾아 쓴다. - 창 위치·크기를 기억하고, 키보드 단축키(Ctrl+M, Ctrl+D, Ctrl+O, Ctrl+L, Ctrl+Z, Ctrl+,, Ctrl+Q)를 추가했다. - 활동 영역에 **로그 폴더 열기**와 **진단 정보 복사**를 추가했다. 창 머리글에 버전을 표시한다. - 새 설정 키: `startMonitoringOnLaunch`, `minimizeToTray`, `closeToTray`, `notifyOnBlock`, `closeChromeOnExit`, `language`, `useBuiltinAdDomains`, `removedAdDomains`, `favoriteSites`. - 새 명령줄 인수: `--minimized`. `--url=`은 이미 실행 중인 인스턴스에 주소를 넘긴다. - 문서: 설정 레퍼런스, 명령줄 인수, 문제 해결, 자주 묻는 질문, 판정 방식 상세, 로그 읽는 법, 영어 README, 기여 안내, 이슈 템플릿, 데모 페이지. ### 변경 - `debugPort` 기본값을 `9222`에서 `0`(자동)으로 바꿨다. 자동이면 전용 프로필의 `DevToolsActivePort`로 포트를 찾고, 전용 프로필 브라우저에만 연결한다. 기존 `config.json`에 `9222`가 적혀 있으면 그대로 9222를 쓴다. - `adDomains`에는 사용자가 추가한 도메인만 둔다. 내장 광고 목록은 항상 함께 적용되므로 새 버전의 목록이 기존 사용자에게도 반영된다. **이전 규칙**: 1.0.0이 만든 `config.json`을 처음 읽을 때 `adDomains`에서 내장 목록과 같은 항목을 지우고 한 번 저장한다. 내장 도메인을 일부러 뺐다면 `removedAdDomains`에 다시 적어야 한다. - 선택한 항목이 있으면 **다시 열기**와 **정상 사이트로 등록**을 그 항목에 적용한다. 이전에는 선택과 관계없이 가장 최근 항목에 적용됐다. - 감시가 켜져 있는데 전용 Chrome이 닫혀 있으면 주황 배너와 창 제목으로 알린다. 감시를 시작할 때 Chrome이 닫혀 있으면 함께 연다. - 실행 파일 폴더에 쓸 수 없으면 설정을 `%LOCALAPPDATA%\TabBouncer\config.json`에 저장한다. - 같은 데이터 폴더로 두 번 실행하면 이미 실행 중인 창을 앞으로 가져온다. - 로그인·결제 흐름 예외를 주소 경로 구간으로만 판단한다. 알려진 광고 도메인에는 예외를 주지 않는다. - `tabbouncer.log`와 `events.jsonl`이 5MB를 넘으면 회전하고 이전 파일 두 개까지만 남긴다. - `events.jsonl`의 판정 이벤트에 `breakdown`(항목별 점수)을 추가하고, `kept`와 `dry-run` 이벤트를 새로 기록한다. - GUI에서 바꾼 관측 모드가 설정 파일 자동 재적용으로 풀리지 않는다. - 명령줄로 준 `--port`, `--url`, `--strict`, `--no-preempt`가 설정 파일을 다시 읽어도 유지된다. ### 보안 - 클릭 추적 스크립트와 기록 통로를 격리 월드로 옮겼다. 페이지 스크립트가 "사용자가 링크를 눌렀다"는 기록을 꾸며 광고 탭을 보호받는 경로를 막았다. - 쿼리에 `/login`을 끼워 넣어 로그인 흐름 예외를 받는 경로를 막았다. ## [1.0.0] - 2026-09-13 첫 공개 버전이다. ### 추가 - Chrome DevTools Protocol로 전용 Chrome의 새 탭·창을 감시하고 광고로 판정한 탭을 닫는다. - 클릭한 링크 목적지와 새 탭 주소를 대조해 사용자가 연 탭을 보호한다. - 보던 탭이 클릭 없이 다른 사이트로 넘어가면 원래 페이지로 되돌린다(`blockRedirectHijack`). - Windows Forms 창에서 감시 시작·일시중지, 관측 모드, 최근 차단 목록, 다시 열기, 정상 사이트 등록, 설정 편집을 제공한다. - 실행하면 감시는 꺼진 상태로 시작하고, 감시가 꺼져 있으면 배너와 창 제목, 안내 페이지로 알린다. - 전용 Chrome이 닫히면 다시 띄우지 않고 "Chrome 열기"를 기다린다. - 활동 로그를 `tabbouncer.log`, 판정 이벤트를 `events.jsonl`에 남긴다. - `--self-test` 자체 검사와 실제 Chrome을 쓰는 브라우저 스모크 테스트.