{requestError && (
@@ -365,6 +391,10 @@ export function DocumentOcrPanel({ documentId, documentType, fileId }: DocumentO
{editable && REVIEWABLE_STATUSES.includes(run.status) ? (
@@ -372,13 +402,20 @@ export function DocumentOcrPanel({ documentId, documentType, fileId }: DocumentO
}
/>
) : (
-
+
)}
{editable &&
REVIEWABLE_STATUSES.includes(run.status) &&
originalValue &&
draftValue !== originalValue && (
- OCR 추출값 · {originalValue}
+
+ OCR 추출값 ·{' '}
+ {sensitiveValuesVisible
+ ? originalValue
+ : maskSensitiveValue(field, originalValue)}
+
)}
)
diff --git a/src/pages/LegalPolicyPage/LegalPolicyPage.test.tsx b/src/pages/LegalPolicyPage/LegalPolicyPage.test.tsx
index 37a9ac9..b5901b7 100644
--- a/src/pages/LegalPolicyPage/LegalPolicyPage.test.tsx
+++ b/src/pages/LegalPolicyPage/LegalPolicyPage.test.tsx
@@ -15,6 +15,11 @@ beforeEach(() => {
require_letter: true,
require_digit: true,
},
+ account_protection: {
+ max_failed_attempts: 5,
+ lock_duration_seconds: 900,
+ password_max_age_days: 180,
+ },
agreements: {
service_terms: { version: '2.0', required: true, content_path: '/legal/terms' },
privacy_policy: {
diff --git a/src/pages/LegalPolicyPage/LegalPolicyPage.tsx b/src/pages/LegalPolicyPage/LegalPolicyPage.tsx
index fdf2f1e..fb848e7 100644
--- a/src/pages/LegalPolicyPage/LegalPolicyPage.tsx
+++ b/src/pages/LegalPolicyPage/LegalPolicyPage.tsx
@@ -122,6 +122,7 @@ const POLICY_DOCUMENTS: Record = {
paragraphs: [
'계정 인증, 사업장 업무 공간 제공, 기한 감지, 문서 초안 작성, 근로자 안내와 응답 연결, 장애 조사와 감사 이력 확인을 위해 정보를 사용합니다.',
],
+ note: '필수정보 수집을 거부할 수 있으나, 거부 시 계정 생성과 업무 공간 제공이 제한됩니다.',
},
{
title: '4. 최소 수집과 화면 표시',
@@ -143,7 +144,7 @@ const POLICY_DOCUMENTS: Record = {
title: '6. OCR·번역·알림 처리',
paragraphs: [
'OCR, 번역, 문자 알림 등 외부 처리 기능에는 해당 작업에 필요한 정보만 전달하는 것을 원칙으로 합니다.',
- '실제 민감정보를 외부 제공자에게 전송하기 전에는 제공 항목, 처리 위치, 보관 조건과 사업장 정책을 별도로 확인해야 합니다.',
+ '프로젝트에서 활성화한 제공자는 NAVER Cloud CLOVA OCR과 문자 발송 제공자이며, 제공자·처리 항목·보관 조건이 변경되면 시행 전에 별도로 알립니다.',
],
},
{
@@ -156,7 +157,8 @@ const POLICY_DOCUMENTS: Record = {
{
title: '8. 보관과 삭제',
paragraphs: [
- '정보는 프로젝트 운영과 서비스 검증에 필요한 기간 동안 보관합니다. 계정 또는 업무 종료 후의 구체적인 보관기간과 파기 절차는 정식 서비스 전환 시 확정합니다.',
+ '계정과 사업장 정보는 회원 탈퇴 또는 프로젝트 종료 시까지, 업로드 문서는 기본 365일, 비식별 AI 품질 로그는 90일 동안 보관합니다. 법령상 보존 의무나 분쟁 대응이 필요한 경우에는 해당 기간 동안 분리 보관합니다.',
+ '보관기간이 끝난 전자 파일은 복구하기 어려운 방식으로 삭제하고, 백업 데이터는 백업 주기가 만료되는 순서대로 삭제합니다.',
'삭제 요청이 접수되면 관련 법령 또는 분쟁 대응을 위해 보관해야 하는 범위를 제외하고 처리 상태를 확인합니다.',
],
},
@@ -165,6 +167,7 @@ const POLICY_DOCUMENTS: Record = {
paragraphs: [
'사용자는 자신의 계정 정보 확인과 정정을 요청할 수 있으며, 선택 동의는 철회할 수 있습니다.',
'근로자 정보의 열람·정정·삭제 요청은 해당 정보를 등록한 사업장 담당자를 통해 처리하는 것을 원칙으로 합니다.',
+ '권리 요청은 서비스 내 담당자 문의 또는 FOWOCO 프로젝트 문의 채널로 접수하며, 본인 또는 정당한 대리인 여부를 확인한 뒤 처리합니다.',
],
},
{
diff --git a/src/pages/SignupPage/SignupPage.test.tsx b/src/pages/SignupPage/SignupPage.test.tsx
index 4558370..0de684e 100644
--- a/src/pages/SignupPage/SignupPage.test.tsx
+++ b/src/pages/SignupPage/SignupPage.test.tsx
@@ -44,6 +44,11 @@ function signupPolicyResponse(
require_letter: true,
require_digit: true,
},
+ account_protection: {
+ max_failed_attempts: 5,
+ lock_duration_seconds: 900,
+ password_max_age_days: 180,
+ },
agreements: {
service_terms: {
version: serviceTermsVersion,
@@ -101,6 +106,9 @@ describe('SignupPage', () => {
renderPage()
await waitFor(() => expect(screen.getByRole('button', { name: '계정 만들기' })).toBeEnabled())
+ expect(
+ screen.getByText('계정 보호 · 로그인 5회 실패 시 15분 잠금 · 비밀번호 180일 사용'),
+ ).toBeInTheDocument()
await user.type(screen.getByLabelText('이름'), '김경민')
await user.type(screen.getByLabelText('업무용 이메일'), 'mini@naver.com')
diff --git a/src/pages/SignupPage/SignupPage.tsx b/src/pages/SignupPage/SignupPage.tsx
index 07d7bde..e8249b2 100644
--- a/src/pages/SignupPage/SignupPage.tsx
+++ b/src/pages/SignupPage/SignupPage.tsx
@@ -66,6 +66,7 @@ export function SignupPage() {
const [policyError, setPolicyError] = useState(null)
const passwordStrength = getPasswordStrength(password)
+ const accountProtection = signupPolicy?.account_protection
const loadSignupPolicy = useCallback(async () => {
setPolicyLoading(true)
@@ -299,6 +300,13 @@ export function SignupPage() {
{fieldErrors.password ??
`영문과 숫자를 포함해 ${signupPolicy?.password_policy.min_length ?? 8}자 이상 입력해 주세요.`}