Files
Gnuboard7/plugins/_bundled/sirsoft-gdpr/resources/lang/ko.json
T
chym1217 2a036704f4 fix(sirsoft-gdpr): 쿠키 동의 보안 결함 3건 수정 + 하위호환 고지
이슈 체크리스트와는 별개로, 처리 완료 후 지시로 진행한
sirsoft-gdpr 플러그인 전수 비판적 검토에서 발견한 보안·결함 3건을
수정한다.

- Admin 설정 저장 API 의 검증 우회 fallback(빈 요청 시 $request->all
 사용) 제거. UpdateAdminSettingsRequest 필드가 모두 nullable 이라
 검증을 거치지 않은 임의 키가 저장 로직까지 전달될 수 있었다.
- 게스트 세션 식별 쿠키(gdpr_session) 에 HMAC-SHA256 서명 적용.
 api 미들웨어 그룹에는 EncryptCookies 가 없어 쿠키가 평문으로 오가
 임의 UUID로 타인의 게스트 동의 상태를 조회/철회할 수 있었다.
 결제 플러그인들의 IssuesReceiptCookie 트레이트와 동일 컨벤션 채택.
 이 조치로 배포 이전 발급된 비회원 쿠키는 1회 초기화되며 이미
 배너를 닫았던 비회원은 다음 방문 시 배너를 다시 보게 된다(회원
 동의 이력은 영향 없음) — CHANGELOG 에 고지.
- 게스트로 쿠키 배너를 닫은 뒤 동의 이력 없는 다른 계정으로 로그인해도
 배너가 계속 숨겨져 있던 결함 수정. _global.gdprBannerDismissedFor 가
 "닫힘 여부"(boolean) 대신 "누가 닫았는지"(사용자 식별자)를 저장하도록
 변경해, 로그인으로 사용자가 바뀌면 다시 노출되게 한다. 실제 로그인
 폼 제출을 거쳐 재현하는 E2E spec 신규 작성(PlaywrightSeedGdprGuestLogin
 시드 커맨드 포함, sirsoft-page 의 PlaywrightSeedPage 패턴 재사용).

부수: 자동 차단 정책 안내에 보호 범위 한계 고지 추가, GDPR 플러그인
번들 로딩 우선순위 상향(다른 확장의 스크립트로부터 보호 범위 확대).
2026-07-30 10:50:49 +09:00

323 lines
20 KiB
JSON

