Outsider Stage 0.5
실제 봉인된 Outsider Stage 0.5 개입 체인을 재생하고 검증합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Survey link privacy risk scanner for Google Forms, Naver Form, and Moaform
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
구글폼, 네이버폼, 모아폼 등 온라인 설문 URL을 입력하면 개인정보보호 위험 신호를 자동으로 점검합니다. 주의: 본 버전은 Mock API + 룰엔진 기반 프로토타입입니다. 실제 DB, Supabase, Playwright 크롤링은 포함되지 않습니다. 브라우저에서 http://localhost:3000 을 엽니다. 1. 메인 페이지에서 설문 URL을 입력합니다. 2. 진단하기 버튼을 클릭합니다. 3. 진단 진행 화면에서 단계별 진행 상태를 확인합니다. 4. 완료 후 같은 페이지 하단에 결과 리포트가 표시됩니다. 5. 리포트에서 요약 복사, 전체 복사, 공유 링크, Markdown 다운로드 등을 이용할 수 있습니다. 1차의 고정 Mock 리포트 대신, NormalizedForm fixture → 계층형 룰엔진 → ScanReport 흐름으로 동작합니다.README 전문 보기 ↗
설문 링크 개인정보 위험 진단 서비스
구글폼, 네이버폼, 모아폼 등 온라인 설문 URL을 입력하면 개인정보보호 위험 신호를 자동으로 점검합니다.
주의: 본 버전은 Mock API + 룰엔진 기반 프로토타입입니다. 실제 DB, Supabase, Playwright 크롤링은 포함되지 않습니다.
npm install
npm run dev
브라우저에서 http://localhost:3000 을 엽니다.
포트 변경 예시:
npm run dev -- -p 8080
npm run build
npm start
1차의 고정 Mock 리포트 대신, NormalizedForm fixture → 계층형 룰엔진 → ScanReport 흐름으로 동작합니다.
classifyContext → classifyDataRisk → classifyToolRisk
→ deriveRequiredObligations → checkNoticeCompliance
→ assessManagementRisk → applyGradeOverrideRules
→ calculateScore → generateReport
public_sector)으로 분류합니다.public_sector context를 적용합니다.URL 키워드로 fixture를 선택한 뒤 analyzeForm()으로 리포트를 생성합니다.
| URL 키워드 | 처리 방식 | 비고 |
|---|---|---|
docs.google.com/forms, forms.gle | GoogleFormsExtractor (4차) | 실제 HTML 추출 |
form.naver.com, naver.me | NaverFormsExtractor (5차) | 실제 HTML + 공개 API 추출 |
moaform.com, answer.moaform.com | MoaformExtractor (6차) | 실제 HTML + 공개 JSON 추출 |
wiseon | wiseon_csap_caution fixture | |
| 그 외 | GenericHtmlExtractor → 룰엔진 | 베타 (상황별) |
naver / wiseon URL은 fixture를 유지합니다.
그 외( Google Forms / 네이버폼 / 모아폼 제외) URL은 URL 안전검사 → HTML fetch → GenericHtmlExtractor → 룰엔진 경로로 처리합니다.
http/https만 허용, file:, data:, javascript: 등 차단text/html이 아니면 limited 처리URL 캐시 초기화 버튼을 누르거나 POST /api/cache/clear를 호출합니다.SURE Check는 quasi_identifier를 “성별·연령·거주지역 등” 같은 고정 대표 문구로 표시하지 않습니다. 실제 탐지된 문항별 세부 카테고리를 기준으로 수집정보를 표시합니다.
gender: 성별, 귀하의 성별, 남성/여성, 남자/여자 선택 문항이 있을 때만 표시합니다.respondent_age 또는 age_range: 귀하의 연령, 귀하의 나이, 연령대, 만 나이, 출생연도 문항을 “연령대”로 표시합니다.child_age_range: 자녀의 연령, 자녀 나이, 아이 연령, 어린이 연령대 문항을 “자녀 연령대”로 표시합니다.residence_area: 거주지, 거주지역, 거주권역, 관내/인접 시군/타지역, 시/군, 시군구 문항을 “거주권역”으로 표시합니다.address: 주소, 상세주소, 도로명주소, 지번주소, 배송지, 우편번호처럼 상세 주소를 묻는 경우에만 사용합니다.affiliation, department, position, tenure: 소속, 부서, 직급, 근속연수는 준식별정보로 표시합니다.address로 올리지 않습니다.detectedCategories 원본과 displayLabel을 함께 보여줍니다.직접식별정보(D3)와 고위험정보(D5)는 별도로 표시합니다. 이름, 연락처, 이메일이 확인되면 모두 직접식별정보에 표시하며, 주민등록번호나 계좌번호 같은 고위험정보가 없으면 “고위험정보 없음”을 유지합니다.
name: 이름, 성명, 신청자명, 담당자명 → “이름”phone: 휴대폰, 핸드폰, 전화번호, 연락처, tel → “연락처”email: 이메일, e-mail, email, 메일 → “이메일”address: 상세주소, 도로명주소, 지번주소, 배송지, 우편번호 → “상세주소”birthdate: 생년월일, 생일, 출생연도 → “생년월일”경품 응모 맥락의 연락처 문항은 “경품 응모용 연락처”로 표시합니다. 일반 연락처 문항은 “연락처”로 표시합니다.
resident_registration_number: 주민등록번호, 주민번호passport_number: 여권번호driver_license_number: 운전면허번호foreign_registration_number: 외국인등록번호id_document: 신분증, 학생증, 사원증 첨부financial_account: 계좌번호, 예금주, 은행authentication_secret: 비밀번호, 인증번호이름, 연락처, 이메일은 D3 직접식별정보이며 고위험정보로 올리지 않습니다. 고위험정보는 위 D5 항목이 실제 문항에 있을 때만 표시합니다.
공공부문 탐지는 설문 운영 주체를 판단하는 기능입니다. 응답자가 선택하는 거주지 선택지는 공공부문 근거로 사용하지 않습니다.
공공기관 판별은 엑셀 원본이 아니라 변환된 JSON 인덱스를 사용합니다.
data/public-institutions.jsonnpm run build:public-institutions (scripts/build-public-institution-index.ts)data/source/public-institutions.xlsx에만 두고, data/source/와 *.xlsx는 .gitignore로 공개 저장소에 올리지 않습니다.예를 들어 용인시박물관 기획전 만족도 조사는 용인시박물관을 공공 문화시설 근거로 사용합니다.
용인, 경기도, 서울, 기타거주지 선택지의 지자체명은 residence_area 준식별정보 판단에는 사용할 수 있지만, 설문 운영 주체의 공공성 근거로는 사용하지 않습니다.
공공기관·지자체·교육청·학교·공공재단·공사·공단 등 공공부문에서 개인정보 또는 민감정보를 수집하면서, Google Forms·Naver Form·Moaform 등 CSAP 인증 도구로 확인되지 않은 외부 설문도구를 사용하는 경우 리포트 상단에 CSAP 강력 권고 블록을 표시합니다.
publicSectorDetected === true)성별·연령대·거주지역 등 D2 준식별정보만 수집하는 공공 설문은 CSAP 강력 권고 블록을 표시하지 않습니다. 대신 외부 도구 이용·보유·파기 안내 중심의 약한 안내만 표시할 수 있습니다.
| 플랫폼 | CSAP 기본 분류 | 표현 예 |
|---|---|---|
| Google Forms | not_certified | CSAP 인증 도구로 확인되지 않은 해외 설문 SaaS, 국외 보관·이전 확인 |
| Naver Form / Moaform | unknown | CSAP 인증 여부 확인이 필요한 외부 설문 SaaS, 위탁·수탁자 확인 |
| Generic / unknown | unknown | CSAP 인증 여부 확인 필요 |
WiseON (wiseon_csap) | certified | CSAP 인증 기반 설문 도구로 확인됨 (고지 의무는 별도) |
PublicSectorCsapWarning 강조 박스 + 접이식 “CSAP란?” 설명민간기업·협회·병원·학원·조사 수행사 등 공공부문이 아닌 설문에서 개인정보 또는 민감정보를 Google Forms·Naver Form·Moaform 등 범용 외부 설문도구로 수집하는 경우, Hero 아래에 보안 인증 권고 블록을 표시합니다.
publicSectorDetected !== true)성별·연령대·거주지역만 수집하는 경우 강한 인증 권고 블록을 표시하지 않습니다. 외부 도구 이용·보유·파기·담당자 안내 중심의 약한 안내만 표시할 수 있습니다.
| 구분 | 공공기관 | 민간기업 |
|---|---|---|
| 전면 강조 | CSAP 중심 | CSAP + ISMS-P + 보안 인증 도구 |
| CSAP 표현 | 공공부문 보안 기준 충족 권고 | 참고 가능한 공공 수준 보안 지표 |
| 컴포넌트 | PublicSectorCsapWarning | PrivateSectorSecurityCertificationCallout |
form, input, textarea, select, label 등 화면에서 자동 확인 가능한 요소를 기준으로 문항을 추출합니다.https://example.com)은 진단 제한으로 표시되며, 개인정보 위험 점수·등급은 산정하지 않습니다. 이는 정상 동작입니다.https://docs.google.com/forms/d/e/.../viewform # GoogleFormsExtractor (4차)
https://forms.gle/... # GoogleFormsExtractor (리다이렉트 후 추출)
https://form.naver.com/response/9hQ4XnvCRtCR8xn4OJEe0w # NaverFormsExtractor (5차)
https://www.moaform.com/q/{formId} # MoaformExtractor (6차)
https://wiseon.io/example # fixture
https://example.com # 진단 제한 (설문 페이지 아님, 점수 미산정)
https://www.w3.org # HTML 베타 추출
http://localhost # 차단 (failed)
http://127.0.0.1 # 차단 (failed)
file:///etc/passwd # 차단 (failed)
https://docs.google.com/forms/d/e/1FAIpQLSeuZiyN-uQBbmmSLxT81xGUfgjMQpUFyJ4D7r-0zjegTy_0HA/viewform
https://form.naver.com/example
https://www.moaform.com/q/{formId}
https://wiseon.io/example
https://example.com/survey
Google Forms 공개 응답 URL에 대해 GoogleFormsExtractor로 실제 HTML을 파싱합니다.
Playwright·DB·Supabase는 사용하지 않습니다.
URL 안전검사 → HTML fetch (GET) → GoogleFormsExtractor
→ FB_PUBLIC_LOAD_DATA_ 파싱 (실패 시 DOM fallback)
→ analyzeForm → ScanReport
docs.google.com/formsdocs.google.com/forms/d/e/docs.google.com/forms/d/forms.gle (리다이렉트 후 최종 URL 재검사)FB_PUBLIC_LOAD_DATA_ JSON 배열을 안전하게 파싱 (eval/Function 미사용)google_public_high_risk fixture로 fallback하지 않음branchDetected는 섹션 구조 기반 추정)npm run dev 실행공개 Google Forms 테스트 링크를 넣어 확인하세요.
예시 (공개 샘플 폼):
https://docs.google.com/forms/d/e/1FAIpQLSeuZiyN-uQBbmmSLxT81xGUfgjMQpUFyJ4D7r-0zjegTy_0HA/viewform
확인 항목:
detectedCategories 반영되는지noticeTexts / description에 반영되는지example.com은 GenericHtmlExtractor 경로 유지네이버폼 공개 응답 URL에 대해 NaverFormsExtractor로 실제 HTML과 공개 API 데이터를 파싱합니다.
Playwright·DB·Supabase는 사용하지 않습니다.
URL 안전검사 → HTML fetch (GET) → NaverFormsExtractor
→ HTML meta + survey-api 공개 access API (GET)
→ analyzeForm → ScanReport
form.naver.com/response/{surveyId}naver.me 단축 URL (리다이렉트 후 form.naver.com인지 재검사)og:title, og:description, #nsv_root[data-url]에서 메타데이터 추출GET survey-api.naver.com/api/form/surveys/{id}/access 호출 (설문 제출 없음)pages[].questions[]에서 문항·선택지·필수 여부 파싱 (eval/Function 미사용)naver_company_event_risk fixture로 fallback하지 않음npm run dev 실행공개 네이버폼 테스트 링크를 넣어 확인하세요.
예시:
https://form.naver.com/response/9hQ4XnvCRtCR8xn4OJEe0w
확인 항목:
detectedCategories 반영되는지noticeTexts / description에 반영되는지모아폼 공개 응답 URL에 대해 MoaformExtractor로 실제 HTML과 공개 JSON 데이터를 파싱합니다.
Playwright·DB·Supabase는 사용하지 않습니다.
URL 안전검사 → HTML fetch (GET) → MoaformExtractor
→ HTML meta + answer.moaform.com 공개 JSON (GET)
→ embedded JSON / DOM fallback
→ analyzeForm → ScanReport
moaform.comwww.moaform.comko.moaform.comanswer.moaform.com (리다이렉트 후 최종 URL)surveyl.ink (PRO 도메인, moaform 계열)도메인에 moaform.com이 포함되면 MoaformExtractor 대상으로 판단합니다.
og:title, og:description, form/label/input/textarea/select 구조 확인GET answer.moaform.com/answers/{id}.json 호출 (설문 제출 없음)application/json 또는 "blocks" embedded JSON 안전 파싱 (eval/Function 미사용)moaform_employee_high_risk fixture로 fallback하지 않음npm run dev 실행공개 모아폼 테스트 링크를 넣어 확인하세요.
예시:
https://www.moaform.com/q/{formId}
확인 항목:
detectedCategories 반영되는지noticeTexts / description에 반영되는지Supabase·DB·Playwright 연결 전, 개발자용 Debug Panel을 추가해 추출 결과와 룰엔진 판단을 화면에서 바로 확인합니다. 사용자용 리포트 UI는 그대로 유지하며, Debug Panel은 리포트 맨 아래 접힌 카드(개발자 진단 정보 보기)로 표시됩니다.
| 영역 | 내용 |
|---|---|
| 메타 정보 | 입력 URL, 정규화 URL, 플랫폼, 최종 URL, 추출기, 문항 수, partialScan, isLimited, confidence 등 |
| 추출 문항 테이블 | pageIndex, questionIndex, questionText, type, required, options count, detectedCategories, riskTags |
| Analyzer Trace | 주체·목적 → 수집정보 → 도구·처리경로 → obligations → 고지 충족 → 관리·운영 → override → 최종 점수·등급 |
| JSON | NormalizedForm / ScanReport (접기·복사 가능) |
| 유형 | 예시 / 방법 |
|---|---|
| 실제 공개 Google Forms | docs.google.com/forms 또는 forms.gle 공개 설문 |
| 실제 공개 네이버폼 | form.naver.com 또는 naver.me 단축 URL |
| 실제 공개 모아폼 | moaform.com/q/... 공개 설문 |
| 일반 HTML form 페이지 | <form> / <input> 이 있는 자체 호스팅 페이지 |
| 설문이 아닌 일반 페이지 | 블로그, 랜딩 페이지 등 |
| localhost / 127.0.0.1 | http://localhost:3000 등 (차단 확인) |
| 문항 없는 페이지 | 빈 폼 또는 동적 로딩만 있는 페이지 |
| 개인정보 고지문이 있는 설문 | description / noticeTexts에 고지 포함 |
| 이름·연락처·이메일 설문 | D3 직접식별정보 탐지 확인 |
| 성별/연령대/자녀 연령대/거주권역 설문 | 실제 문항별 D2 준식별정보 표시 확인 |
publicSectorDetected)가 되는가npm run build TypeScript 에러 없음npm run dev 정상 실행조사 솔루션 품질을 개발자/운영자용 검증 하네스로 점검합니다. DB 없이 localStorage에 케이스·결과를 저장하며, 추후 validation_runs Supabase 테이블로 이전할 수 있도록 타입을 분리했습니다.
npm run dev
브라우저에서 http://localhost:3000/lab 을 엽니다.
메인 사용자 화면(/)과 분리된 개발자용 검증 페이지입니다.
| 기능 | 설명 |
|---|---|
| 테스트 케이스 관리 | URL·기대 플랫폼·기대값 추가, enabled 토글, localStorage 저장 |
| 순차 실행 | /api/scan/start → status polling → report 조회 (케이스 간 500ms delay) |
| 기대값 비교 | 플랫폼, 추출기, 문항 수, PII 카테고리, 등급, 제한, context, dataLevel |
| 결과 상태 | pass / partial / fail / skipped / error |
| Export | JSON 복사·다운로드, CSV 다운로드 |
| 커버리지 매트릭스 | 플랫폼별 URL 감지·추출·Playwright 필요 여부 등 |
| Golden Cases | 대표 설문 유형별 고정 fixture로 룰 회귀 검증 |
risk, 실제 high_risk)lib/validation/defaultCases.ts에 20개 기본 케이스가 있습니다.
/lab 접속 → 상단 요약·커버리지 매트릭스 확인defaultCases.ts에 새 platformGroup 케이스 추가platformCoverage.ts 매트릭스 상태 업데이트SURE Check의 룰 안정화는 특정 설문명을 하드코딩하는 방식이 아니라, 대표 설문 유형별 기대 결과를 고정한 Golden Test Case 기준으로 진행합니다.
if title includes ... 형태로 예외처리하지 않습니다./lab의 Golden Cases 탭에서 통과율을 확인합니다.lib/validation/goldenCases.ts # GoldenCase 타입과 기본 대표 케이스
lib/validation/compareGoldenCase.ts # 응답 판단, 데이터 항목, 금지/필수 문구 비교
lib/validation/runGoldenCase.ts # analyzeForm + AudienceReport 기반 실행
components/lab/GoldenCasesPanel.tsx # /lab Golden Cases 탭 UI
expectedDecision)expectedGradeRange)expectedDataItems)expectedNotDataItems)expectedContext)expectedOperatorFixes)forbiddenPhrases)requiredPhrases)/lab 접속Golden Cases 탭 선택전체 Golden Case 실행현재 Golden Case는 외부 URL fetch 없이 sampleNormalizedForm fixture를 분석합니다. 네트워크 상태가 아니라 룰 엔진과 리포트 표현의 회귀를 안정적으로 검증하기 위한 구조입니다.
lib/validation/
types.ts # ValidationCase, ValidationResult (Supabase 이전용)
defaultCases.ts # 기본 테스트 케이스
runValidationCase.ts # scan API 순차 실행
compareValidationResult.ts
goldenCases.ts # 대표 유형 Golden Case fixture
compareGoldenCase.ts # Golden Case 비교
runGoldenCase.ts # Golden Case 실행
mapActualFromReport.ts
exportValidationResults.ts
platformCoverage.ts
validationStorage.ts # localStorage
Supabase·DB·Playwright 연결 전 단계에서는 제한 리포트와 저장 타입을 다음 기준으로 유지합니다.
limited, blocked, failed는 RiskGrade가 아니라 diagnosisStatus로 구분합니다.isLimited: true, confidence: "none", score: null | undefined, grade: undefined 구조를 사용합니다.safe/caution/risk/high_risk 등급과 점수를 표시합니다.NormalizedForm, ScanReport, ScanDebugInfo, ValidationCase, ValidationResult는 Supabase 연결 시 JSONB 저장 기준 타입입니다.현재 MockScanRepository의 상태 진행(pending → running → completed)은 로컬 개발용 in-memory mock입니다. API 응답 이후 simulateScanProgress()가 백그라운드처럼 동작하지만, Vercel 같은 서버리스 운영 환경에서는 응답 이후 작업 지속이 보장되지 않습니다.
실제 운영 전에는 다음 구조로 전환해야 합니다.
/api/scan/start가 Supabase scan_jobs에 pending 작업 저장scan_reports 또는 JSONB 컬럼에 저장/api/scan/status, /api/scan/report가 Supabase 저장값 조회npm run lint
npx tsc --noEmit
npm run dev -- -p 8080
하나의 ScanReport를 화면에서 응답 판단 중심으로 재구성합니다. 기존 extractor, 룰엔진, Debug Panel, Validation Lab은 유지하며, DB·Supabase·Playwright·Worker는 연결하지 않습니다.
URL 진단과 별도로 설문 파일 진단 탭을 제공합니다. 기존 Analyzer·리포트 UI는 재사용하며, 파일에서 문항 텍스트를 추출해 NormalizedForm으로 변환합니다.
mammoth)xlsx)pdf-parse) — OCR/스캔본 미지원jszip + fast-xml-parser)POST /api/scan/file (multipart/form-data, field: file)
→ 기존 ScanReport JSON 반환 → ReportView 재사용
lib/file-extractors/
app/api/scan/file/route.ts
components/FileScanForm.tsx
app/page.tsx
결과 리포트는 대상별로 3개 구역으로 나눕니다.
| 구역 | 대상 | 포함 섹션 |
|---|---|---|
| 응답자용 | 일반 시민·고객·응답자 | 1. 나의 응답 판단 · 2. 판단 핵심 근거 · 3. 설문 프로필 요약 |
| 신고 검토 CTA | 응답 거부·신고 검토인 경우만 | 신고 검토 안내 · 신고용 증빙자료 다운로드 · KISA 신고센터 이동 |
| 기관·기업 담당자용 | 설문 운영자 | 4. 운영자용 핵심 개선 리포트 · 5. 개선 문구 복사 · 6. 세부 판단근거 |
| 부록 | 원문 확인 | 7. 설문/문항 정보 보기 |
구역 상단에 응답자용 / 기관·기업 담당자용 / 부록 라벨과 제목·설명을 둡니다. 기관 구역 시작에는 “여기부터는 설문 운영자용입니다.” 안내를 표시합니다.
응답 판단이 응답 거부·신고 검토일 때만, 응답자용 구역과 기관·기업 담당자용 구역 사이에 신고 검토 CTA를 표시합니다.
NEXT_PUBLIC_KISA_REPORT_URL(기본 https://privacy.kisa.or.kr)로 새 탭을 엽니다.관련 코드: components/report/EvidenceActionPanel.tsx, lib/evidence/*
환경변수 예시(.env.example):
NEXT_PUBLIC_KISA_REPORT_URL=https://privacy.kisa.or.kr
자동 캡처는 증거 수집용 공개 화면 캡처이며, 자동 설문 응답 기능이 아닙니다.
허용
fullPage) PNG 캡처limitation 기록금지
타임아웃·상태
success | partial | failed | timeout모듈 구조 (lib/evidence/capture/)
| 파일 | 역할 |
|---|---|
captureTypes.ts | 타입 |
captureConfig.ts | 30초/3페이지 등 제한값 |
browserLauncher.ts | Chrome / @sparticuz/chromium |
urlCaptureSafety.ts | SSRF 게이트 |
pageReadiness.ts | 로딩·안정화 |
pageNavigation.ts | 입력 없는 안전 Next만 |
screenshotCapture.ts | PNG 캡처 |
captureLimitations.ts | limitation 문구 |
captureSurveyScreenshots.ts | 얇은 orchestrator |
호환 entry: lib/evidence/captureSurveyScreenshots.ts (re-export)
관련 코드: app/api/evidence/capture/route.ts, EvidenceActionPanel, buildEvidencePackage
ZIP: 성공·partial 시 08_화면캡처/ PNG + SHA-256·manifest screenCaptureEvidence / captureStatus / captureLimitations
기본 캡처(safe_public_only)와 별도로, KISA/개보위 신고 증빙을 위한 전체 탐색 캡처(evidence_full_walkthrough)를 지원합니다.
플랫폼별 어댑터: Google Forms / Naver Form / Moaform / Generic
경로: lib/evidence/capture/fullWalkthrough/
| 구분 | 기본 캡처 | 신고용 전체 화면 캡처 |
|---|---|---|
| 실행 | 신고 CTA 표시 시 자동 | 사용자 명시 클릭 |
| 입력 | 없음 | 임시 응답값 허용 (캡처 후 입력) |
| 범위 | 최대 3장 / 30초 | 최대 50장 / 180초 |
| 제출 | 금지 | 금지 (제출 버튼 감지 시 캡처 후 종료) |
| 완성도 | — | complete / partial / failed |
임시 응답값 예: 이름 증빙용 임시값, 이메일 [email protected], 연락처 010-0000-0000, 자유서술 증빙용 자동 탐색, 선택형은 최소 선택, 파일은 더미 PDF/PNG.
ZIP 추가 산출물
08_화면캡처/page_01.png …08_화면캡처_메타데이터/page_01.json …06_개인정보_민감정보_등장페이지_요약.html / .csvcaptureProvider, expectedPageCount, capturedPageCount, captureCompleteness, finalSubmitClicked: false관련 코드: lib/evidence/capture/fullWalkthrough/, EvidenceActionPanel의 “신고용 전체 화면 캡처 시작” 버튼
로컬 디버그:
npm run capture:debug:google
npm run capture:debug:naver
npm run capture:debug:moaform
npm run capture:debug:all
산출물: tmp/capture-debug/<provider>/capture-debug-summary.json, step_XXX_* (PNG/DOM/버튼/판단), CAPTURE_DEBUG_RESULT.txt
고지문이 실제로 있는데도 “미확인”으로 나오던 문제를 보정했습니다.
privacy_consent 전문·안내문 원문을 포함해 목적/항목/보유/파기/거부권을 키워드로 재확인operatorName은 “공공기관” 일반값이 아니라 실제 기관명(예: 한국부동산원) 우선privacyNotice로 분리semanticCategories로 두고 personalDataTypes에서 제외totalQuestionCount / detectedPersonalDataQuestionCount 분리npm run test:evidence-package1 → 2 → 3 → (신고 CTA, 조건부) → 4 → 5 → 6 → 7 순으로 렌더링합니다.
설문/문항 정보 보기는 세부 판단근거보다 아래(부록)에 둡니다.
NODE_ENV === "development" 이고 URL에 ?debug=1일 때만 가능합니다.관련 코드: ReportView, ReportAudienceZone, SurveySourceAppendix, UserSafetyReport, OperatorImprovementPanel, DetailedEvidenceSection
결과 리포트는 사용자용과 운영자용으로 분리됩니다. Extractor·룰엔진·Debug Panel은 유지하며 DB·Supabase·Playwright는 연결하지 않습니다.
사용자용 메인 판단명은 아래 6개만 사용합니다. “~형” 표현은 쓰지 않습니다.
| 응답 판단 | 의미 | 메인 문구 |
|---|---|---|
| 응답 가능 | 개인정보 거의 없음 | 이 설문은 응답해도 무리가 없습니다. |
| 개인정보 없이 응답 | 준식별정보만 | 응답은 가능하지만, 이름·연락처 등 개인정보는 쓰지 마세요. |
| 안내 없으면 입력 금지 | 직접식별정보 + 안내 확인 | 수집 목적과 보관·파기 안내가 없으면 개인정보를 입력하지 마세요. |
| 공식 확인 후 응답 | 운영기관·공식성 불명확 | 공식 설문인지 확인한 뒤 응답하세요. |
| 응답 거부·신고 검토 | 민감/고위험·공공+개인정보+외부도구 등 | 이 설문은 응답하지 않는 것이 좋습니다. |
| 문항 분석 불가 | 문항을 읽지 못함 | 문항 분석이 안 되어 판단이 어렵습니다. |
도구 판단은 배지로만 표시하며, 메인 판단명으로 “보안 기준 확인 필요” 등을 쓰지 않습니다.
사용자용 화면에서 Hero와 중복되던 「응답 판단 한눈에 보기」 섹션은 제거합니다.
영어 섹션명(User Response Judgment 등)은 사용자 화면에 쓰지 않습니다.
각 카드는 아래를 포함합니다.
우선순위(상위 4개만 표시):
문항 분석 불가일 때는 위험 확정 없이 분석 한계 카드만 표시합니다.
관련 코드: lib/reporting/buildUserEvidenceCards.ts, components/report/UserEvidenceCards.tsx
금지 예: 응답해도 무리가 낮습니다, ~형, 보안 기준 확인 필요(메인 판단명), 고지문 확인 필요(메인 판단명), 불법입니다, CSAP 위반입니다
권장 예: 응답해도 무리가 없습니다, 위반 소지가 큽니다, 문항 분석이 안 되어 판단이 어렵습니다
문항을 읽지 못한 경우에는 개인정보·민감정보·위반 소지를 추정하지 않습니다.
잘못된 예: 공공 레드플래그형, 기업 이름표확인형
올바른 예: 응답 판단 응답 거부·신고 검토 + 배지 설문 주체: 공공기관
도구 판단 배지 예:
lib/reporting/safetyType.ts
lib/reporting/buildUserEvidenceCards.ts
lib/reporting/buildOperatorImprovementReport.ts
components/report/SafetyTypeCard.tsx
components/report/UserEvidenceCards.tsx
components/report/UserSafetyReport.tsx
components/report/OperatorImprovementPanel.tsx
운영자용 리포트는 긴 나열이 아니라 핵심 문제 Top 3~5만 먼저 보여줍니다.
각 핵심 문제는 아래 필드로 구성합니다.
| 필드 | 내용 |
|---|---|
| 문제 | 한 줄 문제명 |
| 왜 문제인가 | 1문장 |
| 근거 | 법·정책 태그 최대 3개 |
| 바로 고칠 방법 | 1~2문장 조치 |
| 심각도 | 위반 소지 큼 / 확인 필요 / 개선 권고 / 문제 낮음 |
법·정책 태그는 lib/reporting/legalBasisRegistry.ts에서 관리합니다.
같은 의미의 finding은 buildCoreOperatorProblems.ts에서 하나로 묶습니다.
도구/고지문/문항/운영관리 상세와 법 설명은 세부 개선사항 보기, 법·정책 근거 설명 접힘 영역으로 이동합니다.
법률 위반 확정 표현은 사용하지 않습니다.
모아폼(answer.moaform.com, moaform.com, surveyl.ink)은 다음 순서로 문항을 추출합니다.
/start → /gateway JWT → /form2 → /next2 페이지 순회, 빈 답변만 사용·최종 제출 없음).json 공개 엔드포인트일부 설문은 로그인·비밀번호·로직 분기로 문항이 막히면 정적/세션 추출만으로는 문항이 0개일 수 있습니다.
failureReason 예: MOAFORM_DYNAMIC_RENDERING, MOAFORM_QUESTIONS_NOT_FOUND, MOAFORM_ACCESS_RESTRICTED, MOAFORM_CLOSED_OR_PRIVATE, MOAFORM_UNSUPPORTED_STRUCTURE, MOAFORM_FETCH_FAILED(확인 필요)로 표기합니다.모아폼 일부 설문은 JavaScript 렌더링 후 문항이 표시되므로, 정밀 분석을 위해 Playwright Worker 기반 렌더링 fallback이 필요합니다.
관련 코드: lib/extractors/moaformTypes.ts, lib/extractors/moaformParser.ts, lib/extractors/MoaformExtractor.ts, lib/scan/resolveScanReport.ts
이전의 “흰 박스 문서형” 리포트에서 한 단계 더 나아가, 공공기관·기업 담당자가 신뢰할 수 있는 개인정보 리스크 진단 SaaS 리포트 톤으로 고도화했습니다. 진단·증빙·캡처·복사 로직은 변경하지 않습니다.
SURE Check / 개인정보 리스크 진단 배치 → hero 입력 영역이 주인공PlatformMark로 Google Forms / 네이버폼 / 모아폼 / 파일 업로드 favicon-like 표시 (외부 상표 이미지 미사용)관련 코드: PlatformMark, ReportView, ReportAudienceZone, UserEvidenceCards, UserSafetyReport, OperatorImprovementPanel, EvidenceActionPanel, ShareActions, SiteHeader, Logo, app/globals.css
SURE Check 결과 리포트는 친근한 성격유형 리포트 톤에서 벗어나, 공공기관·기업 담당자가 신뢰할 수 있는 개인정보 리스크 진단 리포트 SaaS 톤으로 정리했습니다. 진단 로직·URL/파일 진단·신고용 증빙·KISA 이동·자동 캡처는 유지하고, 디자인·레이아웃·한국어 문구 위계만 개편합니다.
#F8FAFC) + white surface + 얇은 border + 최소 shadow#0F766E / 상태: rose·amber·emerald·slate 각 1계열app/globals.css의 report 토큰과 유틸을 사용합니다.
.report-severity-panel: white surface + 좌측 4px accent.report-badge-neutral / .report-badge-legal.report-btn-primary / .report-btn-secondary응답 거부·신고 검토일 때만 (증빙 다운로드 · KISA · 자동 캡처)?debug=1만) 내부 개발 진단관련 코드: SafetyTypeCard, UserSafetyReport, UserEvidenceCards, EvidenceActionPanel, ReportAudienceZone, OperatorImprovementPanel, SurveySourceAppendix, app/globals.css, components/report/ui/*
앞 섹션은 판단하고, 세부 판단근거는 증명합니다. 개발자 정보는 별도로 숨깁니다.
구성은 아래 5개 블록만 사용합니다.
반복 금지: 최종 판단 문장, 사용자 행동 권고, 운영자 Top 개선사항, CSAP/ISMS-P 장문 설명, finding 원문 전체 나열, raw question id.
Analyzer Trace, NormalizedForm JSON, ScanReport JSON, raw question id는 개발자 진단 정보로 분리합니다. ?debug=1이면 자동 펼침.
관련 코드: lib/reporting/buildDetailedEvidenceSummary.ts, components/report/DetailedEvidenceSection.tsx, components/report/DeveloperDiagnosticsSection.tsx
도서관, 체육시설, 물놀이시설, 관광·문화·교육 프로그램 만족도 설문은 실제 식별정보 수집 여부와 문항 맥락을 분리해 판단합니다.
자녀 연령대, 거주권역은 D2 준식별정보로 분류합니다.성별을 수집정보로 표시하지 않습니다.선호 프로그램, 프로그램 주제, 정책 방향, 서비스 개선 의견, 만족도, 이용 목적은 일반 의견/선호도 문항으로 분류합니다.건강 프로그램, 건강 강좌, 건강 관련 프로그램 선호는 건강정보가 아니라 일반 선호도입니다.다음 키워드가 확인되면 공공부문 관련 시설 설문 가능성을 반영합니다.
양평, 양평군, 물맑은양평종합운동장, 체육시설, 공공체육시설, 어린이물놀이시설, 체육공원, 스포츠센터, 시설관리공공부문으로 분류되더라도 D2 준식별정보 중심 설문은 고위험으로 강제하지 않습니다.
unclear로 처리합니다.unclear로 처리합니다.아동 관련 시설 이용 설문에서 자녀 연령대를 묻더라도 자녀 이름, 생년월일, 연락처 등 직접적인 아동 식별정보가 없으면 “응답 보류 권고”로 올리지 않습니다. 자유의견 문항이 있으면 이름, 연락처, 자녀 이름, 건강정보, 사고 내용 등 개인을 식별할 수 있는 정보는 쓰지 않도록 안내합니다.
| Method | Path | 설명 |
|---|---|---|
| POST | /api/scan/start | 진단 시작 (body: { "formUrl": "..." }) |
| GET | /api/scan/status/[scanId] | 진단 상태 조회 |
| GET | /api/scan/report/[scanId] | 진단 리포트 조회 |
app/
page.tsx # 메인 페이지 (결과 인라인 표시)
lab/page.tsx # 검증 Lab (개발자용)
report/[scanId]/page.tsx # 공유 링크용 결과 페이지
api/scan/ # Mock API Routes
api/evidence/capture/ # 안전 공개화면 캡처 API (30초)
components/
report/ # 응답자/운영자/상세 근거 리포트 UI
report/_archive/ # 미사용 레거시 리포트 컴포넌트
lib/
evidence/capture/ # 안전 공개화면 캡처 모듈 (더미입력 없음)
debug/ # ScanDebugInfo, AnalyzerTrace 빌더
reporting/ # AudienceReport 합성 및 메시지
fixtures/normalizedForms.ts # NormalizedForm 샘플 5종
security/ # URL 안전검사, safe fetch
extractors/ # GoogleFormsExtractor, NaverFormsExtractor, MoaformExtractor, GenericHtmlExtractor
cache/ # 인메모리 URL 캐시
scan/ # 진단 오케스트레이션
rules/ # 분류·의무·준수·등급강제 룰
analyzer/ # 진단 엔진 (analyzeForm)
types/ # scan, analyzer 타입
validation/ # 검증 Lab 타입, 실행, 비교, export
repositories/ # Repository 인터페이스 및 Mock 구현
mock/ # 인메모리 스토어, 하위호환 mockReports
utils/ # 등급, Markdown, 복사 유틸
본 서비스는 법률 자문이 아닌 자동 위험 진단 도구입니다. 결과는 법률 위반을 확정하지 않으며, 실제 처리 방식에 따라 달라질 수 있습니다.