diff --git a/apps/frontend/src/locales/ko/admin.json b/apps/frontend/src/locales/ko/admin.json index 57cd5b9..d4b4dae 100644 --- a/apps/frontend/src/locales/ko/admin.json +++ b/apps/frontend/src/locales/ko/admin.json @@ -171,7 +171,7 @@ "refresh": "새로 고침" }, "confirm": { - "cancel": "이 스캔을 취소하시겠습니까? Celery 작업이 revoke 되고 상태가 cancelled로 변경됩니다." + "cancel": "이 스캔을 취소하시겠습니까? Celery 작업이 취소되고 상태가 cancelled로 변경됩니다." }, "drawer": { "title": "스캔 {{id}}", @@ -348,24 +348,24 @@ } }, "eol": { - "heading": "endoflife.date 스냅숏", + "heading": "endoflife.date 스냅샷", "status": { "ok": "정상", "stale": "오래됨", "skipped": "건너뜀", "disabled": "비활성" }, - "stale_note": "스냅숏이 {{days}}일 지났습니다 — 릴리즈를 업그레이드하거나 scripts/refresh_eol_snapshot.py로 갱신하십시오.", + "stale_note": "스냅샷이 {{days}}일 지났습니다 — 릴리스를 업그레이드하거나 scripts/refresh_eol_snapshot.py로 갱신하십시오.", "skipped_reason": "마지막 갱신 건너뜀: {{reason}}", "kpi": { - "snapshot_date": "스냅숏 날짜", + "snapshot_date": "스냅샷 날짜", "snapshot_age": "{{days}}일 경과", "flagged_total": "지원 종료 컴포넌트", "stamped_cleared": "최근 기록 / 해제", "next_refresh": "다음 실행" }, "origin": { - "vendored": "릴리즈에 벤더링됨", + "vendored": "릴리스에 포함됨", "feed": "피드에서 수집됨" }, "footer": { @@ -373,7 +373,7 @@ "products": "제품 수", "refresh": "실시간 갱신", "refresh_on": "켬 ({{host}})", - "refresh_off": "끔 — 벤더 스냅숏만 사용" + "refresh_off": "끔 — 저장소에 포함된 스냅샷만 사용" } }, "backup": { @@ -408,7 +408,7 @@ "restore": { "warning": "복원 시 사용자, 프로젝트, 스캔을 포함한 모든 데이터가 덮어써집니다. 되돌릴 수 없습니다.", "type_to_confirm": "확인하려면 '{{token}}' 을(를) 입력하세요", - "queued_banner": "복원이 큐에 등록되었습니다. 백엔드가 일시 중지됩니다; 30초 후 새로고침하세요." + "queued_banner": "복원이 큐에 등록되었습니다. 백엔드가 일시 중지됩니다. 30초 후 새로 고치세요." }, "toast": { "manual_triggered": "수동 백업이 큐에 등록되었습니다.", diff --git a/apps/frontend/src/locales/ko/approvals.json b/apps/frontend/src/locales/ko/approvals.json index d5085eb..ff6730c 100644 --- a/apps/frontend/src/locales/ko/approvals.json +++ b/apps/frontend/src/locales/ko/approvals.json @@ -26,7 +26,7 @@ "start_review": "검토 시작", "approve": "승인", "reject": "거절", - "refresh": "새로고침", + "refresh": "새로 고침", "cancel": "취소", "confirm": "확인", "previous": "이전", diff --git a/apps/frontend/src/locales/ko/project_detail.json b/apps/frontend/src/locales/ko/project_detail.json index 9dc2118..00e7dfc 100644 --- a/apps/frontend/src/locales/ko/project_detail.json +++ b/apps/frontend/src/locales/ko/project_detail.json @@ -134,14 +134,14 @@ "overview": { "eol_chip": { "title": "지원 종료된 컴포넌트 {{count}}개", - "body": "지원 종료된 릴리즈에는 업스트림 수정이 제공되지 않아, 이후 발견되는 Critical CVE에 패치가 없습니다.", + "body": "지원 종료된 릴리스에는 업스트림 수정이 제공되지 않아, 이후 발견되는 Critical CVE에 패치가 없습니다.", "link": "EOL 컴포넌트 보기" }, "info_card": { "title": "프로젝트 정보", "description": "설명", "no_description": "설명이 설정되지 않았습니다.", - "git_url": "리포지토리", + "git_url": "저장소", "no_git_url": "git URL이 설정되지 않았습니다.", "default_branch": "기본 브랜치", "visibility": "공개 범위", @@ -233,7 +233,7 @@ }, "errors": { "title": "개요를 불러오지 못했습니다.", - "detail": "페이지를 새로고침해 주세요." + "detail": "페이지를 새로 고쳐 주세요." }, "outdated_chip": { "title": "최신 패치보다 뒤처진 컴포넌트 {{count}}개", @@ -266,27 +266,27 @@ }, "eol": { "label": "EOL", - "tooltip": "이 릴리즈 사이클은 공표된 지원 종료(endoflife.date)를 지났습니다 — 업스트림 수정이 더 이상 제공되지 않습니다.", + "tooltip": "이 릴리스 사이클은 공표된 지원 종료(endoflife.date)를 지났습니다 — 업스트림 수정이 더 이상 제공되지 않습니다.", "tooltip_with_date": "{{date}}부터 지원 종료(endoflife.date) — 업스트림 수정이 더 이상 제공되지 않습니다.", "since": "{{date}}부터", "state": { "eol": "지원 종료됨", "supported": "지원 중 (endoflife.date 추적 대상)", - "unknown": "추적 대상이나 릴리즈 사이클을 판정할 수 없음", + "unknown": "추적 대상이나 릴리스 사이클을 판정할 수 없음", "untracked": "endoflife.date 추적 대상이 아님" } }, "currency": { "label": "뒤처짐", - "tooltip": "이 릴리즈 라인에 더 새로운 패치가 있습니다 — 이 버전은 최신 패치보다 뒤처져 있습니다.", + "tooltip": "이 릴리스 라인에 더 새로운 패치가 있습니다 — 이 버전은 최신 패치보다 뒤처져 있습니다.", "tooltip_with_version": "최신 패치 {{version}}이(가) 있습니다 — 이 버전은 그보다 뒤처져 있습니다.", "latest": "최신 {{version}}", "latest_with_date": "최신 {{version}} ({{date}})", "state": { - "current": "릴리즈 라인의 최신 패치 사용 중", - "outdated": "릴리즈 라인의 최신 패치보다 뒤처짐", + "current": "릴리스 라인의 최신 패치 사용 중", + "outdated": "릴리스 라인의 최신 패치보다 뒤처짐", "unknown": "추적 대상이나 최신 패치를 판정할 수 없음", - "untracked": "이 컴포넌트의 릴리즈 라인 정보가 없음" + "untracked": "이 컴포넌트의 릴리스 라인 정보가 없음" } }, "license": { @@ -590,7 +590,7 @@ "unknown": "미분석" }, "sla_label": "SLA", - "sla_any": "전체", + "sla_any": "SLA 상태 전체", "report_label": "보고서", "download_pdf": "PDF 보고서 다운로드", "download_pdf_generating": "생성 중…", diff --git a/apps/frontend/src/locales/ko/projects.json b/apps/frontend/src/locales/ko/projects.json index a1a9c4c..cdce7a6 100644 --- a/apps/frontend/src/locales/ko/projects.json +++ b/apps/frontend/src/locales/ko/projects.json @@ -63,7 +63,7 @@ "description_placeholder": "간단한 설명 (선택사항)", "git_url_label": "Git URL", "git_url_placeholder": "https://github.com/org/repo", - "git_url_hint": "선택. 비워 두면 스캔 시 .zip 또는 폴더를 업로드할 수 있습니다. HTTPS·SSH(git@host:…)·git+ssh URL을 지원하며, private 저장소는 URL에 자격증명을 포함해야 합니다.", + "git_url_hint": "선택. 비워 두면 스캔 시 .zip 또는 폴더를 업로드할 수 있습니다. HTTPS·SSH(git@host:…)·git+ssh URL을 지원하며, 비공개 저장소는 URL에 자격증명을 포함해야 합니다.", "default_branch_label": "기본 브랜치", "default_branch_placeholder": "main (선택)", "team_label": "팀", diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/admin-guide/disk-and-health.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/admin-guide/disk-and-health.md index b3c68e5..f70ee9d 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/admin-guide/disk-and-health.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/admin-guide/disk-and-health.md @@ -51,26 +51,26 @@ sidebar_position: 3 포털은 `backend`, `worker`, `beat`, `frontend`, `traefik`을 별도 프로브하지 않습니다. 이들의 liveness는 암묵적입니다 — 대시보드가 렌더되면 backend 가동 중, `celery` 행이 `ok`이면 worker(와 worker가 의존하는 broker)도 도달 가능. -### endoflife.date 스냅숏 패널 {#eol-panel} +### endoflife.date 스냅샷 패널 {#eol-panel} -Trivy DB·KEV 피드 패널 아래의 **endoflife.date 스냅숏** 패널은 Components 탭 +Trivy DB·KEV 피드 패널 아래의 **endoflife.date 스냅샷** 패널은 Components 탭 [EOL 배지](../user-guide/components-and-licenses.md#end-of-life-flagging)의 데이터셋 상태를 보여줍니다. -- **스냅숏 날짜** — 유효 데이터셋의 생성일(릴리즈에 벤더링된 스냅숏과, - `EOL_REFRESH_ENABLED=true` 인 경우 마지막으로 수집한 스냅숏 중 더 최신). - 180일이 지나면 주황색 **오래됨** 배지로 격상됩니다 — 릴리즈를 - 업그레이드하거나 `python3 scripts/refresh_eol_snapshot.py`로 스냅숏을 +- **스냅샷 날짜** — 유효 데이터셋의 생성일(릴리스에 포함된 스냅샷과, + `EOL_REFRESH_ENABLED=true` 인 경우 마지막으로 수집한 스냅샷 중 더 최신). + 180일이 지나면 주황색 **오래됨** 배지로 격상됩니다 — 릴리스를 + 업그레이드하거나 `python3 scripts/refresh_eol_snapshot.py`로 스냅샷을 다시 만드십시오. - **지원 종료 컴포넌트** — 지원 종료를 지난 카탈로그 컴포넌트 버전의 실시간 개수. - **최근 기록 / 해제** — 주간 beat의 재기록 패스가 마지막 실행에서 한 일. 재기록은 실시간 수집이 꺼져 있어도 실행됩니다 — 순수 로컬 패스로, 더 새 - 벤더 스냅숏을 기존 행에 반영하고 목록에서 빠진 제품의 기록을 지웁니다. + 벤더 스냅샷을 기존 행에 반영하고 목록에서 빠진 제품의 기록을 지웁니다. - **다음 실행** — 라이브 Celery beat 스케줄에서 유도(기본 일요일 02:15 UTC). -푸터에는 데이터셋 출처(벤더링/피드 수집)와 실시간 갱신 여부가 표시됩니다. +푸터에는 데이터셋 출처(저장소 포함/피드 수집)와 실시간 갱신 여부가 표시됩니다. 실시간 갱신은 **기본 꺼짐**입니다 — [환경변수](../reference/env-variables.md)의 `EOL_REFRESH_ENABLED`를 참고하십시오. diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/best-practices/scan-frequency.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/best-practices/scan-frequency.md index bc4e8bd..3bc858d 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/best-practices/scan-frequency.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/best-practices/scan-frequency.md @@ -69,7 +69,7 @@ CI가 지나치게 잦다면, 스캔 단계를 의존성 매니페스트(`packag | `main`·보호 브랜치 | push마다 스캔 | live 스냅샷을 정확하게 유지합니다. | | 릴리스 태그 | `release` 레이블로 한 번 스캔 | 배포된 버전의 영구 SBOM. | | 변동이 적은 장수 서비스 | PR + push만, 예약 없음 | 새 CVE는 beat가 처리하고 소스는 거의 안 움직입니다. | -| 벤더링·외부 도입 | 벤더링 트리 변경 시 스캔 | 패키지 매니저 이벤트가 스스로 발생하지 않습니다. | +| 외부 코드 직접 포함 | 포함한 트리가 바뀔 때 스캔 | 패키지 매니저 이벤트가 스스로 발생하지 않습니다. | **예약** 스캔이 슬롯 값을 하는 유일한 경우는, 커밋 *없이* 의존성이 흐르는 프로젝트입니다 — 예를 들어 빌드 시점에 유동 버전 범위를 해석하는 빌드입니다. 그런 경우 주간 예약 스캔이 관측된 트리를 다시 고정합니다. 그 외에는 소스 변경 트리거와 재매칭 beat가 더 낫습니다. diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/ci-integration/sbom-upload.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/ci-integration/sbom-upload.md index 3ce64fe..4ff6bc7 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/ci-integration/sbom-upload.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/ci-integration/sbom-upload.md @@ -176,7 +176,7 @@ curl -H "Authorization: Bearer $TRUSTEDOSS_API_KEY" \ } ``` -대응표 결합은 벤더링된 카탈로그를 상대로 읽기 시점에 수행되므로, 이전 스캔이 저장한 판정도 다시 스캔하지 않고 갱신된 대응 관계를 반영합니다. 실패한 필수 검사는 프레임워크의 `total`에만 셉니다 — 필수 검사 실패는 이미 제출 전체를 fail로 만들었으므로, 대응표가 두 번째 판정이 되지는 않습니다. +대응표 결합은 저장소에 포함된 카탈로그를 상대로 읽기 시점에 수행되므로, 이전 스캔이 저장한 판정도 다시 스캔하지 않고 갱신된 대응 관계를 반영합니다. 실패한 필수 검사는 프레임워크의 `total`에만 셉니다 — 필수 검사 실패는 이미 제출 전체를 fail로 만들었으므로, 대응표가 두 번째 판정이 되지는 않습니다. :::note 컴플라이언스 판정이 아닙니다 대응표는 **문서화 준비를 돕는 자료**입니다. TRUSCA는 EU 사이버복원력법, EU 인공지능법, AI 기본법을 비롯한 어떤 규제의 준수 여부도 인증하거나 판정하지 않습니다. 대응표는 SBOM이 담을 수 있는 문서화 항목만 다루며, 공정성·편향 평가, 위험관리, 인간 감독처럼 SBOM으로 표현할 수 없는 의무는 범위 밖이라 별도 문서로 이행해야 합니다. 응답에는 이 면책 문구가 그대로 실리며, 롤업을 특정 제품의 법적 의무에 비추어 해석하는 일은 사람이 해야 합니다. diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/documentation.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/documentation.md index 47cf483..9a10b39 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/documentation.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/documentation.md @@ -82,7 +82,7 @@ admin-guide 아래에 있습니다. ... ``` -이는 버전별 문서 스냅숏(Docusaurus가 소규모 사이트에는 권하지 않는)의 가벼운 +이는 버전별 문서 스냅샷(Docusaurus가 소규모 사이트에는 권하지 않는)의 가벼운 대안입니다. **새** 기능 섹션이 출하될 때 붙이세요 — 기존 트리 전체에 소급할 필요는 없습니다. [릴리스 노트](../release-notes/v0.14.0.md)가 버전별 전체 체인지로그로 남고, 이 표기는 가이드를 읽는 독자가 필요로 하는 "언제부터"를 diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/releasing.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/releasing.md index 03193ac..5d450f3 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/releasing.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/releasing.md @@ -74,10 +74,10 @@ pull해서 실행해봐야만 설치 가능 여부를 증명할 수 있기 때 ## 릴리스 절차 -1. 벤더링된 endoflife.date 스냅숏을 갱신해 릴리스가 최신 수명 주기 데이터를 +1. 저장소에 포함된 endoflife.date 스냅샷을 갱신해 릴리스가 최신 수명 주기 데이터를 담게 합니다(EOL 판정은 이 파일에서 오프라인으로 스탬프됩니다). `apps/backend`에서 `python3 scripts/refresh_eol_snapshot.py`를 실행하고, - 갱신된 스냅숏을 릴리스 준비 변경과 함께 커밋합니다. + 갱신된 스냅샷을 릴리스 준비 변경과 함께 커밋합니다. 2. **문서 일괄 점검** — 릴리스는 문서와 함께 나갑니다. 태그 전에: - `docs-site/docs/release-notes/X.Y.Z.md`에 릴리스 노트를 작성합니다 (EN + KO 미러, `sidebars.ts` 배선 포함). 내용은 `CHANGELOG.md`의 diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/testing-guide.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/testing-guide.md index f54ee69..3cb44a4 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/testing-guide.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/contributor-guide/testing-guide.md @@ -177,7 +177,7 @@ def test_normalize_spdx_id(raw: str, expected: list[str]) -> None: ### 회귀망은 의도적으로 두 겹 -`tests/verify-specs/`는 검증팀의 결정적 스펙 모듈을 벤더링한 것이고(동봉 `PROVENANCE.md` 참조) nightly(`verify-specs-nightly.yml`)가 신선하게 시드된 스택에 전수 실행합니다. 이 nightly는 우리 내부 회귀망입니다 — 검증팀의 독립 Tier-3 재검증을 대체하지 않으며, 후자의 가치는 오라클이 우리 것이 아니라는 데 있습니다. +`tests/verify-specs/`는 검증팀의 결정적 스펙 모듈을 저장소에 포함한 것이고(동봉 `PROVENANCE.md` 참조) nightly(`verify-specs-nightly.yml`)가 신선하게 시드된 스택에 전수 실행합니다. 이 nightly는 우리 내부 회귀망입니다 — 검증팀의 독립 Tier-3 재검증을 대체하지 않으며, 후자의 가치는 오라클이 우리 것이 아니라는 데 있습니다. ## 디자인 게이트 — 색과 픽셀 diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md index 9411568..faeb65e 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md @@ -22,7 +22,7 @@ slug: /quickstart ## 1. 스택 기동 -레포지토리를 클론하고 env 파일을 생성합니다. +저장소를 클론하고 env 파일을 생성합니다. ```bash diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/analysis-types.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/analysis-types.md index a4ae55a..91ce5dc 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/analysis-types.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/analysis-types.md @@ -22,7 +22,7 @@ TRUSCA는 코드와 그 의존성에 대해 서로 다른 여러 **종류**의 | 분석 | 입력 | 도구 | 산출 | 사용 시점 | 자세히 | |---|---|---|---|---|---| -| **소스 SBOM 스캔** | Git 레포지토리 (또는 업로드한 소스 아카이브) | `cdxgen` → scancode → `trivy sbom` | CycloneDX SBOM, 법적 tier 분류가 붙은 declared + detected 라이선스, 매칭된 CVE | 기본값. 프로젝트 의존성 트리의 전체 컴포넌트 목록·라이선스·취약점이 필요할 때. | [스캔 → 스캔 종류](../user-guide/scans.md#스캔-종류), [SBOM](../user-guide/sbom.md) | +| **소스 SBOM 스캔** | Git 저장소 (또는 업로드한 소스 아카이브) | `cdxgen` → scancode → `trivy sbom` | CycloneDX SBOM, 법적 tier 분류가 붙은 declared + detected 라이선스, 매칭된 CVE | 기본값. 프로젝트 의존성 트리의 전체 컴포넌트 목록·라이선스·취약점이 필요할 때. | [스캔 → 스캔 종류](../user-guide/scans.md#스캔-종류), [SBOM](../user-guide/sbom.md) | | **컨테이너 이미지 스캔** | 빌드된 컨테이너 이미지 참조 (`name:tag`) | Trivy | OS 패키지 CVE와 베이스 이미지 OS 지원 종료(EOSL) 판정 | 컨테이너를 배포하며, 애플리케이션 의존성뿐 아니라 OS 계층의 취약점도 알고 싶을 때. | [스캔 → 컨테이너 이미지 스캔](../user-guide/scans.md#컨테이너-이미지-스캔), [컨테이너 OS 지원 종료](../user-guide/scans.md#container-os-eol) | | **빌드 게이트** | 완료된 스캔의 finding과 라이선스 | 포털 게이트 평가기 | pass/fail 빌드 판정 (CI exit code `0` 또는 `1`) | 금지 라이선스나 임계값 초과 취약점에서 빌드를 자동으로 실패시키고 싶을 때 — CI 집행 지점. | [승인](../user-guide/approvals.md), [라이선스 정책](./license-policies.md), [GitHub Actions](../ci-integration/github-actions.md) | | **Reachability 분석** | 스캔한 모듈의 보존된 Go 소스 | `govulncheck` (Go) | finding별 reachable / not-reachable / not-analysed 신호 (Go finding에 한함) | 취약 코드가 실제로 호출되는 finding에 우선순위를 매기고 싶을 때. **현재 Go만 지원 — 아래 상태 안내를 확인하세요.** | [비교 → reachability](../comparison.md) | @@ -31,7 +31,7 @@ TRUSCA는 코드와 그 의존성에 대해 서로 다른 여러 **종류**의 ## 소스 SBOM 스캔 {#source-detail} -소스 스캔은 기본 분석입니다. `cdxgen`(30개 이상 생태계를 커버하는 CycloneDX SBOM 생성기)이 레포지토리를 순회해 의존성 트리의 SBOM을 내며, 각 패키지의 메타데이터에서 읽은 **declared** 라이선스를 함께 담습니다. 이어서 scancode가 팀이 직접 작성한 first-party 소스를 읽어 **detected** 라이선스를 찾습니다(베스트에포트). 마지막으로 `trivy sbom`이 SBOM을 로컬 Trivy DB에 대조해 CVE finding을 내고, 내장 분류기가 각 라이선스에 법적 tier(`permissive` / `conditional` / `forbidden` / `unknown`)를 부여합니다. +소스 스캔은 기본 분석입니다. `cdxgen`(30개 이상 생태계를 커버하는 CycloneDX SBOM 생성기)이 저장소를 순회해 의존성 트리의 SBOM을 내며, 각 패키지의 메타데이터에서 읽은 **declared** 라이선스를 함께 담습니다. 이어서 scancode가 팀이 직접 작성한 first-party 소스를 읽어 **detected** 라이선스를 찾습니다(베스트에포트). 마지막으로 `trivy sbom`이 SBOM을 로컬 Trivy DB에 대조해 CVE finding을 내고, 내장 분류기가 각 라이선스에 법적 tier(`permissive` / `conditional` / `forbidden` / `unknown`)를 부여합니다. 결과는 모든 프로젝트 탭 — Components, Licenses, Vulnerabilities, SBOM — 으로 흘러갑니다. 단계별 흐름은 [아키텍처 → 스캔 파이프라인](./architecture.md#스캔-파이프라인)을, 실행 방법은 [스캔](../user-guide/scans.md)을 참조하세요. diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/cra-compliance.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/cra-compliance.md index be9ab5c..488459e 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/cra-compliance.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/cra-compliance.md @@ -73,7 +73,7 @@ CRA를 준수하게 되는 것은 아니며, 이 문서는 법률 자문이 아 CRA 프로그램 안에서 TRUSCA를 실용적으로 쓰는 방법이다. -1. 릴리즈마다 SBOM(CycloneDX 또는 SPDX)을 생성해 보관하고, 이를 문서화된 +1. 릴리스마다 SBOM(CycloneDX 또는 SPDX)을 생성해 보관하고, 이를 문서화된 구성요소 인벤토리로 삼는다. 2. CI 빌드 게이트를 켜서 Critical CVE·금지 라이선스가 출하되지 못하게 하고, Trivy DB 갱신과 자동 재매칭을 계속 돌려 출하된 SBOM에 대한 새 CVE가 자동으로 diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/data-sources.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/data-sources.md index 0bbbf6f..ad98478 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/data-sources.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/data-sources.md @@ -30,7 +30,7 @@ TRUSCA는 5개 공개 취약점 피드를 컴파일한 번들인 **Trivy DB**로 | 출처 | 발행처 | 갱신 | 기여 내용 | |---|---|---|---| -| **endoflife.date** — 제품 라이프사이클 날짜 | endoflife.date 커뮤니티 (코드는 MIT, 라이프사이클 날짜는 사실 데이터) | 릴리즈마다 벤더링되는 스냅숏 (`scripts/refresh_eol_snapshot.py`) | 선별된 런타임·프레임워크 목록의 지원 종료 판정 — [EOL 배지와 필터](../user-guide/components-and-licenses.md#end-of-life-flagging). 스캔 시 번들된 스냅숏에서 읽으며 네트워크 호출이 없습니다. | +| **endoflife.date** — 제품 라이프사이클 날짜 | endoflife.date 커뮤니티 (코드는 MIT, 라이프사이클 날짜는 사실 데이터) | 릴리스마다 저장소에 포함되는 스냅샷 (`scripts/refresh_eol_snapshot.py`) | 선별된 런타임·프레임워크 목록의 지원 종료 판정 — [EOL 배지와 필터](../user-guide/components-and-licenses.md#end-of-life-flagging). 스캔 시 번들된 스냅샷에서 읽으며 네트워크 호출이 없습니다. | ## 포털에서의 갱신 주기 diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/design-system.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/design-system.md index 10eda81..dcd849f 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/design-system.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/design-system.md @@ -196,7 +196,7 @@ solid은 그 색으로 텍스트가 아닌 표식을 실제로 그리는 곳이 Zinc가 아니라 slate 입니다. 라이트 테마는 zinc(hue 240, 중립 회색)인데 이것을 그대로 어둡게 옮기면 shadcn을 쓰는 모든 애플리케이션이 함께 쓰는 다크 팔레트가 됩니다. 이 테마는 브랜드의 다크 슬레이트 `#0f172a`의 hue를 물려받아, "다크 모드를 켰다"가 아니라 이 제품으로 읽히게 했습니다. -``의 `.dark` 클래스로 전환합니다. 사용자 설정은 번들이 로드되기 전에 `index.html`의 인라인 스크립트가 해석합니다. React 안에서 해석하면 첫 프레임이 라이트로 그려져 새로고침마다 화면이 하얗게 번쩍이기 때문입니다. 상태는 셋(라이트 · 다크 · 시스템 따라가기)이고 글로벌 바에서 순환합니다. +``의 `.dark` 클래스로 전환합니다. 사용자 설정은 번들이 로드되기 전에 `index.html`의 인라인 스크립트가 해석합니다. React 안에서 해석하면 첫 프레임이 라이트로 그려져 새로 고침마다 화면이 하얗게 번쩍이기 때문입니다. 상태는 셋(라이트 · 다크 · 시스템 따라가기)이고 글로벌 바에서 순환합니다. ### 테마가 바꾸지 않는 것 diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/env-variables.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/env-variables.md index 62a8d97..3c7deda 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/env-variables.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/env-variables.md @@ -135,8 +135,8 @@ CI 빌드 게이트는 기본적으로 Critical CVE와 금지 라이선스에서 | `SCAN_SCOPE_FILTER_NODE_ENABLED` | `true` | `config.py` | 스코프 필터의 npm 부분(커밋되었거나 prep 단계가 생성한 `package-lock.json`이 `dev`로 분류한 패키지 제거). lockfile에 없는 패키지는 항상 유지합니다. | | `LICENSE_FETCH_ENABLED` | `true` | `config.py` | cdxgen 이후 라이선스 보강. cdxgen이 SPDX 라이선스를 못 준 컴포넌트(설치된 패키지가 없는 `requirements.txt` / `go.mod`에서 흔함)에 대해, 컴포넌트의 공개 레지스트리(PyPI / Maven Central / crates.io / pkg.go.dev / RubyGems / NuGet)에 purl로 선언 라이선스를 조회하고 캐시합니다 — "unknown" 라이선스 비율을 낮춥니다. 네트워크로 나가는 것은 패키지명+버전뿐(패키지 매니저가 이미 접속하는 레지스트리)이라 SCANOSS 핑거프린트 egress와 달리 기본 **켬** 입니다. **air-gapped** 배포에서는 `false` / `0` / `no`로 꺼서, 미해석 컴포넌트가 컴포넌트마다 네트워크 타임아웃을 치르지 않고 unknown으로 남게 하십시오. | | `MALICIOUS_ENABLED` | `true` | `config.py` | 알려진 악성 패키지 표시. 릴리스에 함께 담긴 OSV `MAL-` 권고 스냅샷과 컴포넌트를 대조해 공유 카탈로그에 `flagged` / `clear`를 기록합니다. 전부 오프라인이라 외부 통신이 없습니다. 취약점 축이 아니므로 findings를 만들지 않고 심각도 합계에도 들어가지 않습니다. 끄면 값이 비는데, 화면은 이를 *안전*이 아니라 *확인하지 않음*으로 표시합니다. `false` / `0` / `no`만 끕니다. [컴포넌트·라이선스 → 알려진 악성 패키지](../user-guide/components-and-licenses.md#known-malicious-packages) 참고. | -| `EOL_ENABLED` | `true` | `config.py` | 지원 종료(EOL) 표시: endoflife.date 추적 제품 목록에 맞는 컴포넌트를 공유 카탈로그에 `eol` / `supported` / `unknown`으로 기록합니다. 완전 오프라인 — 판정은 릴리즈에 벤더링된 스냅숏에서 나오며 외부 전송이 없습니다. 정확히 `false` / `0` / `no` 만 끕니다. [컴포넌트·라이선스 → 지원 종료 표시](../user-guide/components-and-licenses.md#end-of-life-flagging) 참고. | -| `EOL_SNAPSHOT_PATH` | *(빈 값 — 벤더 파일)* | `config.py` | endoflife.date 스냅숏 재정의. air-gapped 설치에서는 연결된 호스트에서 더 신선한 스냅숏을 만들어(`python3 scripts/refresh_eol_snapshot.py`) 마운트한 뒤 이 변수로 지정합니다. | +| `EOL_ENABLED` | `true` | `config.py` | 지원 종료(EOL) 표시: endoflife.date 추적 제품 목록에 맞는 컴포넌트를 공유 카탈로그에 `eol` / `supported` / `unknown`으로 기록합니다. 완전 오프라인 — 판정은 릴리스에 포함된 스냅샷에서 나오며 외부 전송이 없습니다. 정확히 `false` / `0` / `no` 만 끕니다. [컴포넌트·라이선스 → 지원 종료 표시](../user-guide/components-and-licenses.md#end-of-life-flagging) 참고. | +| `EOL_SNAPSHOT_PATH` | *(빈 값 — 벤더 파일)* | `config.py` | endoflife.date 스냅샷 재정의. air-gapped 설치에서는 연결된 호스트에서 더 신선한 스냅샷을 만들어(`python3 scripts/refresh_eol_snapshot.py`) 마운트한 뒤 이 변수로 지정합니다. | | `EOL_REFRESH_ENABLED` | `false` | `config.py` | 실시간 수집 opt-in: 주간 beat가 `EOL_FEED_URL_TEMPLATE`에서 신선한 라이프사이클 데이터를 내려받습니다. **기본 꺼짐** — 새로운 외부 전송이기 때문입니다. beat의 로컬 재기록 패스는 이 값과 무관하게 실행됩니다. 정확히 `true` / `1` / `yes` 토큰만 켭니다(fail-closed, SCANOSS 방식). | | `EOL_FEED_URL_TEMPLATE` | `https://endoflife.date/api/{product}.json` | `config.py` | 실시간 수집용 제품별 API 템플릿(`{product}` 치환). 내부 미러를 지정하면 전송이 사내에 머뭅니다. | | `EOL_REFRESH_TIMEOUT_SECONDS` | `15` | `config.py` | 실시간 수집 시 제품 요청당 HTTP 타임아웃. `[1, 120]` 범위이며, 전체 수집은 별도로 60초 wall-clock으로 제한됩니다. | diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/faq.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/faq.md index 2536325..a5114fa 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/faq.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/faq.md @@ -140,7 +140,7 @@ Super Admin(배포 전체), Team Admin(팀 설정·팀원), Developer(스캔 실 ### TRUSCA를 어떻게 업그레이드하나요? {#upgrade} -릴리즈 노트를 읽고, 백업한 뒤 업그레이드를 실행하세요. 마이그레이션은 forward-only로 적용됩니다. [설치 → 업그레이드](../installation/upgrade.md)와 [모범 사례 → 업그레이드 주기](../best-practices/upgrade-cadence.md)를 참고하세요. +릴리스 노트를 읽고, 백업한 뒤 업그레이드를 실행하세요. 마이그레이션은 forward-only로 적용됩니다. [설치 → 업그레이드](../installation/upgrade.md)와 [모범 사례 → 업그레이드 주기](../best-practices/upgrade-cadence.md)를 참고하세요. ### 프로덕션에서 문제가 생겼습니다 — 어디부터 봐야 하나요? {#incident} diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/license-policies.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/license-policies.md index 9004635..d388f1e 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/license-policies.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/reference/license-policies.md @@ -106,7 +106,7 @@ sidebar_position: 5 누르거나, 정책 표의 행을 클릭해 해당 범위를 편집합니다. `super_admin`은 조직 전체 폴백을 위한 **조직 기본값 편집** 버튼도 볼 수 있습니다. 선택한 범위는 URL(`/policies?policy=team:` / `?policy=org:`)에 인코딩되므로 북마크나 - 강력 새로고침 후에도 같은 편집기가 다시 열립니다. + 강력 새로 고침 후에도 같은 편집기가 다시 열립니다. 2. **드로어에서 편집.** 편집기가 오른쪽에서 슬라이드되며 모든 필드를 노출합니다. - **정책 사용** — 마스터 토글. 끄면 정책 내용을 유지한 채 팀이 조직 기본값 또는 정적 카탈로그로 폴백합니다. diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/release-notes/v0.14.0.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/release-notes/v0.14.0.md index a7243d5..8af108f 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/release-notes/v0.14.0.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/release-notes/v0.14.0.md @@ -1,7 +1,7 @@ --- id: v0-14-0 title: v0.14.0 — 런타임 스코프 필터링, EOL 플래깅, iOS 스캔 -description: 소스 스캔이 실제 배포물 기준으로 결과를 내고(런타임 스코프 SBOM 필터링, 기본 켬), 수명 종료(EOL) 컴포넌트를 오프라인 스냅숏으로 표시하며, iOS 트리를 커밋된 lockfile로 스캔합니다. 에러 UX·감사 추적 마감도 포함합니다. +description: 소스 스캔이 실제 배포물 기준으로 결과를 내고(런타임 스코프 SBOM 필터링, 기본 켬), 수명 종료(EOL) 컴포넌트를 오프라인 스냅샷으로 표시하며, iOS 트리를 커밋된 lockfile로 스캔합니다. 에러 UX·감사 추적 마감도 포함합니다. sidebar_label: v0.14.0 sidebar_position: 2 --- @@ -37,9 +37,9 @@ SBOM은 공급자가 선언한 진실입니다. Vue, Next.js, Symfony, Laravel, Spring Framework)에 해당하는 컴포넌트에 수명 주기 판정이 표시됩니다. Components 탭에 EOL 뱃지와 "EOL only" 필터, 드로어에 End-of-life 행, 프로젝트 Overview에 EOL 카운트가 생깁니다. 판정은 릴리스에 -벤더링된 스냅숏에서 나옵니다 — 스캔 시 네트워크 접근이 전혀 없어 에어갭 +저장소에 포함된 스냅샷에서 나옵니다 — 스캔 시 네트워크 접근이 전혀 없어 에어갭 환경에서도 안전합니다. 주간 beat가 카탈로그를 다시 스탬프하고, admin/health에 -endoflife.date 스냅숏 패널(데이터 나이, 표시 건수, 다음 실행)이 추가됩니다. +endoflife.date 스냅샷 패널(데이터 나이, 표시 건수, 다음 실행)이 추가됩니다. ### iOS 트리를 커밋된 lockfile로 스캔 @@ -83,7 +83,7 @@ ErrorBoundary는 EN/KO로 번역됐고 `role="alert"`로 스크린 리더에 알 - **마이그레이션은 컨테이너 기동 시 자동 적용**됩니다(`AUTO_MIGRATE`, 기본값): `0038_component_eol`과 `0039_eol_sync_state`는 forward-only입니다. - EOL 플래깅은 기본 켬이지만 완전 오프라인입니다(`EOL_ENABLED=false`로 끄기, - `EOL_SNAPSHOT_PATH`로 더 새로운 스냅숏 마운트, 라이브 수집은 + `EOL_SNAPSHOT_PATH`로 더 새로운 스냅샷 마운트, 라이브 수집은 `EOL_REFRESH_ENABLED=true` 전까지 꺼짐). `0.14.0` 이미지를 받거나 `0.14.0` 이미지 태그로 `helm upgrade` 하십시오. diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/release-notes/v0.18.0.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/release-notes/v0.18.0.md index 5c3c8ff..712e172 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/release-notes/v0.18.0.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/release-notes/v0.18.0.md @@ -44,7 +44,7 @@ findings가 기한을 넘기면 담당 팀에 프로젝트당 한 번 알립니 기본 80이 커버리지 기준을 조정합니다). 적합성 응답과 패널에 규제 크로스워크가 추가됩니다: 프레임워크별 집계(BSI TR-03183-2, NTIA, EU AI법 부속서 IV, 한국 AI 기본법)로 매핑된 요구사항이 present인지, gap인지, 사람 검토만 가능한지를 -보여줍니다 — 벤더링된 면책 문구가 붙은 문서 준비 보조 수단이지 컴플라이언스 +보여줍니다 — 저장소에 포함된 면책 문구가 붙은 문서 준비 보조 수단이지 컴플라이언스 판정이 아닙니다. 또한 커버리지 검사가 패키지 0개인 SBOM을 더는 실패로 처리하지 않고, 데이터셋(`type: "data"`) 컴포넌트는 PURL 커버리지 같은 패키지 전용 필드에 반영되지 않습니다. 자세한 내용은 @@ -55,7 +55,7 @@ findings가 기한을 넘기면 담당 팀에 프로젝트당 한 번 알립니 EOL 플래그의 형제 격이지만 다른 질문에 답합니다: "이 릴리스 라인이 끝났는가?"가 아니라 "이 버전이 아직 지원되는 릴리스 라인의 최신 패치보다 뒤처졌는가?". -벤더링된 endoflife.date 스냅숏(각 사이클이 자신의 최신 패치를 담습니다)을 +저장소에 포함된 endoflife.date 스냅샷(각 사이클이 자신의 최신 패치를 담습니다)을 재사용하므로 완전 오프라인이며, 스캔 시 새로운 네트워크 접근이 없습니다. Components 탭과 드로어의 컴포넌트에 최신 패치 버전이 담긴 "Outdated" 뱃지(EOL보다 긴급도가 낮은 톤), "Outdated only" 필터(`?outdated=true`), diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/components-and-licenses.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/components-and-licenses.md index 07a862f..2d3e252 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/components-and-licenses.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/components-and-licenses.md @@ -26,8 +26,8 @@ sidebar_position: 3 - **라이선스 (License)** — 컴포넌트에 부여된 라이선스. 의존성의 경우 `cdxgen`이 패키지 메타데이터에서 읽은 **declared** 라이선스입니다. detected·concluded 와의 관계는 [declared vs. detected](#declared-vs-detected) 참고. 빌드 게이트가 사용하는 값입니다. - **Usage** — **Required** / **Optional** / `—`. `cdxgen`이 본 컴포넌트로 가는 *가장 얕은* 경로에서 기록한 의존성 스코프(같은 컴포넌트가 여러 경로로 도달 가능하면 가장 높은 스코프 — `Required` > `Optional` — 가 이김). `—`는 스캐너가 스코프를 emit 하지 않은 경우. Optional 의존성은 Required와 같은 법적 의무를 가지는 경우가 많지만, **Required / Optional** 구분은 라이선스 컴플라이언스 부담에 매핑됩니다 — 사용하지 않는 `Optional` extra는 깊이 박힌 required transitive 의존성보다 제거 비용이 낮습니다. - **악성** — 알려진 악성 패키지이면 빨간 **악성** 배지가 붙고, 아니면 비어 있습니다. 비어 있다고 안전한 것은 아닙니다. [알려진 악성 패키지](#known-malicious-packages)를 참고하십시오. -- **EOL** — 컴포넌트의 릴리즈 사이클이 공표된 지원 종료를 지났으면 **EOL** 배지, 아니면 빈칸. [지원 종료 표시](#end-of-life-flagging) 참고. -- **최신성 (Currency)** — 컴포넌트의 (아직 지원되는) 릴리즈 라인에 더 새로운 패치가 공개돼 있으면 **뒤처짐** 배지, 아니면 빈칸. [버전 최신성](#version-currency) 참고. +- **EOL** — 컴포넌트의 릴리스 사이클이 공표된 지원 종료를 지났으면 **EOL** 배지, 아니면 빈칸. [지원 종료 표시](#end-of-life-flagging) 참고. +- **최신성 (Currency)** — 컴포넌트의 (아직 지원되는) 릴리스 라인에 더 새로운 패치가 공개돼 있으면 **뒤처짐** 배지, 아니면 빈칸. [버전 최신성](#version-currency) 참고. - **심각도 (Severity)** — 본 컴포넌트의 미해결 CVE 중 가장 높은 심각도(범례를 통해 라이선스 분류 색상도 함께 표시). - **CVEs** — 본 컴포넌트의 미해결 취약점 수(클릭 시 사전 필터링된 Vulnerabilities 탭으로 이동). @@ -44,7 +44,7 @@ sidebar_position: 3 - **라이선스 카테고리 (License category)** — 다중 선택(`Allowed` / `Conditional` / `Forbidden` / `Unknown`). - **악성만 (Flagged only)** — 알려진 악성 패키지만 남기는 토글(`?malicious=true`). [알려진 악성 패키지](#known-malicious-packages)를 참고하십시오. - **EOL만 (EOL only)** — 지원 종료된 컴포넌트만 남기는 토글(`?eol=true`). -- **뒤처진 것만 (Outdated only)** — 릴리즈 라인의 최신 패치보다 뒤처진 컴포넌트만 남기는 토글(`?outdated=true`). [버전 최신성](#version-currency) 참고. +- **뒤처진 것만 (Outdated only)** — 릴리스 라인의 최신 패치보다 뒤처진 컴포넌트만 남기는 토글(`?outdated=true`). [버전 최신성](#version-currency) 참고. - **정렬 (Sort)** + **순서 (order)** — 컬럼 기반 정렬과 오름·내림 토글. 필터는 결합됩니다. URL(`?direct=…`, `?dependency_scope=…`, …)이 갱신되어 필터된 뷰를 공유할 수 있습니다. @@ -129,9 +129,9 @@ CVE는 정직한 패키지에 생긴, 고칠 수 있는 결함을 알려 줍니 패치가 없다는 뜻입니다. 오늘의 CVE 수와는 별개의 공급망 리스크라서 스캐너가 따로 표시합니다. 스캔된 모든 컴포넌트를 [endoflife.date](https://endoflife.date) 추적 대상 제품의 선별 목록(Spring Boot, Spring Framework, Express, Next.js, -Angular, Vue, Django, Rails, Symfony, Laravel)과 대조하고, 버전에서 릴리즈 +Angular, Vue, Django, Rails, Symfony, Laravel)과 대조하고, 버전에서 릴리스 사이클을 유도한 뒤(`3.2.0` → 사이클 `3.2`), 해당 사이클의 지원 종료일을 -**릴리즈에 번들된 스냅숏**에서 읽습니다 — 스캔 시 네트워크 호출이 없어 +**릴리스에 번들된 스냅샷**에서 읽습니다 — 스캔 시 네트워크 호출이 없어 air-gapped 환경에서도 동작합니다. 화면 읽는 방법: @@ -141,28 +141,28 @@ air-gapped 환경에서도 동작합니다. - **빈칸과 unknown의 구분** — 빈칸은 **추적 대상 제품이 아니라는** 뜻입니다 (목록은 의도적으로 닫혀 있습니다: 롱테일 라이브러리는 없고, 스캐너는 절대 추정하지 않습니다). 드로어의 지원 종료 행은 한 단계 더 구분합니다: `—`에 - 마우스를 올리면 "추적 대상 아님" 또는 "추적 대상이나 릴리즈 사이클을 + 마우스를 올리면 "추적 대상 아님" 또는 "추적 대상이나 릴리스 사이클을 판정할 수 없음"이 표시됩니다. - **Overview 칩** — 기준 스캔에 EOL 컴포넌트가 있으면 Overview 탭에 개수와 함께 필터된 목록으로 바로 이동하는 링크가 나타납니다. -- 판정은 공유 컴포넌트 카탈로그에 저장되고 새 스냅숏이 도착하면(릴리즈 +- 판정은 공유 컴포넌트 카탈로그에 저장되고 새 스냅샷이 도착하면(릴리스 업그레이드) 재평가되므로, 오래된 프로젝트도 재스캔 없이 새로 공표된 지원 종료일을 반영합니다. `EOL_ENABLED=false`로 끄거나, air-gapped 설치에서는 `EOL_SNAPSHOT_PATH`로 -더 신선한 스냅숏 파일을 지정할 수 있습니다 — +더 신선한 스냅샷 파일을 지정할 수 있습니다 — [환경변수](../reference/env-variables.md) 참고. ### 버전 최신성 — 최신 패치보다 뒤처짐 {#version-currency} [EOL 플래그](#end-of-life-flagging)의 자매 신호이지만 답하는 질문이 -다릅니다. EOL은 *"이 릴리즈 라인이 수명을 다했는가?"*를 묻고, 버전 -최신성은 *"이 버전이 — 아직 지원되는 — 자기 릴리즈 라인의 최신 패치보다 +다릅니다. EOL은 *"이 릴리스 라인이 수명을 다했는가?"*를 묻고, 버전 +최신성은 *"이 버전이 — 아직 지원되는 — 자기 릴리스 라인의 최신 패치보다 뒤처져 있는가?"*를 묻습니다. `3.2` 라인이 멀쩡히 살아 있어도 `3.2.7`보다 패치 세 개 뒤처진 채, 이미 나온 수정들을 조용히 놓치고 있을 수 있습니다. -이 신호는 EOL 플래그와 같은 번들 endoflife.date 스냅숏에서 유도됩니다 -(추적되는 릴리즈 사이클마다 최신 패치 버전이 실려 있음). 그래서 똑같이 +이 신호는 EOL 플래그와 같은 번들 endoflife.date 스냅샷에서 유도됩니다 +(추적되는 릴리스 사이클마다 최신 패치 버전이 실려 있음). 그래서 똑같이 오프라인입니다 — 스캔 시 네트워크 호출이 없어 air-gapped 환경에서도 동작하고, 같은 닫힌 추적 대상 목록이 적용됩니다: 목록 밖의 컴포넌트는 최신성 데이터가 없다고만 표시될 뿐, 절대 추정하지 않습니다. @@ -173,10 +173,10 @@ air-gapped 환경에서도 동작합니다. - **최신성 컬럼/배지** — **뒤처짐** 배지. 의도적으로 EOL보다 한 단계 낮은 톤입니다: 뒤처짐은 위생 신호이지 리스크 판정이 아닙니다. 툴팁에 최신 - 패치 버전이(스냅숏에 기록돼 있으면 공개일도 함께) 표시됩니다. + 패치 버전이(스냅샷에 기록돼 있으면 공개일도 함께) 표시됩니다. - **드로어 행** — 드로어의 **버전 최신성** 행은 네 가지 상태를 구분합니다: - 릴리즈 라인의 최신 패치 사용 중, 최신 패치보다 뒤처짐, 추적 대상이나 - 최신 패치를 판정할 수 없음, 릴리즈 라인 정보 없음. + 릴리스 라인의 최신 패치 사용 중, 최신 패치보다 뒤처짐, 추적 대상이나 + 최신 패치를 판정할 수 없음, 릴리스 라인 정보 없음. - **Overview 칩** — 기준 스캔에 뒤처진 컴포넌트가 있으면 Overview 탭에 "최신 패치보다 뒤처진 컴포넌트 N개" 칩과 함께 사전 필터된 목록으로 바로 이동하는 링크가 나타납니다. @@ -185,7 +185,7 @@ air-gapped 환경에서도 동작합니다. 알아 둘 경계 두 가지: -- 이 신호는 **릴리즈 라인** 기준 최신성입니다 — "*자기* 라인의 최신 패치보다 +- 이 신호는 **릴리스 라인** 기준 최신성입니다 — "*자기* 라인의 최신 패치보다 뒤처짐"이지, "모든 라인을 통틀어 최신 버전보다 뒤처짐"이 아닙니다. 더 새로운 major·minor 라인으로 옮기는 것은 호환성 파괴 가능성이 있는 업그레이드 결정이고, 이 배지는 리스크가 낮은 패치 인상만 가리킵니다. @@ -202,7 +202,7 @@ API 에서는 `GET /v1/projects/{id}/components?outdated=true`가 뒤처진 행 `currency_latest_release_date`가 실립니다. 이 신호는 EOL 파이프라인에 함께 실립니다: `EOL_ENABLED=false`는 두 플래그를 -모두 끄고, air-gapped 설치에서는 `EOL_SNAPSHOT_PATH`로 더 신선한 스냅숏을 +모두 끄고, air-gapped 설치에서는 `EOL_SNAPSHOT_PATH`로 더 신선한 스냅샷을 지정합니다 — [환경변수](../reference/env-variables.md) 참고. ## 표 보기와 그래프 보기 diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/dashboard.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/dashboard.md index fd1818b..dd56b8f 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/dashboard.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/dashboard.md @@ -39,7 +39,7 @@ sidebar_position: 0 6. **License classification (라이선스 분류)** — 네 티어(Permissive / Conditional / Prohibited / Unknown)의 수평 바와 그 아래 티어별 카운트 범례. 7. **Recent scans (최근 스캔)** — 포트폴리오 전체의 가장 최근 스캔 행. 각 행은 프로젝트 상세로 이동합니다. 각 행은 프로젝트 이름, 릴리스 태그(릴리스 스냅샷이 기록된 경우), 스캔 종류(`source` / `container`), 상태 배지, 상대 시간을 포함합니다. -밴드들은 엔드포인트 네 개를 읽습니다 — `/v1/dashboard/action-queue`, `/v1/dashboard/trends`, `/v1/dashboard/portfolio`, `/v1/dashboard/summary`. 모두 서버에서 소속 팀이 닿는 프로젝트로 스코프가 제한됩니다. 첫 응답을 기다리는 동안에는 스켈레톤을 표시하고, 이후 새로고침은 캐시된 응답을 쓰면서 백그라운드로 refetch 합니다. +밴드들은 엔드포인트 네 개를 읽습니다 — `/v1/dashboard/action-queue`, `/v1/dashboard/trends`, `/v1/dashboard/portfolio`, `/v1/dashboard/summary`. 모두 서버에서 소속 팀이 닿는 프로젝트로 스코프가 제한됩니다. 첫 응답을 기다리는 동안에는 스켈레톤을 표시하고, 이후 새로 고침은 캐시된 응답을 쓰면서 백그라운드로 refetch 합니다. ## 전역 검색 (⌘K) diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/inventory.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/inventory.md index a17f644..38edcdb 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/inventory.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/inventory.md @@ -41,7 +41,7 @@ sidebar_position: 4 검색창은 패키지 **이름** 또는 **purl**을 찾으므로 좌표를 그대로 붙여 넣어도 됩니다. 종류 필터로 생태계를 좁힐 수 있고, **필터 추가**를 누르면 위험 축(심각도, 라이선스 분류)과 수명주기 조건(지원 종료만, 구버전만)이 나타납니다. 필요할 때만 꺼내 쓰는 구성입니다. -모든 필터는 URL에 반영되므로 걸러진 화면을 새로고침하거나 북마크하거나 공유해도 그대로 유지됩니다. +모든 필터는 URL에 반영되므로 걸러진 화면을 새로 고침하거나 북마크하거나 공유해도 그대로 유지됩니다. 검색 결과가 없으면 빈 화면에 **전체 스캔 이력에서 찾기**가 나타납니다. 이 화면은 프로젝트별 최근 성공한 스캔만 읽으므로, 몇 릴리스 전에 걷어낸 패키지는 여기 없어도 스캔 이력에는 남아 있습니다. [검색 화면](./search.md)은 이력 전체를 훑으며, 링크를 누르면 입력한 검색어도 함께 넘어갑니다. diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/projects.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/projects.md index 7a8d970..b2e6c03 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/projects.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/projects.md @@ -44,7 +44,7 @@ sidebar_position: 1 ### 프로젝트 찾기 -툴바 검색창은 프로젝트의 **이름**, **슬러그**, **git URL**을 함께 찾습니다. 화면에 보이는 목록만이 아니라 포트폴리오 전체를 서버에서 검색합니다. 세 값 중 어느 것이든 일부만 입력하면 되고, 입력은 디바운스를 거쳐 URL(`?search=`)에 반영되므로 걸러진 목록을 새로고침하거나 링크로 공유해도 그대로 유지됩니다. +툴바 검색창은 프로젝트의 **이름**, **슬러그**, **git URL**을 함께 찾습니다. 화면에 보이는 목록만이 아니라 포트폴리오 전체를 서버에서 검색합니다. 세 값 중 어느 것이든 일부만 입력하면 되고, 입력은 디바운스를 거쳐 URL(`?search=`)에 반영되므로 걸러진 목록을 새로 고침하거나 링크로 공유해도 그대로 유지됩니다. 이 화면은 한 번에 서버 페이지 하나를 보여 줍니다. 조건에 맞는 프로젝트가 한 페이지보다 많으면 목록 위에 몇 건 중 몇 건을 표시했는지 안내가 나옵니다. 검색어를 좁히면 나머지를 확인할 수 있습니다. diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/scans.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/scans.md index 512386f..5ecd3ab 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/scans.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/scans.md @@ -379,7 +379,7 @@ docker-compose -f docker-compose.yml exec worker \ ### "This scan already finished and can no longer be cancelled" -페이지가 로드된 시점과 **Cancel scan**을 클릭한 시점 사이에 스캔이 종단 상태(`succeeded` / `failed` / `cancelled`)에 도달했습니다. 큐를 새로고침하여 최신 상태를 확인하세요 — 별도 조치는 필요 없습니다. +페이지가 로드된 시점과 **Cancel scan**을 클릭한 시점 사이에 스캔이 종단 상태(`succeeded` / `failed` / `cancelled`)에 도달했습니다. 큐를 새로 고침하여 최신 상태를 확인하세요 — 별도 조치는 필요 없습니다. ### 두 번째 스캔이 시작되지 않음 — **Scan** 버튼이 비활성 @@ -387,7 +387,7 @@ docker-compose -f docker-compose.yml exec worker \ ### 완료된 스캔 드로어의 스피너가 멈추지 않음 -이전 빌드(P1 #11 이전)에서는 스캔이 이미 `succeeded`에 도달한 뒤에도 **Finalizing** 단계의 스피너가 계속 도는 회귀가 있었습니다. 수정은 완료된 실행에 대해 드로어를 열 때 종단 상태에서 스피너를 동결합니다. 여전히 증상이 보이면 프로젝트 페이지를 강제 새로고침해 캐시된 스캔 레코드를 갱신하세요. +이전 빌드(P1 #11 이전)에서는 스캔이 이미 `succeeded`에 도달한 뒤에도 **Finalizing** 단계의 스피너가 계속 도는 회귀가 있었습니다. 수정은 완료된 실행에 대해 드로어를 열 때 종단 상태에서 스피너를 동결합니다. 여전히 증상이 보이면 프로젝트 페이지를 강제 새로 고침해 캐시된 스캔 레코드를 갱신하세요. ### detected(first-party) 라이선스가 누락됨 diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/search.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/search.md index a1b3cb9..b57dc91 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/search.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/search.md @@ -33,7 +33,7 @@ sidebar_position: 5 어떤 패싯이 있는지는 탭마다 다릅니다. 취약점은 심각도와 상태, 컴포넌트는 종류, 라이선스는 분류입니다. 탭을 바꾸면 패싯은 해제됩니다. 새 탭이 보여 줄 수 없는 필터를 그대로 끌고 가지 않기 위해서입니다. -검색어·탭·쪽 번호·패싯이 모두 URL에 담기므로 새로고침하거나 북마크하거나 공유해도 그대로 유지됩니다. +검색어·탭·쪽 번호·패싯이 모두 URL에 담기므로 새로 고침하거나 북마크하거나 공유해도 그대로 유지됩니다. ## 검색 저장하기 diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/triage.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/triage.md index 0dcb6d4..ceb31c2 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/triage.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/triage.md @@ -86,7 +86,7 @@ VEX 분류는 조건 1에 직접 반영됩니다. 발견 항목을 제외 상태 1. **Vulnerabilities** 탭에서 열린 Critical CVE를 `Not affected`로 옮깁니다. 상태 배지가 즉시 갱신됩니다(아래 VEX 하네스가 검증하는 것과 같은 전환). 다음 스캔에서 [빌드 차단 게이트](./vulnerabilities.md#심각도-모델)의 Critical CVE 집계가 하나 줄어듭니다. -2. VEX 상태 배지가 페이지 새로고침 없이 새 상태를 반영합니다. +2. VEX 상태 배지가 페이지 새로 고침 없이 새 상태를 반영합니다. 3. 조건부 라이선스 컴포넌트의 승인을 반려한 뒤 다시 스캔합니다. 빌드 게이트 판정은 **바뀌지 않으며** — 승인이 게이트에 도달하지 않음을 확인 — [Approvals](./approvals.md) 큐와 감사 로그는 모두 반려 결정을 기록합니다. diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/vex.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/vex.md index 7be21f0..0144bf0 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/vex.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/vex.md @@ -227,7 +227,7 @@ curl -sS -X POST \ 툴바에는 **VEX로 억제된 항목만** 체크박스가 있습니다. 켜면 현재 페이지에서 상태가 VEX 가져오기로 설정된(`analysis_source = vex_import`) 취약점만 남습니다 — 방금 가져온 문서가 무엇을 바꿨는지 확인할 때 유용합니다. 이 토글은 URL -(`?vex_suppressed=1`)에 반영되어 새로고침해도 유지되고 딥링크로 공유할 수 있습니다. +(`?vex_suppressed=1`)에 반영되어 새로 고침해도 유지되고 딥링크로 공유할 수 있습니다. VEX 가져오기로 설정된 행에는 상태 옆에 작은 **VEX** 배지가 색상이 아닌 레이블과 함께 표시되어 출처를 한눈에 알 수 있습니다. diff --git a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/vulnerabilities.md b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/vulnerabilities.md index a9183bb..7e6c214 100644 --- a/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/vulnerabilities.md +++ b/docs-site/i18n/ko/docusaurus-plugin-content-docs/current/user-guide/vulnerabilities.md @@ -515,7 +515,7 @@ curl -sS \ } ``` -클러스터는 기본적으로 프로젝트의 **가장 최근 성공** 스캔을 기준으로 계산됩니다. `?scan_id=`를 주면 특정 성공 스캔에 고정할 수 있습니다 — 결과 목록과 같은 스냅숏 의미론이라, 이 프로젝트의 성공 스캔이 아닌 id는 `404`를 반환합니다. 성공 스캔이 없는(또는 미해결 결과가 없는) 프로젝트는 빈 `clusters` 목록과 `total_findings: 0`으로 `200`을 반환합니다. 보기 조회에는 결과 목록과 같은 기준인 `developer` 이상이 필요합니다. +클러스터는 기본적으로 프로젝트의 **가장 최근 성공** 스캔을 기준으로 계산됩니다. `?scan_id=`를 주면 특정 성공 스캔에 고정할 수 있습니다 — 결과 목록과 같은 스냅샷 의미론이라, 이 프로젝트의 성공 스캔이 아닌 id는 `404`를 반환합니다. 성공 스캔이 없는(또는 미해결 결과가 없는) 프로젝트는 빈 `clusters` 목록과 `total_findings: 0`으로 `200`을 반환합니다. 보기 조회에는 결과 목록과 같은 기준인 `developer` 이상이 필요합니다. ## 보고서 다운로드 (PDF 또는 Excel) diff --git a/tools/ko-style/patterns.json b/tools/ko-style/patterns.json index a34e766..f302ac1 100644 --- a/tools/ko-style/patterns.json +++ b/tools/ko-style/patterns.json @@ -151,6 +151,56 @@ "example_bad": "금지 라이센스가 발견되면 빌드를 차단합니다.", "example_ok": "금지 라이선스가 발견되면 빌드를 차단합니다." }, + { + "id": "term-release", + "category": "용어 비일관", + "severity": "S1", + "pattern": "릴리즈", + "message": "용어집 정규형이 아닙니다.", + "suggestion": "'릴리즈' → '릴리스' (용어집 표준 표기).", + "example_bad": "지원 종료된 릴리즈에는 수정이 제공되지 않습니다.", + "example_ok": "지원 종료된 릴리스에는 수정이 제공되지 않습니다." + }, + { + "id": "term-snapshot", + "category": "용어 비일관", + "severity": "S1", + "pattern": "스냅숏", + "message": "용어집 정규형이 아닙니다.", + "suggestion": "'스냅숏' → '스냅샷' (용어집 표준 표기).", + "example_bad": "스냅숏이 30일 지났습니다.", + "example_ok": "스냅샷이 30일 지났습니다." + }, + { + "id": "term-repository", + "category": "용어 비일관", + "severity": "S1", + "pattern": "리포지토리|레포지토리", + "message": "용어집 정규형이 아닙니다.", + "suggestion": "'저장소'로 통일하세요 (용어집 표준 표기).", + "example_bad": "리포지토리 URL을 입력하세요.", + "example_ok": "저장소 URL을 입력하세요." + }, + { + "id": "term-refresh-spacing", + "category": "용어 비일관", + "severity": "S1", + "pattern": "새로고침", + "message": "'새로 고침'은 띄어 씁니다.", + "suggestion": "명사는 '새로 고침', 동사는 '새로 고치다'로 쓰세요.", + "example_bad": "페이지를 새로고침해 주세요.", + "example_ok": "페이지를 새로 고쳐 주세요." + }, + { + "id": "term-vendoring", + "category": "용어 비일관", + "severity": "S1", + "pattern": "벤더링|벤더된|벤더링됨", + "message": "'vendoring'을 음차한 표현입니다.", + "suggestion": "'저장소에 포함'으로 풀어 쓰세요. 코드·커밋 메시지의 영어 vendored는 그대로 둡니다.", + "example_bad": "이 스냅샷은 릴리스에 벤더링됩니다.", + "example_ok": "이 스냅샷은 릴리스에 포함해 배포합니다." + }, { "id": "term-component-misspell", "category": "용어 비일관",