{
"editor": {
"data_source": {
"gdprConsentLog": "동의 로그",
"gdprMeConsents": "내 동의 내역",
"gdprMyConsent": "내 동의",
"gdprMyConsents": "내 동의 내역",
"gdprPolicyVersionCurrent": "현재 정책 버전",
"gdprPolicyVersionHistory": "정책 버전 이력",
"gdprPolicyVersionSnapshot": "정책 버전 스냅샷",
"gdprPublicSettings": "GDPR 공개 설정",
"gdprSettings": "GDPR 설정"
}
},
"consent": {
"granted": "동의가 저장되었습니다.",
"granted_again": "동의가 갱신되었습니다.",
"rejected_saved": "동의하지 않고 계속합니다. 선택 항목은 사용되지 않습니다.",
"revoked": "동의가 철회되었습니다.",
"renew_all_success": "활성 항목 {renewed} 개를 새 정책 버전으로 갱신했습니다.",
"granting": "동의 중...",
"revoking": "철회 중...",
"renewing": "갱신 중...",
"already_same_state": "이미 동일한 상태입니다.",
"required_cannot_revoke": "필수 항목은 철회할 수 없습니다.",
"invalid_key": "유효하지 않은 동의 항목입니다.",
"category_cookie_necessary": "필수 쿠키",
"category_cookie_functional": "기능 쿠키",
"category_cookie_analytics": "분석 쿠키",
"category_cookie_marketing": "마케팅 쿠키"
},
"blocked_domains": {
"invalid_format": "올바른 도메인 형식이 아닙니다. (FQDN 만 지원, *.example.com 와일드카드 가능)",
"invalid_format_functional": "기능 카테고리 — 올바른 도메인 형식이 아닙니다. (FQDN 만 지원, *.example.com 와일드카드 가능)",
"invalid_format_analytics": "분석 카테고리 — 올바른 도메인 형식이 아닙니다. (FQDN 만 지원, *.example.com 와일드카드 가능)",
"invalid_format_marketing": "마케팅 카테고리 — 올바른 도메인 형식이 아닙니다. (FQDN 만 지원, *.example.com 와일드카드 가능)",
"too_long": "도메인은 253자를 초과할 수 없습니다.",
"too_long_functional": "기능 카테고리 — 도메인은 253자를 초과할 수 없습니다.",
"too_long_analytics": "분석 카테고리 — 도메인은 253자를 초과할 수 없습니다.",
"too_long_marketing": "마케팅 카테고리 — 도메인은 253자를 초과할 수 없습니다.",
"must_be_array": "카테고리별 도메인 목록은 배열이어야 합니다."
},
"settings": {
"saved": "설정이 저장되었습니다.",
"title": "GDPR 설정",
"description": "쿠키 동의 배너와 마이페이지 동의 관리 카드의 동작을 운영자가 제어합니다.",
"section": {
"operator": "운영 주체 \/ 개인정보처리방침",
"operator_desc": "쿠키 배너·정책 페이지에 표시될 운영 주체, 데이터 저장 위치, 정책 페이지 슬러그를 등록합니다.",
"cookie_banner": "쿠키 동의 배너",
"cookie_banner_desc": "방문자에게 표시되는 쿠키 동의 배너의 노출\/위치\/카테고리\/정책 버전을 한 곳에서 설정합니다.",
"cookie_banner_settings": "배너 표시 설정",
"cookie_categories": "쿠키 카테고리",
"cookie_policy_version": "쿠키 정책 버전",
"auto_blocking": "자동 차단 정책",
"auto_blocking_desc": "쿠키 배너가 노출되면 카테고리별 도메인 목록의 외부 추적 리소스가 사용자 동의 전까지 자동 차단됩니다."
},
"nav": {
"operator": "운영 정보",
"cookie_banner": "쿠키 배너",
"auto_blocking_policy": "자동 차단 정책"
},
"status": {
"enabled": "활성",
"disabled": "비활성",
"visible": "노출",
"hidden": "숨김"
},
"fields": {
"cookie_policy_version": {
"label": "정책 버전",
"hint": "정책 본문, 카테고리 의미, 위탁자·데이터 보관 정보가 바뀌면 「+ 새 버전 발행」을 누르세요. 발행 즉시 모든 회원이 다음 방문 시 재동의를 진행합니다."
},
"privacy_policy_slug": {
"label": "개인정보처리방침 페이지 슬러그",
"hint": "페이지 플러그인에 등록된 처리방침 페이지의 슬러그. 비어 있으면 쿠키 배너의 정책 링크가 표시되지 않습니다.",
"placeholder": "예: privacy-policy"
},
"legal_entity_name": {
"label": "법인명 \/ 운영 주체",
"hint": "쿠키 배너와 마이페이지에 표시되는 사이트 운영 주체 이름입니다.",
"placeholder": "예: (주)회사명"
},
"data_storage_location": {
"label": "데이터 저장 위치",
"hint": "사용자에게 안내할 데이터 저장 국가를 입력하세요. 예: \"대한민국\", \"미국 (AWS)\". IP 주소, 클라우드 리전 코드(예: ap-northeast-2), 데이터센터 주소는 보안상 입력하지 마세요.",
"placeholder": "예: 대한민국 (자체 데이터센터) \/ 미국 (AWS)"
},
"banner_enabled": {
"label": "쿠키 배너 노출",
"hint": "활성 시 쿠키 배너 노출과 동의 전 외부 추적 자동 차단이 함께 시작됩니다. 마이페이지 동의 관리 카드는 이 토글과 무관하게 동의/철회 이력이 있는 회원에게 항상 노출됩니다."
},
"banner_position": {
"label": "배너 위치",
"hint": "쿠키 배너가 화면에 표시되는 위치를 선택합니다.",
"option_bottom_bar": "하단 (전체 폭)",
"option_bottom_left_popup": "좌하단 팝업",
"option_bottom_right_popup": "우하단 팝업",
"option_centered_modal": "중앙 모달"
},
"blocked_domains": {
"warnings_title": "안내",
"auto_blocking_off_hint": "자동 차단은 쿠키 배너 노출이 ON 일 때만 작동합니다. 「쿠키 배너」 카드에서 쿠키 배너 노출 토글을 먼저 켜세요.",
"warning_visual_break": "외부 폰트·스타일시트는 분류에 주의하세요. 잘못 차단하면 페이지가 조용히 깨질 수 있습니다.",
"warning_policy_bump": "차단 도메인을 변경한 후 쿠키 정책 버전을 올리세요. 기존 동의자가 새 도메인에도 동의한 것으로 처리되는 문제를 막습니다.",
"warning_domain_format": "도메인 형식: example.com, *.example.com (와일드카드) 가능. localhost 처럼 점이 없는 이름이나 한글 도메인은 지원하지 않습니다.",
"warning_scope_limit": "이 자동 차단은 플러그인·모듈이 등록하는 스크립트만 대상입니다. 「템플릿 외부 스크립트」 등 운영자가 직접 head 영역에 삽입한 외부 스크립트는 이 자동 차단의 보호 범위 밖이므로, 별도로 로드 조건을 확인하세요.",
"tag_input_placeholder": "도메인 입력 후 Enter (예: google-analytics.com, *.hotjar.com)",
"tag_no_options": "추천 도메인이 없습니다. 직접 입력하세요.",
"category": {
"functional": "기능 카테고리 차단 도메인",
"analytics": "분석 카테고리 차단 도메인",
"marketing": "마케팅 카테고리 차단 도메인"
}
},
"cookie_categories": {
"description": "쿠키 카테고리 4종의 용도와 차단 도구 예시는 각 카드의 [정보 펼치기] 에서 확인할 수 있습니다.",
"category_required_badge": "필수",
"category_optional_badge": "선택",
"info": {
"expand": "정보 펼치기",
"collapse": "정보 접기",
"description_label": "사용자 안내 문구",
"scope_label": "자동 차단 대상",
"tools_label": "대표 도구 예시",
"necessary": {
"scope": "자동 차단하지 않습니다. 세션·로그인 토큰, 장바구니 식별자, 사용자가 가입 시 선택한 언어 설정, 쿠키 동의 기록 등 사이트 동작에 꼭 필요한 항목은 항상 허용됩니다.",
"tools": "세션 ID, 인증 토큰, CSRF 토큰, 장바구니 식별자, 다국어 설정 등 (별도 설정 불필요)"
},
"functional": {
"scope": "「자동 차단 정책」 탭의 기능 카테고리 도메인 목록에 등록된 외부 리소스가 동의 전까지 자동 차단됩니다. 또한 다크모드·통화 선호 같은 사용자 편의 저장도 동의 후에만 보관됩니다.",
"tools": "고객지원 챗봇 (Crisp, Intercom, Tawk.to), 다국어 자동 번역 위젯, 사용자 설정 동기화 서비스 등"
},
"analytics": {
"scope": "「자동 차단 정책」 탭의 분석 카테고리 도메인 목록에 등록된 외부 분석 스크립트·임베드·트래킹 픽셀이 동의 전까지 자동 차단됩니다. 동의하면 즉시 복원되어 작동합니다.",
"tools": "Google Analytics 4 (GA4), Hotjar, Microsoft Clarity, Mixpanel, Matomo, 네이버 프리미엄 로그분석 등"
},
"marketing": {
"scope": "「자동 차단 정책」 탭의 마케팅 카테고리 도메인 목록에 등록된 외부 광고·임베드·트래킹 픽셀이 동의 전까지 자동 차단됩니다. 동의하면 즉시 복원되어 작동합니다.",
"tools": "Meta Pixel (Facebook), Google Ads 리마케팅, 카카오 픽셀, YouTube 영상 임베드 등"
}
}
}
},
"save_success": "설정이 저장되었습니다.",
"save_error": "설정 저장 중 오류가 발생했습니다.",
"validation_error": "입력 값을 확인해주세요.",
"unsaved_changes": "저장되지 않은 변경사항이 있습니다.",
"policy_version": {
"current_label": "현재 버전",
"published_at_label": "발행 일시",
"publisher_label": "발행자",
"publisher_system": "시스템",
"memo_label": "변경 사유",
"publish_button": "새 버전 발행",
"history_toggle_show": "이력 보기",
"history_toggle_hide": "이력 닫기",
"history_empty": "발행된 정책 버전이 없습니다.",
"publish_success": "새 정책 버전이 발행되었습니다. 모든 회원이 다음 방문 시 재동의를 진행합니다.",
"publishing": "발행 중...",
"guide_title": "언제 새 버전을 발행하나요?",
"guide_body": "차단 도메인 변경, UI 문구 수정 같은 운영상 변경은 새 버전 발행이 필요하지 않습니다.",
"change_type": {
"material": "재동의 트리거",
"non_material": "단순 변경",
"initial": "초기 발행"
},
"history": {
"col": {
"version": "버전",
"created_at": "발행 일시",
"publisher": "발행자",
"change_type": "종류",
"memo": "사유",
"snapshot_action": "본문"
}
},
"snapshot_view_short": "보기",
"material_modal": {
"title": "새 정책 버전 발행 + 재동의 트리거",
"body": "「새 버전 발행」 을 누르면 즉시 발행되며, 모든 사용자가 다음 방문 시 재동의해야 합니다.",
"effect_bump": "정책 버전 단조 증가 (예: v2 → v3)",
"effect_reconsent": "모든 회원이 다음 방문 시 재동의 화면을 보게 됩니다",
"effect_history": "이력 표에 새 버전 row 가 추가됩니다",
"memo_label": "변경 사유 (필수)",
"memo_placeholder": "예: 약관 페이지 본문 수정 / 위탁 운영자 변경",
"confirm": "새 버전 발행"
},
"snapshot_modal": {
"editor_label": "정책 버전 본문 보기",
"title": "정책 버전 v{version} 본문",
"description": "발행 시점 settings 의 카테고리 목록·정책 본문 슬러그·차단 도메인 등 전체 본문입니다. DPO 가 동의 분쟁 시 입증 자료로 활용합니다.",
"section_categories": "쿠키 카테고리",
"section_privacy_policy": "정책 본문 슬러그",
"section_blocked_domains": "차단 도메인 카탈로그",
"category_required_badge": "필수",
"no_categories": "등록된 카테고리가 없습니다.",
"no_blocked_domains": "등록된 차단 도메인이 없습니다.",
"view_button": "v{version} 본문 보기",
"close": "닫기",
"open_policy_page": "본문 페이지 열기",
"no_policy_slug": "등록된 정책 본문 페이지가 없습니다."
},
"not_found": "해당 정책 버전을 찾을 수 없습니다."
}
},
"admin": {
"consent_log": {
"title": "GDPR 동의 이력",
"description": "회원·게스트의 동의\/철회 변경 이력을 조회합니다. IP·User-Agent 등 감사 정보가 함께 노출됩니다.",
"refresh": "새로고침",
"empty": "조회된 동의 이력이 없습니다.",
"clear_filters": "필터 초기화",
"guest_label": "게스트",
"view_member_tooltip": "회원 상세 페이지로 이동",
"search_placeholder": "이메일 또는 세션 ID 로 검색",
"search_button": "검색",
"search_type": {
"email": "이메일",
"session_id": "세션 ID"
},
"filter": {
"consent_key_label": "동의 항목",
"action_label": "액션",
"source_label": "출처",
"option_all": "전체"
},
"action": {
"granted": "동의",
"revoked": "철회",
"rejected": "거부"
},
"source": {
"banner": "배너",
"preference_center": "환경설정",
"mypage": "마이페이지"
},
"col": {
"created_at": "시점",
"subject": "주체",
"consent_key": "동의 항목",
"action": "액션",
"source": "출처",
"policy_version": "정책 버전",
"ip": "IP"
},
"detail": {
"session_id_label": "세션 ID",
"user_agent_label": "User-Agent",
"categories_label": "카테고리 스냅샷",
"categories_hint": "동의 시점에 회원이 카테고리별로 표시한 의사입니다. 정책 본문이 갱신되어도 이 기록은 불변으로 보존됩니다.",
"snapshot_granted": "동의",
"snapshot_revoked": "미동의"
}
}
},
"mypage": {
"privacy": {
"title": "쿠키 동의 관리",
"description": "사이트가 사용 중인 쿠키 항목에 대한 동의를 변경하거나 철회할 수 있습니다.",
"section_consents": "내 동의 현황",
"section_consents_hint": "동의\/철회 시점에 따라 즉시 반영됩니다. 필수 항목은 철회할 수 없습니다.",
"col_consent_key": "동의 항목",
"col_consented": "상태",
"col_consented_at": "동의일",
"col_revoked_at": "철회일",
"col_policy_version": "정책 버전",
"col_action": "작업",
"consented": "동의",
"revoked": "철회",
"rejected_label": "거부",
"revoke": "철회",
"grant": "동의",
"grant_again": "다시 동의",
"label_suffix": "{label} 쿠키",
"locked_label": "필수",
"enable_all": "모두 동의",
"enable_all_hint": "동의하지 않은 선택 항목이 있습니다. 한 번에 모두 동의할 수 있습니다.",
"enable_all_success": "선택 항목에 모두 동의했습니다.",
"required_label": "필수",
"required_hint": "서비스 제공에 필수적이라 철회할 수 없습니다.",
"grant_confirm_title": "쿠키 동의 확인",
"grant_confirm_message": "이 쿠키에 동의하시겠습니까? 동의하면 해당 카테고리의 쿠키가 사용되며, 언제든 다시 철회할 수 있습니다.",
"revoke_confirm_title": "동의 철회 확인",
"revoke_confirm_message": "이 항목을 철회하시겠습니까? 동의를 철회하면 해당 카테고리 관련 기능이 제한될 수 있습니다.",
"revoke_target_consented_at": "동의 · {date}",
"no_consents": "활성 동의 항목이 없습니다.",
"needs_renewal": "쿠키 정책이 변경되었습니다. 동의를 갱신해주세요.",
"needs_renewal_with_version": "쿠키 정책이 버전 {version} 으로 변경되었습니다. 선택 항목의 동의를 다시 확인해주세요.",
"needs_renewal_hint": "필수 쿠키는 사이트 운영에 꼭 필요한 항목이므로 정책 변경과 무관하게 항상 적용됩니다.",
"btn_renew_all": "현재 동의 갱신",
"btn_renew_this_item": "정책 갱신",
"renew_all_success": "활성 항목 {renewed} 개를 새 정책 버전으로 갱신했습니다.",
"operator_and_storage_meta": "본 사이트는 {entity}이(가) 운영하며, 데이터는 {location}에 저장됩니다",
"operator_only_meta": "본 사이트는 {entity}이(가) 운영합니다",
"storage_only_meta": "사용자 데이터는 {location}에 저장됩니다"
}
},
"common": {
"loading": "불러오는 중...",
"refresh": "새로고침"
},
"banner": {
"re_appear_reason": "쿠키 정책이 버전 {version} 로 변경되어 동의를 다시 확인합니다.",
"consent_required_hint": "거부한 항목과 관련된 기능이 제한될 수 있습니다.",
"btn_renew_consent": "현재 동의 갱신",
"title": "쿠키 사용 안내",
"description": "본 사이트는 사용자 경험 개선과 분석을 위해 쿠키를 사용합니다. 항목별로 동의 여부를 선택할 수 있습니다.",
"accept_all": "모두 동의",
"reject_continue": "동의하지 않고 계속하기",
"preferences": "선택 동의",
"save": "선택 저장",
"policy_link": "개인정보처리방침",
"preferences_title": "쿠키 환경설정",
"preferences_description": "카테고리별 쿠키 사용을 개별 동의\/철회할 수 있습니다. 필수 카테고리는 끌 수 없습니다.",
"category_required_badge": "필수",
"view_policy_label": "변경된 정책 본문 보기",
"operator_and_storage_line": "본 사이트는 {entity}이(가) 운영하며, 데이터는 {location}에 저장됩니다",
"operator_only_line": "본 사이트는 {entity}이(가) 운영합니다",
"storage_only_line": "사용자 데이터는 {location}에 저장됩니다"
}
}